Я действительно хотел бы попробовать ZeroMQ, и мне интересно, можно ли решить мою проблему с помощью него.
ПРОБЛЕМА: у меня несколько подписчиков и несколько издателей. В централизованной брокерской архитектуре издатели будут публиковать сообщения в теме (вроде адреса многоадресной рассылки), а подписчики будут получать сообщения из темы и действовать в соответствии с сообщениями. Я не могу использовать Multicast, потому что в нашей топологии сети есть несколько подсетей, и ИТ-специалисты не будут пересылать мои многоадресные пакеты во все подсети.
Поскольку нет централизованного брокера, как можно решить эту проблему в ZeroMQ? (пример кода был бы хорош на любом языке)
Это очень простой вопрос, но я попытаюсь дать вам некоторые рекомендации … просто поймите, что вы не описали реальную проблему, просто пример использования, который имеет несколько потенциальных решений в зависимости от ваших конкретных потребностей.
На базовом уровне каждый подписчик может вести список каждого издателя и напрямую подписываться на него. Все это очень грубая сила и руководство, но это первый шаг к достижению того, что вы хотите.
Если ведение этого списка становится неразрешимой проблемой для каждого узла, вы создаете новый узел для управления списком подписчиков для вас. Когда издатель раскручивается, он уведомляет об этом узел менеджера, который информирует подписчиков, что им необходимо подписаться на него.
Если мы говорим об очень большом количестве издателей и подписчиков, а полная сетевая топология требует проблем, вы можете написать своего брокера, чтобы подписаться на каждого издателя, а затем переиздать всем подписчикам.
У каждого из этих решений есть свои нюансы, но на высоком уровне это три основных варианта. Если у вас есть представление о том, что лучше всего подходит для вашей ситуации, и вам нужны дальнейшие рекомендации, пожалуйста, добавьте еще несколько деталей, и мы сможем разобраться в них.
Делал немного чтения. И это возможно в ZeroMQ в конце концов. Вы бы использовали устройство «FORWARDER» в качестве:
import zmq
def main():
try:
context = zmq.Context(1)
# Socket facing clients
frontend = context.socket(zmq.SUB)
frontend.bind("tcp://*:5559")
frontend.setsockopt(zmq.SUBSCRIBE, "")
# Socket facing services
backend = context.socket(zmq.PUB)
backend.bind("tcp://*:5560")
zmq.device(zmq.FORWARDER, frontend, backend)
except Exception, e:
print e
print "bringing down zmq device"finally:
pass
frontend.close()
backend.close()
context.term()
if __name__ == "__main__":
main()