这是场景 - 有多个应用服务器 . 浏览器可以通过websocket连接到任何应用服务器 .
应用程序服务器(使用者)都在侦听特定队列 . 一旦收到Web套接字连接,特定应用服务器就会使用路由密钥将队列绑定到直接交换 .
我希望发送到直接交换的消息与路由密钥仅由发生绑定的特定应用服务器接收 .
在这种情况下是否直接交换正确的交换?或者是否应该使用其他类型的交换?
当websocket进来时,我正在使用spring-amqp来创建动态绑定
// 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);
2 回答
这是不可能的 . 连接到队列的任何使用者都有可能消耗队列中的任何给定消息
您可以通过为您的使用者创建
exclusive
/autoDelete
队列来实现此目的,并使用绑定将该使用者的所有消息定向到该队列 .无论是直接交换还是主题交换都没问题 . 直接交换稍微容易理解,但主题交换更灵活
其实你走对了路 .
是的:使用适当的绑定进行直接交换可以节省您的费用 .
在RabbitMQ教程中查看更多信息:http://www.rabbitmq.com/tutorials/tutorial-four-java.html
另外请看一下Spring AMQP样品:https://github.com/spring-projects/spring-amqp-samples/tree/master/rabbitmq-tutorials
UPDATE
M-M-M这是可能的,因为我们只路由我的
key
,但之后将消息放入队列,这可能在不同的机器上有几个消费者 .在这种情况下是的:动态绑定没有帮助 .
您应该考虑创建一个唯一的新队列(自动删除很好)并从中精确绑定和监听 .
SimpleMessageListenerContainer
在运行时支持addQueues()
为新队列启动新的使用者 .我认为这应该适合你 .
你仍然不应该在 生产环境 者方面做任何事情:相同的
exhchange
和routingKey
逻辑 .