Python ZMQ发布/次可靠/可扩展设计

Python ZMQ发布/次可靠/可扩展设计,python,publish-subscribe,zeromq,messagebroker,Python,Publish Subscribe,Zeromq,Messagebroker,我正在使用ZMQ设计一个酒吧/酒吧体系结构。我需要最大程度的可靠性和可扩展性,并且在提供的各种可能性中迷失了方向 目前,我得到了一套由经纪人链接的出版商和订阅者。代理是一个简单的转发器设备,为发布者提供前端,为订阅者提供后端 我需要处理代理崩溃或断开连接的情况,并提高总体可伸缩性 好的,所以我考虑添加多个代理,发布者将循环代理向其发送消息,订阅者只需订阅所有这些代理 然后,我需要一种方法来检索可能的代理列表,因此我编写了一个名称服务,根据需要提供代理列表。发布者和订阅者要求此服务连接到哪个代理

我正在使用ZMQ设计一个酒吧/酒吧体系结构。我需要最大程度的可靠性和可扩展性,并且在提供的各种可能性中迷失了方向

目前,我得到了一套由经纪人链接的出版商和订阅者。代理是一个简单的转发器设备,为发布者提供前端,为订阅者提供后端

我需要处理代理崩溃或断开连接的情况,并提高总体可伸缩性

好的,所以我考虑添加多个代理,发布者将循环代理向其发送消息,订阅者只需订阅所有这些代理

然后,我需要一种方法来检索可能的代理列表,因此我编写了一个名称服务,根据需要提供代理列表。发布者和订阅者要求此服务连接到哪个代理

我还编写了一种“懒惰海盗”(即一个接一个地尝试/重试)可靠的名称服务,以防主名称服务失败

我开始认为我的设计是错误的,因为代码库的大小和复杂性不断增加。我迷失在ZMQ提供的可能性丛林中

也许一些基于路由器/经销商的东西可以在这里使用


非常感谢您的建议

看起来,大多数复杂性都源于试图使代理服务在发生故障时保持不变。在应用程序级别解决这个问题可以为您提供最高程度的灵活性,但如果您是从头开始,则需要付出最大的努力

您可以在网络级别处理此问题,而不是在应用程序级别处理此问题。像对待任何其他简单网络服务一样对待您的代理,并使用IP故障切换机制(例如,pacemaker/corosync、UCARP等)在主服务不可用时将虚拟IP地址切换到辅助服务


这大大简化了您的发布者和订阅者,因为您不需要名称服务。他们只需要知道单个虚拟ip地址。ZMQ将在必要时(即发生故障转移时)负责重新连接到服务。

不可能直接回答您的问题,因为它基于许多假设,其中许多假设可能是错误的

你迷路了,因为你使用了错误的方法。把0MQ看作是一种你还不太清楚的语言。如果你一开始就试图写“最大的可靠性和可伸缩性”,那么你最终会被哥斯拉吐出来

所以:使用我在指南中使用的方法。从核心消息流的最小解决方案开始,并使其正常工作。仔细考虑使用哪种插座。然后进行增量改进,每次全面测试以确保您了解实际情况。随着代码的增长,定期重构代码。继续,直到获得稳定的最小版本1。不要一开始就追求“最大化”任何东西

最后,当您更好地理解了这个问题后,再从头开始,然后分几个步骤建立一个工作模型

重复以上步骤,直到你完全掌握了问题,并学会了解决问题的最佳方法