消息代理与数据库和监控

问题描述 投票:2回答:3

我的问题有一些相似之处这个问题:Why do we need message brokers like RabbitMQ over a database like PostgreSQL?

我目前(半专业)项目我也是在点来决定是否要为数据库,消息代理为基础(例如用RabbitMQ的),或者甚至是一个完全不同的解决方案。

让我们想象一下2个工具,工具A和B.工具每当工具A运行和成品,有可能是对的东西B.工具工具A的执行做需要安静一段时间(> 60秒),常常会出现什么可以做B.工具工具A提供机B的一些元数据,以便工具B知道该怎么做。

基于消息的解决方案:建立该刀具B被消耗消息队列。如果工具A被执行与工具乙应该运行,工具一个发布的消息(包括元数据)到工具B接收这样工具乙将运行使用所述元数据从所述消息队列中。

数据库解决方案:当工具A正在运行它增加了与例如数据库记录时间戳,元数据和“运行”状态。如果工具A被执行,工具乙方应运行,它会更新数据库记录的状态为“NEXT_TOOL_B”。工具B是不断查询DB与“NEXT_TOOL_B”状态记录。如果它发现的东西,工具B就运行使用元数据从数据库中记录。

虽然我知道的数据库解决方案的缺点如的从工具B中的恒定轮询,我想在基于消息的解决方案的其一个特征:

每当第三工具,说工具C,例如控制面板UI,想知道目前的状态还可以查询数据库在任何时候,它会找到万一“RUNNING”状态工具A仍然在起作用。在邮件的解决方案,我真的没有看到一个方法来“监视”状态,除非完成消息将在队列中。

所以我的问题是,你能想到的方式来实现这一目标使用邮件或不投票沿得到任何其他方法?

database rabbitmq message-queue
3个回答
6
投票

在这个问题中所描述的情况是,一个系统,它是由多条不同,其一起工作来实现的功能的。在这种情况下,有三种不同的工艺{A,B,C},与数据库和可选的消息队列一起。所有的系统,作为它们的存在目的的一部分,接受一个或多个输入,执行一些过程,并产生一个或多个输出。在你的情况,你想要的成果之一是系统及其处理,这是不希望有一个完全不合理的事情的状态。

队列或数据库?

现在,到了你的问题。为什么要使用消息队列,而不是数据库的?两者都在它们执行一些存储容量的系统的类似的组件。你可能会问同样的问题在冰箱制造植物 - 当它更有意义,使用的架子上流水线,而不是一个仓库?

数据库是像仓库 - 他们的目的是持有很多不同的事情,让他们都比较直。良好的仓库让用户能够快速找到在仓库的东西,并避免丢失部件和材料。如果这样下去的,它可以很容易地回来了,但不会立即。

消息队列,在另一方面,是像临近在装配线的操作员站的货架。部分从以前的操作等待通过运行站的人消耗积聚在那里。货架上设计容纳少数的同样的事情 - 就像在软件系统中的消息队列。他们是接近工人,所以当接下来的部分是准备工作,它可以非常迅速地检索(而不是一趟仓库,这可能需要几分钟或更长时间)。此外,劳动者有直接的可见性是什么在货架上 - 如果货架是空的,工人可以休息一下,等待它再次积累或两部分。

最后,如果工厂严重的一部分过度产生(我们不喜欢它,当发生这种情况,因为它表明废物),然后货架会不堪重负,而超龄的人都需要被放入仓库。信不信由你,这种情况发生在工厂所有的时间 - 有时站下去了短暂的时间和仓库作为一个长期的缓冲区。

当使用一个或其他?

所以 - 回到问题。您可以使用消息队列时,您希望您的生产消息通常会匹配消息的消费,你需要速度检索。你别指望的东西留在周围排队很长。软件队列系统,如RabbitMQ的,也执行一些非常具体的功能 - 就像确保作业只得到由一个处理器处理,它可以通过不同的处理器得到回升,如果第一个出现故障。

在另一方面,你会使用的东西需要状态的多个加工步骤的持久性的数据库。你的工作状态是什么,应该被存储在数据库中一个很好的例子。要继续厂类比 - 想想当完成每个步骤是被送回生产计划的报告。生产计划是要保持它在数据库中。

你也想使用一个数据库时,有一个可能性队列将得到充分的,或者说数据不丢失一个工作步骤,并且彼此之间时,它的关键得到。例如,一个制造工厂往往会存储其成品在仓库待托运给客户。使用数据库的所有长期(超过几秒钟)的存储需求在应用程序中。

底线

最具扩展性的软件系统将需要两个队列和数据库,关键是要知道何时使用它们。

希望这使得某种程度的意义。


0
投票

你可以让生产者和队列的消费者带来了的NoSQL数据库或RDBMS更新表。这将允许你在任何给定时间查看请求的状态。它也将让你带推消息,而不需要轮询的优势。


0
投票

免责声明:我cluster-tasks-service的作者 - CTS,所提出的解决方案或以其他方式考虑与其他相关工具的使用。

问题是,从总体架构的角度你描述的功能貌似需要两种类型的解决方案:

  • 其中机B的执行,通过工具一个完成的工作的结果部分是事件驱动流动的经典。消息通常更有效的在这一点,但请继续阅读...
  • 您希望有一些状态观测/监测肯定在流动的部分构成了要求持续状态(嗯,是的,甚至没有在内存中,或至少分布式存储器,因为你会想以后集群等等)

我想说的是基于数据库的队列将是一个解决方案在这里。 DB基于队列从绝对比基于非DB办法的较低的吞吐量受到影响。但是,它可以让你像一些好处:

  • 保证持续性,没有任务/邮件丢失,除非真正的灾难发生,那么队列是一个不重要的问题
  • 同步在DB无需任何复杂的系统拓扑结构,主/奴的问题,故障转移等智能管理任务
  • 这是很容易得到这样的队列,嵌入式解决方案 - 相对很低的运营成本,以单独的Redis /兔/卡夫卡设施/服务

CTS方面 - 这是一个群集感知任务分配和管理系统通过DB(由消费应用提供和运​​行嵌入式),您的问题将通过运行工具B中,在其过程结束时通过工具一个入队的任务来解决与所有的相关数据。同时,刀具C可使用CTS的API来检查任务/秒的状态,并根据需要可视化。

© www.soinside.com 2019 - 2024. All rights reserved.