問(wèn)題:RabbitMq為什么要單獨(dú)裝一個(gè)延遲插件?
答案:
死信隊(duì)列:就是正常消費(fèi)者在一定時(shí)間內(nèi)沒(méi)有進(jìn)行消費(fèi)的消息會(huì)發(fā)送到死信隊(duì)列中,而會(huì)有消費(fèi)者在監(jiān)聽(tīng)死信隊(duì)列。消費(fèi)者在消息被拒絕、消息TTL過(guò)期、隊(duì)列達(dá)到最大長(zhǎng)度這三種情況下,消息會(huì)被消費(fèi)者轉(zhuǎn)發(fā)到死信隊(duì)列。
延遲隊(duì)列:其實(shí)就是死信隊(duì)列中消息過(guò)期的特殊情況
延遲隊(duì)列應(yīng)用場(chǎng)景:
死信隊(duì)列實(shí)現(xiàn):在以上場(chǎng)景中,就可能需要在RabbitMq中有多個(gè)不同過(guò)期時(shí)間的需求,在這種情況下通過(guò)死信隊(duì)列可以初步實(shí)現(xiàn)如下:在定義隊(duì)列時(shí)并不設(shè)施固定的消息過(guò)期時(shí)間,而在生產(chǎn)者發(fā)送消息時(shí),將過(guò)期時(shí)間作為參數(shù)傳遞到隊(duì)列中,這樣就可以實(shí)現(xiàn)多種不同過(guò)期時(shí)間的需求。
?對(duì)于以上方法存在一個(gè)問(wèn)題:死信隊(duì)列這種多個(gè)過(guò)期時(shí)間共存的情況下如果過(guò)期時(shí)間長(zhǎng)短剛好設(shè)置從小到大的添加順序時(shí),可能沒(méi)有問(wèn)題,但是這在實(shí)際應(yīng)用中不可能的。假設(shè)第一個(gè)過(guò)期時(shí)間為20s,第二個(gè)過(guò)期時(shí)間為2s,這種情況下就會(huì)出現(xiàn)2s之后第二條消息并不會(huì)執(zhí)行到期的操作,而會(huì)等到第一條的過(guò)期時(shí)間到了之后才會(huì)執(zhí)行,這樣在實(shí)際業(yè)務(wù)中就會(huì)出問(wèn)題。原因如下:
?綜上所述:就需要安裝RabbitMq的延遲插件,新增一種交換機(jī)的模式來(lái)解決這個(gè)問(wèn)題!
下載過(guò)程:
1、首先一定一定一定要確定好自己的RabbitMq的版本是多少,這很重要,然后再官網(wǎng)打開(kāi)下載即可。如果你的rabbitmq版本是3.7.x,那就下載v3.8x版本即可,下載連接:https://www.rabbitmq.com/community-plugins.html
安裝過(guò)程(Windows)
1、將.ez壓縮包放到rabbitmq的plugins目錄中\(zhòng)RabbitMQ Server\rabbitmq_server-3.7.7\plugins
2、進(jìn)入sbin目錄,打開(kāi)管理員控制臺(tái),輸入如下命令,顯示類似信息即可:
rabbitmq-plugins enable rabbitmq_delayed_message_exchange
?3、重新雙擊sbin目錄下的rabbitmq-server.bat文件,啟動(dòng)rabbitmq服務(wù)。
注意:如果前面下載的插件版本和rabbitmq版本不匹配,就會(huì)導(dǎo)致無(wú)法啟動(dòng),出現(xiàn)閃退或者顯示BOOT FAILED,刪掉剛才的插件,重新執(zhí)行上面流程即可。
4、啟動(dòng)服務(wù)之后打開(kāi)rabbitmq管理官新增交換機(jī)即可看到新的交換模式。
安裝過(guò)程(Linux【Docker】)
前置條件是在Docker中部署過(guò)RabbitMq。
1、打開(kāi)你的遠(yuǎn)程工具,首先查看docker中已有的容器,主要是為了查看rabbitmq的容器ID
2、將本地下載好的壓縮包傳到服務(wù)器某文件夾下,然后將其復(fù)制到Docker中的RabbitMq容器中的plugins文件夾下。
docker cp /home/rabbitmq_delayed_message_exchange-3.8.0.ez a687ef46141b:/plugins
3、進(jìn)入容器查看該目錄下是否有該壓縮包。
進(jìn)入容器命令:(通過(guò)容器號(hào)或者容器名)
docker exec -it a687ef46141b bash
4、同樣在容器中的命令行執(zhí)行一下命令添加插件。
rabbitmq-plugins enable rabbitmq_delayed_message_exchange
5、退出容器,重啟該容器。
6、在管理端即同樣可以看到新增了一種交換機(jī)模式。
總結(jié):以上就是RabbitMQ的延遲插件的安裝過(guò)程!
基于插件的延遲隊(duì)列DEMO
成功安裝RabbitMQ的延遲插件之后,我們就可以嘗試寫(xiě)一個(gè)延遲隊(duì)列來(lái)驗(yàn)證一下是否可以解決上述問(wèn)題。
首先我們的測(cè)試環(huán)境是在一個(gè)Springboot的框架下完成!
1、最先寫(xiě)配置類
/**
* 定義延遲交換機(jī)
*/
@Configuration
public class RabbitMQDelayedConfig {
//隊(duì)列
private static final String DELAYQUEUE = "delayedqueue";
//交換機(jī)
private static final String DELAYEXCHANGE = "delayedExchange";
@Bean
public Queue delayqueue(){return new Queue(DELAYQUEUE);}
//自定義延遲交換機(jī)
@Bean
public CustomExchange delayedExchange(){
Map<String, Object> arguments = new HashMap<>();
arguments.put("x-delayed-type","direct");
/**
* 1、交換機(jī)名稱
* 2、交換機(jī)類型
* 3、是否需要持久化
* 4、是否需要自動(dòng)刪除
* 5、其他參數(shù)
*/
return new CustomExchange(DELAYEXCHANGE,"x-delayed-message",true,false,arguments);
}
//綁定隊(duì)列和延遲交換機(jī)
@Bean
public Binding delaybinding(){
return BindingBuilder.bind(delayqueue()).to(delayedExchange()).with("sectest").noargs();
}
}
2、先寫(xiě)生產(chǎn)者
/**
* 基于插件的延遲隊(duì)列
* 消息生產(chǎn)者
*/
@Service
@Slf4j
public class DelayMQSender {
@Autowired
private RabbitTemplate rabbitTemplate;
public void sendmsg(String message,Integer delaytime){
log.info("當(dāng)前時(shí)間:{},發(fā)送時(shí)長(zhǎng){}信息給延遲隊(duì)列:{}",new Date().toString(),delaytime,message);
rabbitTemplate.convertAndSend("delayedExchange","sectest",message,msg->{
//設(shè)置發(fā)送消息的延長(zhǎng)時(shí)間 單位:ms
msg.getMessageProperties().setDelay(delaytime);
return msg;
});
}
}
3、再寫(xiě)消費(fèi)者
/**
* 基于插件的延遲隊(duì)列
* 消息的消費(fèi)者
*/
@Service
@Slf4j
public class DelayMQReceiver {
@RabbitListener(queues = "delayedqueue")
public void receivemsg(Message messages){
String msg = new String(messages.getBody());
log.info("當(dāng)前時(shí)間:{},接收時(shí)長(zhǎng)信息給延遲隊(duì)列:{}",new Date().toString(),msg);
}
}
4、進(jìn)行測(cè)試
將模擬請(qǐng)求放在了一個(gè)簡(jiǎn)易的網(wǎng)頁(yè)上,點(diǎn)擊后輸出如下結(jié)果,證明當(dāng)先發(fā)送了20s延時(shí)的消息,再發(fā)送2s延時(shí)的消息,在2s后消息正常被消費(fèi),基于插件的延遲隊(duì)列完美解決了問(wèn)題。
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-484005.html
【思考】:如果在實(shí)際業(yè)務(wù)場(chǎng)景中使用延遲隊(duì)列的話,那就需要服務(wù)端在消息被消費(fèi)之后主動(dòng)告訴前端消費(fèi)的結(jié)果,如果是這樣的話,那么Ajxs的通信方式是單雙工通信,只能前端主動(dòng)訪問(wèn)后端并返回結(jié)果,后端無(wú)法主動(dòng)發(fā)送消息,應(yīng)該使用Websocket來(lái)進(jìn)行通信才可,websocket是長(zhǎng)連接,不同于http的短連接,可以實(shí)現(xiàn)全雙工通信,前后端都可以主動(dòng)發(fā)送消息。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-484005.html
到了這里,關(guān)于RabbitMQ延遲插件【安裝windows/Linux(Docker)】的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!