我正在尝试ZeroMQ,我想创建一个服务器:
REQ-管道-REPLY
我希望按顺序接收数据查询请求,将其推送到inproc管道以并行化数据查询,然后接收器将数据合并回来。在接收器将数据合并在一起之后,接收器将合并的数据作为回复发送回请求。
这可能吗?怎么样?我不确定推/拉是否会保留REP套接字的客户端地址以便发回。
答案 0 :(得分:1)
假设每个客户端在任何时候只有一个请求。
这可能吗?
是的,但使用不同的套接字类型。
它看起来怎么样?
(在C中)
您可能想要做的是从外部服务器套接字上的ZMQ_REP套接字切换到ZMQ_ROUTER套接字。路由器/经销商套接字具有标识,允许您在管道中拥有多个请求,并且仍然可以正确响应每个请求。
异步客户端/服务器模式: http://zguide.zeromq.org/php:chapter3#The-Asynchronous-Client-Server-Pattern
唯一的缺点是您需要管理ZMQ消息的多个部分。第一部分是身份。第二个是空的。第三是数据。只要您按照与REQUEST相同的顺序进行REPLY,身份就会将您的响应数据引导到正确的客户端。我将请求包装在一个结构中:
struct msg {
zmq_msg * identity;
zmq_msg * nullMsg;
zmq_msg * data;
};
确保在接收消息时使用zmq_msg_more,并在正确发送时设置更多标记。
我不确定推/拉是否会保留客户端的地址 REP socket要发回。
你是对的。推拉模式不允许指定多个客户端之间的返回地址。