为什么要使用AMQP / ZeroMQ / RabbitMQ

时间:2009-12-01 02:54:50

标签: rabbitmq messaging zeromq amqp

而不是编写自己的库。

我们正在开发一个项目,它将是一个自我划分的服务器池,如果一个部分变得太重,管理员会将其划分并将其作为一个单独的进程放在另一台机器上。它还会警告所有连接的客户端,这会影响连接到新服务器。

我很好奇使用ZeroMQ进行服务器间和进程间通信。我的伴侣宁愿自己动手。我期待社区回答这个问题。

我自己是一个相当新手的程序员,只是学习了消息队列。正如我用Google搜索和阅读,似乎每个人都在使用消息队列来处理各种各样的事情,但为什么呢?是什么让他们比编写自己的图书馆更好?为什么它们如此常见,为什么会有这么多?

6 个答案:

答案 0 :(得分:77)

  

是什么让他们比编写自己的图书馆更好?

在推出应用程序的第一个版本时,可能没有:您的需求定义明确,您将开发适合您需求的消息传递系统:小功能列表,小型源代码等。

这些工具在第一个版本之后非常有用,当您实际需要扩展应用程序并向其添加更多功能时。 让我举几个用例:

  • 您的应用必须通过小端机(x86,intel / amd)与大型端机(sparc / powerpc)进行通信。您的消息传递系统有一些字节序排序假设:去修复它
  • 你设计了你的应用程序,因此它不是二进制协议/消息传递系统,现在它非常慢,因为你花了大部分时间来解析它(增加的消息数量和解析成为瓶颈):调整它以便它可以传输二进制/固定编码
  • 一开始你在局域网内有3台机器,所有机器都没有明显的延迟。你的客户/老板/尖头发 - 恶魔老板出现并告诉你,你将在你不管理的WAN上安装应用程序 - 然后你开始出现连接失败,延迟等等,你需要存储消息并重试发送他们稍后:回到代码并插入这些东西(并享受)

  • 发送的消息需要有回复,但不是全部:你发送一些参数并期望一个电子表格而不仅仅是发送和确认,回到代码并插入这些东西(并享受。)

  • 有些消息很关键,接收/发送需要适当的备份/持久性/。你为什么问 ?审计目的

还有许多其他用例我忘记了......

你可以自己实现它,但不要花很多时间这样做:你可能会在以后更换它。

答案 1 :(得分:40)

这就像问:为什么在你自己编写数据库时使用数据库?

答案是,使用已经存在一段时间并且在很多不同用例中得到充分理解的工具,随着时间的推移和随着需求的变化而越来越多地得到回报。如果项目中涉及多个开发人员,则尤其如此。如果您换到新项目,是否想成为排队系统的支持人员?使用工具可以防止这种情况发生。这成了别人的问题。

例证:持久性。编写工具将一条消息存储在磁盘上很容易。在许多不同的用例中编写一个可以稳定扩展并且运行良好的缓冲区,并且易于管理且支持成本很低。如果你想看到有人抱怨它有多难,那么请看看:http://www.lshift.net/blog/2009/12/07/rabbitmq-at-the-skills-matter-functional-programming-exchange

无论如何,我希望这会有所帮助。一定要编写自己的工具。很多人都这样做了。无论如何解决你的问题,都很好。

答案 2 :(得分:18)

我正在考虑自己使用ZeroMQ - 因此我偶然发现了这个问题。

我们假设您现在能够实现满足所有要求的消息排队系统。为什么你会采用自己的方式采用ZeroMQ(或其他第三方库)?简单 - 成本。

让我们暂时假设ZeroMQ已满足您的所有要求。所有需要做的就是将它集成到您​​的构建中,阅读一些doco然后开始使用它。这比投入自己的努力要少得多。此外,维护负担已转移到另一家公司。由于ZeroMQ是免费的,所以就像你刚刚成长为开发团队一样,包括(部分)ZeroMQ团队。

如果您经营软件开发业务,那么我认为您可以平衡使用第三方库的成本/风险,而不是自己动手,在这种情况下,使用ZeroMQ会赢得胜利。

也许你(或者更确切地说,你的伴侣)正如许多开发者所做的那样,受到"Not Invented Here"综合症的影响?如果是这样,请调整您的态度并重新评估ZeroMQ的使用。就个人而言,我更喜欢Proudly Found Elsewhere态度的好处。我希望我能为找到ZeroMQ感到自豪......时间会告诉我们。

编辑:我从ZeroMQ开发人员那里得到了video,其中讨论了为什么你应该使用ZeroMQ。

答案 3 :(得分:6)

  

是什么让他们比编写自己的图书馆更好?

消息队列系统是事务性的,从概念上讲它很容易用作客户端,但很难作为实现者,特别是考虑到持久性队列。您可能认为编写快速消息库可以逃脱,但如果没有事务和持久性,您将无法获得消息传递系统的全部优势。

此上下文中的持久性意味着消息传递中间件将未处理的消息保存在永久存储(磁盘上),以防服务器出现故障;重新启动后,可以处理消息,不需要重新传输(发送方甚至不知道存在问题)。事务性意味着您可以以事务方式读取来自不同队列的消息并将消息写入不同的队列,这意味着所有读取和写入都成功或(如果一个或多个失败)没有成功。这与通过与数据库接口所知的事务性并没有太大的不同,并且具有相同的好处(它简化了错误处理;没有事务,您必须确保每个单独的读/写成功,如果一个或多个失败,您有回滚那些成功的变化。)

答案 4 :(得分:4)

在编写自己的库之前,请先阅读0MQ指南:http://zguide.zeromq.org/page:all

您可能决定安装RabbitMQ,否则您将在ZeroMQ之上创建您的库,因为他们已经完成了所有的硬件。

答案 5 :(得分:2)

如果你有一点时间尝试并推出自己的实现!本练习的学习将使您相信使用已经过测试的库的智慧。