我不熟悉像RabbitMQ这样的消息代理,我们可以使用它为Celery这样的调度系统创建任务/消息队列.

现在,问题是:

  • 我可以创建一个PostgreSQL个表格,可以添加新任务,并被Celery 等消费程序使用.

  • 我到底为什么要为RabbitMQ这样的设备安装一种全新的技术?

现在,我相信扩展并不能解决问题,因为我们的数据库(如PostgreSQL)可以在分布式环境中工作.

我在谷歌上搜索了数据库对特定问题造成的问题,发现:

  • 轮询使数据库繁忙且性能低下
  • locking of the table -> again low performing
  • millions of rows of tasks -> again, polling is low performing

现在,RabbitMQ或任何其他类似的消息代理如何解决这些问题?

此外,我发现AMQP协议是它遵循的.这有什么好处?

Redis还可以用作消息代理吗?我发现它比RabbitMQ更类似于Memcached.

请解释一下!

推荐答案

Rabbit的队列驻留在内存中,因此比在数据库中实现要快得多.一个(好的)专用消息队列还应该提供与队列相关的基本功能,比如节流/流量控制,以及 Select 不同路由算法的能力(兔子提供了这些和更多).根据项目的大小,您可能还希望消息传递组件与数据库分离,这样,如果一个组件承受重负载,就不需要妨碍另一个组件的操作.

至于你提到的问题:

  • polling keeping the database busy and low performing:使用Rabbitmq,生产者可以向消费者提供push个更新,这比轮询性能好得多.数据只需在需要时发送给消费者,无需进行浪费性判断.

  • locking of the table -> again low performing:.没有可锁的桌子:P

  • millions of rows of task -> again polling is low performing:如上所述,Rabbitmq驻留在RAM中并提供流控制,因此运行速度更快.如果需要,如果内存不足,它还可以使用磁盘临时存储消息.2.0之后,Rabbit的RAM使用率有了显著提高.集群选项也可用.

关于AMQP,我想说一个非常酷的功能是"交换",以及它能够路由到其他交换.这为您提供了更大的灵活性,并使您能够创建一系列复杂的布线类型,这些类型在扩展时非常方便.有关一个好例子,请参见:


(source: 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相关问答推荐

如何在postquist中修剪第一/后文件名

在SqlalChemy中转义动态CamelCase场

我需要一个变量来引用上周的星期五

将XML解析从T-SQL迁移到Postgres时出现问题

在PostgreSQL中,`MY_VARIABLE IN(<;Long_ARRAY_of_Items>;)`何时是FAST?

在插入时创建一个触发器,在PostgreSQL中的另一个表上创建另一个触发器

错误:用户需要系统密码:postgres

如何获取在 Go 中完成的 SQL 插入的错误详细信息?

无法使用golang在postgresql中使用自定义类型插入/更新数据

如何在postgresql中按时间查询

GORM 不会创建 many2many 关联

PostgreSQL比较两个jsonb对象

使用 Django + Postgres 的加密策略?

遇到序列化失败的条件是什么?

错误:CASE types character varying and numeric cannot be matched

Postgres UPDATE with ORDER BY,怎么做?

将数据从 MS SQL 迁移到 PostgreSQL?

如何使用 Django Migrations 重新创建已删除的表?

Ruby 中 DateTime 的毫秒分辨率

PostgreSQL - GROUP BY 子句或用于聚合函数