ZeroMQ循环和工人订阅

时间:2015-12-07 17:35:42

标签: python zeromq

我让一些客户连接到前端经纪人和一些工作人员。

我使用的zeromq模式:

zeromq pattern

如何根据事件名称为我的员工和工人选择进行循环分配?

我使用PUB / SUB模式进行订阅过滤,但我不希望我的经纪人向工作人员发送相同的消息。

这里有一些代码(python3,zmq):

client.py

context = zmq.Context()
socket = context.socket(zmq.DEALER)
socket.identity = b'frontend'
socket.connect('tcp://127.0.0.1:4444')

while True:
    event = random.choice([b'CreateUser', b'GetIndex', b'GetIndex', b'GetIndex'])
    socket.send(event)
    print('Emit %s event' % event)
    time.sleep(1)

broker.py

context = zmq.Context()
frontend = context.socket(zmq.ROUTER)
frontend.identity = b'broker'
frontend.bind("tcp://127.0.0.1:4444")

backend = context.socket(zmq.DEALER)
backend.identity = b'broker'
backend.bind("tcp://127.0.0.1:5555")

poller = zmq.Poller()
poller.register(frontend, zmq.POLLIN)
poller.register(backend, zmq.POLLIN)

id = 0
while True:
    id += 1
    sockets = dict(poller.poll())

    if frontend in sockets:
        event, message = frontend.recv_multipart()
        print('Event %s from %s' % (message.decode('utf-8'), event.decode('utf-8')))
        backend.send_multipart([message,str(id).encode('utf-8')])

create_user_worker.py

context = zmq.Context()
worker = context.socket(zmq.DEALER)
worker.identity = b'create-user-worker'
worker.connect("tcp://127.0.0.1:5555")

while True:
    message, id = worker.recv_multipart()
    if message == b'CreateUser':
        print(message, id)

get_index_worker.py

context = zmq.Context()
worker = context.socket(zmq.DEALER)
worker.identity = b'get-index-worker'
worker.connect("tcp://127.0.0.1:5555")

while True:
    message, id = worker.recv_multipart()
    if message == b'GetIndex':
        print(message, id)

以下代码的输出:

get_index_worker.py

b'GetIndex' b'1'
b'GetIndex' b'2'
b'GetIndex' b'4'
b'GetIndex' b'6'

create_user_worker.py

b'CreateUser' b'3'

id为5的事件的任务将丢失

github repo:https://github.com/guillaumevincent/tornado-zeromq

1 个答案:

答案 0 :(得分:2)

现状:原样

ROUTER/DEALER 设备与任何其他逻辑无关,而不是它的内部设计指令(在客户端侦听,在循环的基础上发送任何传入的消息)线,朝向工人方并保留内部记录,以便能够将工作人员的回复消息返回给相应的客户,不再是

如何获得更多?

试着想象另一种可能的方法。

每个客户端都可以拥有更多套接字,并且可以 .connect() -ed更多设备 -s。

每个设备只会收到"专门的"消息的类型,并将使用标准的循环"原始负载平衡"来适当地处理这些消息。 旋转木马行为

这样您的设计目标(将消息分发到其他负载均衡处理程序池 I. ,同时保持事件特定方向原则 II. 符合,仍使用最原始的ZeroMQ实体。