postgresql - 为什么我们需要像 RabbitMQ 这样的消息代理而不是像 PostgreSQL 这样的数据库?

标签 postgresql redis rabbitmq message-queue celery

我是像 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)

和:http://blog.springsource.org/2011/04/01/routing-topologies-for-performance-and-scalability-with-rabbitmq/

最后,关于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/

相关文章:

postgresql - Docker - PostgreSQL 无法连接到服务器 : Connection refused 127. 0.0.1:5432

laravel - 使用 Redis 在 Laravel 中缓存

lua - Redis如何减少lua复制粘贴

docker - RabbitMQ pod Web用户名和密码?

javascript - 在rabbitmq中获取路由/绑定(bind) key

node.js - 迁移 knex : storing media, 图像或 blob 中的表

sql - 如何将 int (yyyymmdd) 转换为 SQL 中的时间戳?

sql - 有没有办法在 postgres 中存储预先排序的行?

ruby-on-rails - 相关工作人员中的参数数量减少后如何处理已经排队的工作?

python - 如何在 Tornado 应用程序中与 RabbitMQ(鼠兔库)通信