RabbitMQ-向队列中的特定使用者发送消息

RabbitMQ-向队列中的特定使用者发送消息,rabbitmq,spring-amqp,spring-rabbit,Rabbitmq,Spring Amqp,Spring Rabbit,这就是场景-存在多个应用程序服务器。浏览器可以通过websocket连接到任何应用服务器 应用服务器(消费者)都在侦听特定队列。一旦接收到web套接字连接,特定的应用服务器就会使用路由密钥{userId}将队列绑定到直接交换 我希望使用路由密钥{userId}发送到direct exchange的消息仅由发生绑定的特定应用程序服务器接收 在这种情况下,直接交换是正确的交换吗?还是应该使用其他类型的交换 我使用SpringAMQP在websocket出现时创建动态绑定 // create the

这就是场景-存在多个应用程序服务器。浏览器可以通过websocket连接到任何应用服务器

应用服务器(消费者)都在侦听特定队列。一旦接收到web套接字连接,特定的应用服务器就会使用路由密钥{userId}将队列绑定到直接交换

我希望使用路由密钥{userId}发送到direct exchange的消息仅由发生绑定的特定应用程序服务器接收

在这种情况下,直接交换是正确的交换吗?还是应该使用其他类型的交换

我使用SpringAMQP在websocket出现时创建动态绑定

// create the RabbitMq queue and bind to it
String routingKey = MessageConstants.getRoutingKeyForUserRecommendationQueue(user);
Binding userRecommendationBinding = BindingBuilder.bind(userRecommendationsQueue).
    to(directExchange).with(routingKey);
amqpAdmin.declareBinding(userRecommendationBinding);

实际上你走对了路

是的:使用适当的绑定直接交换应该可以节省您的时间

请参阅RabbitMQ教程中的更多信息:

另外,请查看Spring AMQP关于该问题的样本:

更新


不幸的是,事实并非如此。这些消息似乎随机发送给任何消费者,而不仅仅是创建绑定的消费者

M-M-M。这是可能的,因为我们只路由我的
,但之后消息被放入队列,队列可能在不同的机器上有多个使用者

在这种情况下,是的:动态绑定没有帮助

你应该考虑创建一个唯一的新队列(自动删除是很好的),并从中准确地绑定和侦听。

SimpleMessageListenerContainer
在运行时支持
addQueues()
为新队列启动新使用者

我想这对你应该有用

您仍然不应该在生产者方面做任何事情:相同的
exhchange
routingKey
逻辑

向队列中的特定使用者发送消息

这是不可能的。连接到队列的任何使用者都有机会使用队列中的任何给定消息

我希望使用路由密钥{userId}发送到direct exchange的消息仅由发生绑定的特定应用程序服务器接收

您可以通过为您的消费者创建
exclusive
/
autoDelete
队列,并使用绑定将该消费者的所有消息定向到该队列来完成此操作

在这种情况下,直接交换是正确的交换吗


直接交流或主题交流都可以。直接交流稍微容易理解,但话题交流更灵活

不幸的是,事实并非如此。这些消息似乎是随机发送给任何消费者的,不仅仅是创建binding.BTW的消费者,我可以发誓它在我们从RabbitMQ 3.4迁移到3.6之前就工作了对不起,一开始就被误解了。请看一下我的UpdateAnks@Artem和Derick,你的答案是一样的。这是可行的,但是有1000个队列会导致性能问题吗?我们预计将有大约10000人排队。另外,知道创建队列与绑定的开销是多少吗?我想SimpleMessageListenerContainer.removeQueue只会删除使用者。如果我错了,请纠正我。