如何在ZeroMQ中进行扇出?从一组主题转发到多个客户端

时间:2017-10-23 09:15:23

标签: python zeromq

我需要实现一个服务器,它通过控制通道(req-rep)接收指定一组主题的请求,然后作为响应发送一个指向将为该特定客户端打开的发布者套接字的URL 拒绝消息(由于权限不足)。

我设法实现了一个当时只能处理一个客户端的版本(有两个无限循环),但我不知道用哪个模式同时处理多个客户端。

对我来说,不同客户的插座是分开的,这一点非常重要。

以下是简化代码:

INSERT

1 个答案:

答案 0 :(得分:1)

执行此操作的正确方法是使用线程。

您的主程序或线程将处理控制通道循环。一旦出现连接,您将创建上游和下游套接字,但处理线程中的实际传输。我不确定下面的代码是否有效,因为我没有可以使用它的客户端,但是试一试,看看会发生什么。不过你会得到这个想法。

from threading import Thread
....
....
class ClientManager(Thread):
    def __init__(self, ups, downs):
        super(ClientManager, self).__init__(self)
        self.upstream_socket = ups
        self.downstream_socket = downs

    def run(self):
        while True:
            _parts = self.upstream_socket.recv_multipart()
            self.downstream_socket.send_multipart(_parts)

if __name__ == '__main__':
    print("Binding control channel socket on {}".format('tcp://*:{}'.format(control_channel_port)))
    control_channel = bind_control_channel()
    while True:
        request = control_channel.recv_json()
        print("Received request {}".format(request))
        if should_grant(request):
            (downstream_sock, downstream_port) = bind_downstream()
            print("Downstream socket open on {}".format('tcp://*:{}'.format(downstream_port)))

            print("Connecting to upstream on {}".format(upstream_addr))
            upstream_sock = connect_upstream(request['topics'])

            control_channel.send_json({'status': 'ok', 'port': downstream_port})
            _nct = ClientManager(upstream_sock, downstream_sock)
            _nct.daemon = True
            _nct.start()
    else:
        control_channel.send_json({'status': 'rejected'})