而不是写自己的图书馆.
我们正在开发一个项目,这个项目将是一个自我划分的服务器池,如果一个部分变得太重,管理员会将其划分并将其作为一个单独的进程放在另一台机器上.它还会警告所有连接的客户端,这会影响连接到新服务器.
我很好奇使用ZeroMQ进行服务器间和进程间通信.我的伴侣宁愿自己动手.我期待社区回答这个问题.
我自己是一个相当新手的程序员,只是学习了消息队列.正如我用Google搜索和阅读,似乎每个人都在使用消息队列来处理各种各样的事情,但为什么呢?是什么让他们比编写自己的图书馆更好?为什么它们如此常见,为什么会有这么多?
是什么让他们比编写自己的图书馆更好?
在推出应用程序的第一个版本时,可能没有:您的需求已经明确定义,您将开发适合您需求的消息传递系统:小功能列表,小型源代码等.
这些工具在第一个版本之后非常有用,当您实际需要扩展应用程序并向其添加更多功能时.让我举几个用例:
你的应用程序将不得不从一个小端机(x86,intel/amd)与大型端机(sparc/powerpc)交谈.您的消息传递系统有一些字节序排序假设:去修复它
你设计了你的应用程序,因此它不是一个二进制协议/消息系统,现在它非常慢,因为你花了大部分时间来解析它(增加的消息数量和解析成为瓶颈):调整它以便它可以传输二进制/固定编码
一开始你在局域网内有3台机器,没有明显的延误,一切都到达每台机器.你的客户/老板/尖头发 - 恶魔老板出现并告诉你,你将在你不管理的WAN上安装应用程序 - 然后你开始出现连接失败,延迟等等,你需要存储消息并重试发送他们稍后:回到代码并插入这些东西(并享受)
发送的消息需要有回复,但不是全部:你发送一些参数并期望一个电子表格而不仅仅是发送和确认,回到代码并插入这些东西(并享受.)
一些消息是关键的,接收/发送需要适当的备份/持久性/.你为什么问 ?审计目的
还有很多其他用例我忘了......
你可以自己实现它,但不要花很多时间这样做:你可能会在以后更换它.
这非常像问:为什么在你自己编写时使用数据库?
答案是使用已经存在一段时间并且在许多不同用例中得到充分理解的工具,随着时间的推移和随着需求的变化而越来越多地获得回报.如果项目中涉及多个开发人员,则尤其如此.如果您换到新项目,是否想成为排队系统的支持人员?使用工具可以防止这种情况发生.这成了别人的问题.
例证:持久性.编写工具将一条消息存储在磁盘上很容易.在许多不同的使用案例中编写一个可以扩展并且运行良好且稳定的缓冲器,并且易于管理且支持便宜很难.如果你想看到有人抱怨它有多难,那就看看这个:http://www.lshift.net/blog/2009/12/07/rabbitmq-at-the-skills-matter-functional-programming-exchange
无论如何,我希望这会有所帮助.一定要编写自己的工具.很多人都这样做了.无论什么解决你的问题,都很好.
我正在考虑自己使用ZeroMQ - 因此我偶然发现了这个问题.
我们暂时假设您能够实现满足所有要求的消息排队系统.为什么你会采用自己的方式采用ZeroMQ(或其他第三方库)?简单 - 成本.
让我们暂时假设ZeroMQ已满足您的所有要求.所有需要做的就是将它集成到您的构建中,阅读一些doco然后开始使用它.这比投入自己的努力要少得多.此外,维护负担已转移到另一家公司.由于ZeroMQ是免费的,就像你刚刚成长为开发团队一样,包括ZeroMQ团队(部分).
如果您经营一家软件开发公司,那么我认为您可以平衡使用第三方库的成本/风险,而不是自己动手,在这种情况下,使用ZeroMQ会赢得胜利.
也许你(或者更确切地说,你的伴侣)正如许多开发者所做的那样,遭受"未发明在这里"的综合症?如果是这样,请调整您的态度并重新评估ZeroMQ的使用.就个人而言,我更喜欢Proudly Found Elsewhere态度的好处.我希望我能为找到ZeroMQ感到自豪......时间会告诉我.
编辑:我从ZeroMQ开发人员那里看到了这个视频,讨论了为什么要使用ZeroMQ.
是什么让他们比编写自己的图书馆更好?
消息队列系统是事务性的,在概念上易于用作客户端,但很难作为实现者,特别是考虑持久性队列.您可能认为编写快速消息库可以逃脱,但如果没有事务和持久性,您将无法获得消息传递系统的全部优势.
此上下文中的持久性意味着消息传递中间件将未处理的消息保存在永久存储(磁盘上),以防服务器出现故障; 重新启动后,可以处理消息,不需要重新传输(发送方甚至不知道存在问题).事务性意味着您可以以事务方式读取来自不同队列的消息并将消息写入不同的队列,这意味着所有读取和写入都成功或(如果一个或多个失败)没有成功.这与通过与数据库接口所知的事务性并没有太大的不同,并且具有相同的好处(它简化了错误处理;没有事务,您必须确保每个单独的读/写成功,如果一个或多个失败,您有回滚那些成功的变化).