使用amqp从队列中解复用消息以并行流处理?

时间:2014-07-17 08:32:39

标签: java spring rabbitmq amqp reactive-programming

我试图找出是否可以从阻塞场景切换到更具反应性的场景。

我有传入更新命令到达队列,我需要按顺序处理它们,但只需要处理相同实体的那些命令。从本质上讲,只要没有两个流包含有关同一实体的事件,我就可以创建尽可能多的并行更新事件流。

我认为主队列的使用者可能能够利用amqp的路由机制和临时队列,为每个实体id创建临时队列,并将消费者挂钩。一旦订户完成并且当前没有关于该实体的其他事件在队列中,则可以丢弃该队列。

这种情况是经常使用的吗?有没有更好的方法来实现这一目标?在我们当前的系统中,我们使用基于id的命名锁来防止并发更新。

1 个答案:

答案 0 :(得分:1)

至少有两个选项:

每个实体的单个队列 并且n个消费者在一个实体队列中。

包含所有实体消息的一个队列。消息包含数据对于实体的含义。您可以将其拆分为多个队列(一个实体的一个AMQP-Queue)或使用BlockingQueue实现。

在qmqp-queues中拆分实体的好处

  • 您可以使用rabbitmq
  • 创建ha-setup
  • 您可以路由消息
  • 如果是实体队列,您可能拥有多个消费者 有朝一日是必要的(可扩展性)
  • 消息可以是持久的,因此可以恢复 应用程序崩溃

使用内部BlockingQueue实现的好处

  • 它更快(显然没有net-io)
  • 一切都必须在一个JVM中发生

无论如何,它确实取决于你想要什么,因为这两种方式都可以带来好处。

<强>更新 我不确定我现在能不能找到你,但是让我给你一些资源来尝试一些事情。 有一些特殊的rabbitmq extensions也许其中一些可以给你一个想法。请查看lternate exchangesexchange to exchange绑定。

同样对于基本测试,我不确定它是否涵盖所有rabbitmq功能或所有amqp功能,但this有时可能有用。请记住,此可视化中的路由键是生产者名称,您还可以找到一些示例。导入和导出配置。