Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用amqp将消息从队列解复用到并行流中处理?_Java_Spring_Rabbitmq_Amqp_Reactive Programming - Fatal编程技术网

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

Java 使用amqp将消息从队列解复用到并行流中处理?,java,spring,rabbitmq,amqp,reactive-programming,Java,Spring,Rabbitmq,Amqp,Reactive Programming,我试图弄清楚我是否可以从阻塞场景切换到更被动的模式 我有进入队列的更新命令,我需要按顺序处理它们,但只处理与同一实体有关的命令。本质上,我可以创建任意多个并行的更新事件流,只要没有两个流包含关于同一实体的事件 我认为主队列的使用者可能能够利用amqp的路由机制和临时队列,方法是为每个实体id创建临时队列,并将使用者与之挂钩。一旦订阅服务器完成并且队列中当前没有与所讨论的实体相关的其他事件,就可以释放队列 这个场景是经常使用的吗?有没有更好的方法来实现这一点?在我们当前的系统中,我们使用基于id的

我试图弄清楚我是否可以从阻塞场景切换到更被动的模式

我有进入队列的更新命令,我需要按顺序处理它们,但只处理与同一实体有关的命令。本质上,我可以创建任意多个并行的更新事件流,只要没有两个流包含关于同一实体的事件

我认为主队列的使用者可能能够利用amqp的路由机制和临时队列,方法是为每个实体id创建临时队列,并将使用者与之挂钩。一旦订阅服务器完成并且队列中当前没有与所讨论的实体相关的其他事件,就可以释放队列


这个场景是经常使用的吗?有没有更好的方法来实现这一点?在我们当前的系统中,我们使用基于id的命名锁来防止并发更新

至少有两种选择:

每个实体的单个队列 和一个实体队列上的n个使用者

一个包含所有实体消息的队列。消息中包含数据的位置是实体的位置。您可以将其拆分为多个队列(一种类型的实体对应一个AMQP队列)或使用一个实现

在qmqp队列中拆分实体的好处

  • 您可以使用rabbitmq创建ha设置
  • 你可以发送消息
  • 一个实体队列可能有多个使用者,如果 有一天是必要的(可伸缩性)
  • 消息可以是持久的,因此可以在 应用程序崩溃
使用内部BlockingQueue实现的好处

  • 速度更快(显然没有网络io)
  • 一切都必须在一个JVM中发生
无论如何,这取决于你想要什么,因为这两种方法都有各自的好处

更新: 我不确定我现在是否找到了你,但让我给你一些资源来尝试一些东西。 这里有一些特殊的兔子,也许其中一些能给你一个想法。请看一看a和绑定


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

您对“主队列”是什么意思?我接收到队列中实体(比如地址)的更新。这是主队列。所有地址实体的更新在此队列中多路传输。您好,感谢您的加入!我已经概述了您在第一个解决方案中描述的内容,但困难在于我必须根据实体id而不是实体类型创建队列,因此这些队列是临时的,需要动态创建。挑战在于如何利用amqp/rabbitMQ实现这一点。阻塞队列是不可能的,应用程序位于集群中,而锁定是一种避免不一致或乐观锁定失败的策略。那么,你的问题应该是如何从临时队列中消费,当你启动消费者时,你不知道该临时队列的名称(?)这听起来甚至很奇怪。我看不出有任何理由将您的主队列拆分为临时队列。我所知道的临时队列的唯一用例是RPC调用。如果您创建一个映射(到队列的实体Id),该怎么办。当您开始处理一个实体时,您将其放入映射。处理后,将其从地图中删除。对于来自主队列的每个传入消息,您需要在映射中搜索其Id。如果你找到了它,你就把它放在同一个队列里。否则,根据负载平衡将其放入任何队列。@EugeneTo Hi。您的解决方案将在单一消费者场景中工作。Mao是当前活动临时队列的注册表。使其成为多节点可能涉及主题上的一些协议,以便在新创建队列时生成使用者。