實現商品有不少方法,今天將要介紹一種方法,使用RabbitMQ的死信隊列java
1. 建立死信隊列:web
名字:queue.concurrent.test.fixed.len
屬性以下:
微信
注意第一個屬性是死信交換機是啥,第二個屬性是隊列中的最大長度
學習
2. 建立死信交換機:spa
名字:exchange.concurrent.test.remain.net
屬性以下:code
3. 建立剩餘隊列:orm
名字:queue.concurrent.test.remain.len隊列
秒殺的原理:ci
1. 因爲死信隊列有最大長度,當處在消息隊列的消息長度達到最大值時,就會把餘下的消息發送到另外一個隊列,則死信隊列中的消息就是秒殺成功用戶的消息,另外一個隊列的消息就是秒殺失敗的消息
2. 先不要消費消息,要等到秒殺活動結束後再消費這兩個隊列的消息,由於一邊生產一邊消費會使私信隊列達不到最大長度,就不能精準保證秒殺成功的用戶就是固定值。
代碼以下:
@Configuration
public class RabbitConfig {
@Value("${queue.concurrent.test.fixed.len}")
private String secondKillQueueName;
@Value("${exchange.concurrent.test.remain}")
private String deadExchange;
@Bean
public Queue secondKillQueue(){
Map<String, Object> extendArgs = new HashMap<>();
extendArgs.put("x-dead-letter-exchange", deadExchange);
extendArgs.put("x-queue-type", "classic");
extendArgs.put("x-max-length", 200);
Queue queue = new Queue(secondKillQueueName, true, false, false, extendArgs);
return queue;
}
}
@Service
public class RabbitMqSenderService {
@Autowired
private RabbitTemplate template;
public void sendMsgToDeadQueue(String queueName, String msg){
template.convertAndSend(queueName,msg);
}
}
本文分享自微信公衆號 - Java學習進階手冊(javastudyup)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。