2 回答

TA貢獻1942條經(jīng)驗 獲得超3個贊
我不知道實施您所描述的先發(fā)制人策略的方法,但是您可以考慮許多其他選擇。
優(yōu)先級設(shè)定
首先要考慮的是priority
RabbitMQ 本身的支持。
考慮一下 Gavin M. Roy 的《RabbitMQ in Depth》中的摘錄:
“從 RabbitMQ 3.5.0 開始,優(yōu)先級字段已按照 AMQP 規(guī)范實現(xiàn)。它被定義為一個整數(shù),可能的值為 0 到 9,用于隊列中的消息優(yōu)先級排序。根據(jù)規(guī)定,如果發(fā)布了優(yōu)先級為 9 的消息,隨后又發(fā)布了優(yōu)先級為 0 的消息,則新連接的消費者將先于優(yōu)先級為 9 的消息接收到優(yōu)先級為 0 的消息。
例如
rabbitTemplate.convertAndSend("Hello World!", message -> {
MessageProperties properties = MessagePropertiesBuilder.newInstance()
.setPriority(0)
.build();
return MessageBuilder.fromMessage(message)
.andProperties(properties)
.build();
});
基于優(yōu)先級的交換
第二種選擇是定義主題交換并定義考慮您的優(yōu)先級的路由鍵。
例如,考慮events使用模式的路由密鑰進行交換,EventName.Priority例如OrderPlaced.High、OrderPlaced.Normal或OrderPlaced.Low。
基于此,您可以有一個隊列僅綁定到高優(yōu)先級的訂單,即OrderPlaced.High和多個專用于該隊列的消費者。
例如
String routingKey = String.format("%s.%s", event.name(), event.priority());
rabbit.convertAndSend(routingKey, event);
使用如下所示的偵聽器,其中隊列使用路由鍵high-priority-orders綁定到events事件OrderPlaced和優(yōu)先級的交換器。HighOrderPlaced.High
@Component
@RabbitListener(queues = "high-priority-orders", containerFactory="orders")
public class HighPriorityOrdersListener {
@RabbitHandler
public void onOrderPlaced(OrderPlacedEvent orderPlaced) {
//...
}
}
顯然,您將需要一個專用的線程池(在orders上面的容器工廠中)來處理高優(yōu)先級請求。

TA貢獻2019條經(jīng)驗 獲得超9個贊
AMQP 協(xié)議中沒有從隊列中“選擇”消息的機制。
您可能需要考慮使用具有專用消費者的離散隊列。
順便說一句,這與 spring 無關(guān);有關(guān) RabbitMQ 的一般問題應(yīng)直接咨詢rabbitmq-users Google 群組。
添加回答
舉報