RIIGHT ZeroMQ拓扑

时间:2012-06-24 16:19:40

标签: zeromq

我需要编写一个订单管理器,将客户(股票,外汇,无论什么)订单路由到正确的交易所。客户希望发送订单,但对FIX或其他专有协议一无所知,只是发送订单的内部(标准化)格式。我有应用程序(服务器),每个应用程序通过FIX /二进制/ etc连接连接到每个FIX / etc提供程序。我希望客户端和服务器之间的代理程序采用规范化的顺序,并将其转换为给定FIX / etc提供程序的正确格式,并从服务器获取消息并将其转换回客户端的规范化格式。客户端可以指定路由,但是由客户端和服务器之间的代理程序决定是否在客户端和服务器之间来回传递有关该命令的消息。因此,不知何故,服务器的输出[填充,部分填充,错误等]必须路由回正确的客户端。

我研究过ZMQ拓扑,REQ-> ROUTER-> DEALER不起作用[代码工作 - 我的意思是它是错误的拓扑]因为服务器不相同。

//This topology doesn't work because the servers are not identical
#include "zhelpers.hpp"

int main (int argc, char *argv[])
{
    // Prepare our context and sockets
    zmq::context_t context(1);
    zmq::socket_t frontend (context, ZMQ_ROUTER);
    zmq::socket_t backend (context, ZMQ_DEALER); // ZMQ_ROUTER here? Can't get it to work

    frontend.bind("tcp://*:5559");
    backend.bind("tcp://*:5560");

    // Start built-in device
    zmq::device (ZMQ_QUEUE, frontend, backend);


    return 0;
}

我认为也许ROUTER-> ROUTER拓扑是正确的,但我无法让代码工作 - 客户端发送订单但从未得到回复,所以我一定做错了。我认为使用ZMQ_IDENTITY是正确的做法,但不仅我不能让它工作,但似乎ZMQ正在远离ZMQ_IDENTITY?

有人可以给出一个简单的三个ZMQ程序示例[不在单独的线程中,三个单独的进程],以显示正确的方法吗?

2 个答案:

答案 0 :(得分:3)

查看指南中的MajorDomo示例:http://zguide.zeromq.org/page:all#toc71

每个交易所都使用一个工作池。

答案 1 :(得分:2)

回应:

  

ROUTER-> ROUTER拓扑结构是正确的,但我无法让代码工作

我的理解是ZMQ套接字进入Pairs以启用某种模式。

  1. PAIR
  2. REQ / REP
  3. PUB / SUB
  4. 推/拉
  5. 只有PAIR套接字类型可以与PAIR类型的另一个套接字通信,其行为类似于普通套接字。

    对于所有其他套接字类型,有一个免费的套接字类型用于通信。例如,REQ套接字类型只能与REP套接字类型通信。 REQ套接字类型无法与REQ套接字类型通信。

    我的理解是,在ROUTER / DEALER中,ROUTER可以与经销商联系,但ROUTER无法与ROUTER插座类型通信。

    我的理解可能是错的,但从例子来看,这是我迄今所理解的。