2 回答
TA贡献1942条经验 获得超3个赞
我不知道实施您所描述的先发制人策略的方法,但是您可以考虑许多其他选择。
优先级设定
首先要考虑的是priority
RabbitMQ 本身的支持。
考虑一下 Gavin M. Roy 的《RabbitMQ in Depth》中的摘录:
“从 RabbitMQ 3.5.0 开始,优先级字段已按照 AMQP 规范实现。它被定义为一个整数,可能的值为 0 到 9,用于队列中的消息优先级排序。根据规定,如果发布了优先级为 9 的消息,随后又发布了优先级为 0 的消息,则新连接的消费者将先于优先级为 9 的消息接收到优先级为 0 的消息。
例如
rabbitTemplate.convertAndSend("Hello World!", message -> {
MessageProperties properties = MessagePropertiesBuilder.newInstance()
.setPriority(0)
.build();
return MessageBuilder.fromMessage(message)
.andProperties(properties)
.build();
});
基于优先级的交换
第二种选择是定义主题交换并定义考虑您的优先级的路由键。
例如,考虑events使用模式的路由密钥进行交换,EventName.Priority例如OrderPlaced.High、OrderPlaced.Normal或OrderPlaced.Low。
基于此,您可以有一个队列仅绑定到高优先级的订单,即OrderPlaced.High和多个专用于该队列的消费者。
例如
String routingKey = String.format("%s.%s", event.name(), event.priority());
rabbit.convertAndSend(routingKey, event);
使用如下所示的侦听器,其中队列使用路由键high-priority-orders绑定到events事件OrderPlaced和优先级的交换器。HighOrderPlaced.High
@Component
@RabbitListener(queues = "high-priority-orders", containerFactory="orders")
public class HighPriorityOrdersListener {
@RabbitHandler
public void onOrderPlaced(OrderPlacedEvent orderPlaced) {
//...
}
}
显然,您将需要一个专用的线程池(在orders上面的容器工厂中)来处理高优先级请求。
TA贡献2019条经验 获得超9个赞
AMQP 协议中没有从队列中“选择”消息的机制。
您可能需要考虑使用具有专用消费者的离散队列。
顺便说一句,这与 spring 无关;有关 RabbitMQ 的一般问题应直接咨询rabbitmq-users Google 群组。
添加回答
举报