我让一些客户连接到前端经纪人和一些工作人员。
我使用的zeromq模式:
如何根据事件名称为我的员工和工人选择进行循环分配?
我使用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
答案 0 :(得分:2)
ROUTER/DEALER
设备与任何其他逻辑无关,而不是它的内部设计指令(在客户端侦听,在循环的基础上发送任何传入的消息)线,朝向工人方并保留内部记录,以便能够将工作人员的回复消息返回给相应的客户,不再是)
试着想象另一种可能的方法。
每个客户端都可以拥有更多套接字,并且可以 .connect()
-ed更多设备 -s。
每个设备只会收到"专门的"消息的类型,并将使用标准的循环"原始负载平衡"来适当地处理这些消息。 旋转木马行为
这样您的设计目标(将消息分发到其他负载均衡处理程序池 I.
,同时保持事件特定方向原则 II.
)符合,仍使用最原始的ZeroMQ
实体。