我是像 RabbitMQ 这样的消息代理的新手我们可以使用它为调度系统创建任务/消息队列,如 Celery .
现在,问题来了:
我可以在 PostgreSQL 中创建一个表它可以附加新任务并由消费者程序(如 Celery)使用。
我到底为什么要为此设置一个全新的技术,比如 RabbitMQ?
现在,我认为扩展不是答案,因为我们的数据库(如 PostgreSQL)可以在分布式环境中工作。
我用谷歌搜索了数据库对特定问题提出了什么问题,我发现:
- 轮询使数据库繁忙且性能低下
- 锁定表 -> 再次表现不佳
- 数百万行任务 -> 同样,轮询性能不佳
现在,RabbitMQ 或任何其他类似的消息代理如何解决这些问题?
此外,我发现它遵循的是 AMQP
协议(protocol)。这有什么好处?
可以Redis也可以用作消息代理?我发现它比 RabbitMQ 更类似于 Memcached。
请阐明这一点!
最佳答案
Rabbit 的队列驻留在内存中,因此比在数据库中实现它要快得多。一个(好的)专用消息队列还应该提供基本的队列相关功能,例如节流/流量控制,以及选择不同路由算法的能力,仅举几例(rabbit 提供这些以及更多)。根据项目的大小,您可能还希望将消息传递组件与数据库分开,这样如果一个组件负载很重,它就不会妨碍另一个组件的操作。
关于您提到的问题:
轮询保持数据库繁忙和低性能:使用 Rabbitmq,生产者可以推送更新给消费者,这比轮询的性能要高得多。数据只需在需要时发送给消费者,无需进行无用的检查。
锁定表 -> 再次表现不佳:没有要锁定的表 :P
数百万行任务 -> 再次轮询性能低下: 如上所述,Rabbitmq 运行速度更快,因为它驻留在 RAM 中,并提供流控制。如果需要,它还可以在 RAM 耗尽时使用磁盘临时存储消息。在 2.0 之后,Rabbit 在 RAM 使用方面有了显着改善。集群选项也可用。
关于 AMQP,我想说一个非常酷的功能是“交换”,以及它路由到其他交换的能力。这为您提供了更大的灵 active ,并使您能够创建范围广泛的精心设计的路由类型,这些类型在扩展时会非常方便。有关一个很好的例子,请参阅:
(来源:springsource.com)
最后,关于Redis,是的,它可以用作消息代理,并且可以做得很好。但是,Rabbitmq 比 Redis 具有更多的消息队列功能,因为 rabbitmq 是从头开始构建的,是一个功能齐全的企业级专用消息队列。另一方面,Redis 主要被创建为内存中的键值存储(尽管它现在做的远不止于此;它甚至被称为瑞士军刀)。不过,我读到/听说过许多人在小型项目中使用 Redis 取得了不错的成绩,但在大型应用程序中却很少听说。
这是一个在长轮询聊天实现中使用 Redis 的示例:http://eflorenzano.com/blog/2011/02/16/technology-behind-convore/
关于postgresql - 为什么我们需要像 RabbitMQ 这样的消息代理而不是像 PostgreSQL 这样的数据库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13005410/