国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Spring RabbitMQ那些事(2-兩種方式實(shí)現(xiàn)延時(shí)消息訂閱)

這篇具有很好參考價(jià)值的文章主要介紹了Spring RabbitMQ那些事(2-兩種方式實(shí)現(xiàn)延時(shí)消息訂閱)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

一、序言

業(yè)務(wù)開發(fā)中有很多延時(shí)操作的場(chǎng)景,比如最常見的超時(shí)訂單自動(dòng)關(guān)閉、延時(shí)異步處理,我們常用的實(shí)現(xiàn)方式有:

  • 定時(shí)任務(wù)輪詢(有延時(shí))。
  • 借助Redission的延時(shí)隊(duì)列。
  • Redis的key過期事件通知機(jī)制(需開啟key過期事件通知,對(duì)Redis有性能損耗)。
  • RocketMQ中定時(shí)消息推送(支持的時(shí)間間隔固定,不支持自定義)。
  • RabbitMQ中的死信隊(duì)列和延遲消息交換機(jī)。

其中用的最多的也是借助Redisson實(shí)現(xiàn)的數(shù)據(jù)結(jié)構(gòu)延遲隊(duì)列RabbitMQ中的死信隊(duì)列來實(shí)現(xiàn),今天我們通過RabbitMQ死信隊(duì)列和延遲消息交換機(jī)(新特性)來實(shí)現(xiàn)延時(shí)消息推送。


二、死信交換機(jī)和消息TTL實(shí)現(xiàn)延遲消息

1、死信隊(duì)列介紹

這種方式主要通過結(jié)合消息過期和私信交換機(jī)來實(shí)現(xiàn)延遲消息推送,首先先了解下哪些消息會(huì)進(jìn)入死信隊(duì)列:

  • 被消費(fèi)者nack(negatively acknowleged)的消息。
  • TTL過期后未被消費(fèi)的消息。
  • 超過隊(duì)列長(zhǎng)度限制后被丟棄的消息。

備注:更多信息請(qǐng)參考RabbitMQ中的 Dead Letter Exchange。

2、代碼示例

(1) 死信交換機(jī)配置

@Configuration
protected static class DeadLetterExchangeConfig {

	@Bean
	public Queue deadLetterQueue(){
		return QueueBuilder.durable("dead-letter-queue").build();
	}

	@Bean
	public DirectExchange deadLetterExchange() {
		return ExchangeBuilder.directExchange("dead-letter-exchange").build();
	}

	@Bean
	public Binding bindQueueToDeadLetterExchange(Queue deadLetterQueue, DirectExchange deadLetterExchange) {
		return BindingBuilder.bind(deadLetterQueue).to(deadLetterExchange).with("dead-letter-routing-key");
	}

	@Bean
	public Queue normalQueue() {
		return QueueBuilder.durable("normal-queue")
			.deadLetterExchange("dead-letter-exchange")
			.deadLetterRoutingKey("dead-letter-routing-key")
			.build();
	}

}

(2) 消息生產(chǎn)者

@Slf4j
@Component
@RequiredArgsConstructor
public class RabbitMqProducer {

	private final RabbitTemplate rabbitTemplate;
	
	public void sendMsgToDeadLetterExchange(String body, int timeoutInMillSeconds) {
		log.info("開始發(fā)送消息到dead letter exchange 消息體:{}, 消息延遲:{}ms, 當(dāng)前時(shí)間:{}", body, timeoutInMillSeconds, LocalDateTime.now());
		MessageProperties messageProperties = MessagePropertiesBuilder.newInstance().setExpiration(String.valueOf(timeoutInMillSeconds)).build();
		Message message = MessageBuilder.withBody(body.getBytes(StandardCharsets.UTF_8)).andProperties(messageProperties).build();
		rabbitTemplate.send("normal-queue", message);
	}
	
}

(3) 消息消費(fèi)者

@Slf4j
@Component
public class RabbitMqConsumer {

	@RabbitListener(queues = "dead-letter-queue")
	public void handleMsgFromDeadLetterQueue(String msg) {
		log.info("Message received from dead-letter-queue, message body: {}, current time:{}", msg, LocalDateTime.now());
	}
}

3、測(cè)試用例

@RestController
@RequiredArgsConstructor
public class RabbitMsgController {

	private final RabbitMqProducer rabbitMqProducer;
	
	@RequestMapping("/exchange/dead-letter")
	public ResponseEntity<String> sendMsgToDeadLetterExchange(String body, int timeout) {
		rabbitMqProducer.sendMsgToDeadLetterExchange(body, timeout);
		return ResponseEntity.ok("消息發(fā)送到死信交換機(jī)成功");
	}
	
}

瀏覽器訪問http://localhost:8080/exchange/dead-letter?body=hello&timeout=5000,可以看到消息被延遲5s處理。

2023-11-26 11:50:33.041  INFO 19152 --- [nio-8080-exec-7] c.u.r.i.producer.RabbitMqProducer        : 開始發(fā)送消息到dead letter exchange 消息體:hello, 消息延遲:5000ms, 當(dāng)前時(shí)間:2023-11-26T11:50:33.041
2023-11-26 11:50:38.054  INFO 19152 --- [ntContainer#4-4] c.u.r.i.consumer.RabbitMqConsumer        : Message received from dead-letter-queue, message body: hello, current time:2023-11-26T11:50:38.054

三、延遲消息交換機(jī)實(shí)現(xiàn)延遲消息

上面通過消息TTL和死信交換機(jī)實(shí)現(xiàn)延遲消息的解決方案是由一個(gè)叫James Carr的人提出來的,后來RabbitMQ提供了一個(gè)開箱即用的解決方案,通過延時(shí)消息插件來實(shí)現(xiàn)。

該插件以前被當(dāng)做是試驗(yàn)性產(chǎn)品,但是現(xiàn)在已經(jīng)可以投產(chǎn)使用了。(PS:2015年4月16號(hào)就已經(jīng)有該插件文檔)

Spring AMQP中,同樣提供了對(duì)該延時(shí)消息插件的支持,并且在RabbitMQ 3.6.0版本就已經(jīng)測(cè)試通過。

1、安裝延時(shí)消息插件

該延時(shí)消息插件為社區(qū)插件,因此需要自己手動(dòng)下載安裝的RabbMQ版本對(duì)應(yīng)的插件,下載地址:RabbitMQ延時(shí)消息插件releases。

我安裝的RabbitMQ版本為3.9.9,3.9.0版本的插件對(duì)所有3.9.x版本的RabbitMQ都支持。

Spring RabbitMQ那些事(2-兩種方式實(shí)現(xiàn)延時(shí)消息訂閱),RabbitMQ,Java面試題,中間件專題,java-rabbitmq,spring,rabbitmq
下載完后把.ez結(jié)尾的插件復(fù)制RabbitMQ的插件目錄下,插件目錄為/usr/lib/rabbitmq/plugins 。

Spring RabbitMQ那些事(2-兩種方式實(shí)現(xiàn)延時(shí)消息訂閱),RabbitMQ,Java面試題,中間件專題,java-rabbitmq,spring,rabbitmq
通過命令rabbitmq-plugins enable rabbitmq_delayed_message_exchange安裝該插件,通過命令rabbitmq-plugins list查看插件列表,可以看到該延時(shí)消息插件已經(jīng)成功安裝。

Spring RabbitMQ那些事(2-兩種方式實(shí)現(xiàn)延時(shí)消息訂閱),RabbitMQ,Java面試題,中間件專題,java-rabbitmq,spring,rabbitmq

2、代碼示例

(1) 延時(shí)消息交換機(jī)配置

@Configuration
protected static class DelayedMsgExchangePluginConfig {

	@Bean
	public Queue delayedQueue() {
		return QueueBuilder.durable("delayed-queue").build();
	}

	@Bean
	public DirectExchange delayedExchange() {
		return ExchangeBuilder.directExchange("delayed-exchange").delayed().build();
	}

	@Bean
	public Binding bindDelayedQueueToDelayedChange(Queue delayedQueue, DirectExchange delayedExchange) {
		return BindingBuilder.bind(delayedQueue).to(delayedExchange).with("delayed-routing-key");
	}
}

備注:延時(shí)交換機(jī)的類型可以為DirectExchage、TopicExcahgeFanoutExchange,這些都支持。

(2) 消息生產(chǎn)者

@Slf4j
@Component
@RequiredArgsConstructor
public class RabbitMqProducer {

	private final RabbitTemplate rabbitTemplate;

	public void sendDelayedMsg(String body, int timeoutInMillSeconds) {
		log.info("開始發(fā)送消息到delayed-exchange 消息體:{}, 消息延遲:{}ms, 當(dāng)前時(shí)間:{}", body, timeoutInMillSeconds, LocalDateTime.now());
		MessageProperties messageProperties = new MessageProperties();
		messageProperties.setDelay(timeoutInMillSeconds);
		Message message = MessageBuilder.withBody(body.getBytes(StandardCharsets.UTF_8)).andProperties(messageProperties).build();
		rabbitTemplate.send("delayed-exchange", "delayed-routing-key", message);
	}
}

(3) 消息消費(fèi)者

@Slf4j
@Component
public class RabbitMqConsumer {

	@RabbitListener(queues = "delayed-queue")
	public void handleMsgFromDelayedQueue(String msg) {
		log.info("Message received from delayed-queue, message body: {}, current time:{}", msg, LocalDateTime.now());
	}
}

3、測(cè)試用例

@RestController
@RequiredArgsConstructor
public class RabbitMsgController {

	private final RabbitMqProducer rabbitMqProducer;

	@RequestMapping("/exchange/delayed")
	public ResponseEntity<String> sendMsgToHeadersExchange(String body, int timeout) {
		rabbitMqProducer.sendDelayedMsg(body, timeout);
		return ResponseEntity.ok("消息發(fā)送到延遲交換機(jī)成功");
	}
	
}

瀏覽器訪問http://localhost:8080/exchange/dead-letter?body=hello&timeout=5000,可以看到消息被延遲5s處理。

2023-11-26 13:02:07.816  INFO 26524 --- [nio-8080-exec-3] c.u.r.i.producer.RabbitMqProducer        : 開始發(fā)送消息到delayed-exchange 消息體:Hello, 消息延遲:5000ms, 當(dāng)前時(shí)間:2023-11-26T13:02:07.816
2023-11-26 13:02:12.830  INFO 26524 --- [ntContainer#5-5] c.u.r.i.consumer.RabbitMqConsumer        : Message received from delayed-queue, message body: Hello, current time:2023-11-26T13:02:12.829

四、兩種實(shí)現(xiàn)方式優(yōu)缺點(diǎn)

1、延時(shí)消息插件

  • 優(yōu)點(diǎn):配置更加簡(jiǎn)單,少配置1個(gè)過期消息接收隊(duì)列,且語(yǔ)義更明確,容易定位消息出入口。
  • 缺點(diǎn):延時(shí)消息插件對(duì)RabbitMQ版本有要求,只有RabbitMQ 3.8.x及以上版本支持。

2、TLL&死信交換機(jī)

  • 優(yōu)點(diǎn):基本適用于所有RabbitMQ版本。
  • 缺點(diǎn):配置相對(duì)來說復(fù)雜一些,還有就是我們最開始提到的,不只是TTL過期的消息才會(huì)進(jìn)入死信隊(duì)列,還有超出隊(duì)列限制nack的消息也會(huì)進(jìn)入死信隊(duì)列,觸發(fā)的條件沒那么純粹。

Spring RabbitMQ那些事(2-兩種方式實(shí)現(xiàn)延時(shí)消息訂閱),RabbitMQ,Java面試題,中間件專題,java-rabbitmq,spring,rabbitmq文章來源地址http://www.zghlxwxcb.cn/news/detail-765301.html

到了這里,關(guān)于Spring RabbitMQ那些事(2-兩種方式實(shí)現(xiàn)延時(shí)消息訂閱)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • RabbitMQ實(shí)現(xiàn)延遲消息,RabbitMQ使用死信隊(duì)列實(shí)現(xiàn)延遲消息,RabbitMQ延時(shí)隊(duì)列插件

    RabbitMQ實(shí)現(xiàn)延遲消息,RabbitMQ使用死信隊(duì)列實(shí)現(xiàn)延遲消息,RabbitMQ延時(shí)隊(duì)列插件

    假設(shè)有一個(gè)業(yè)務(wù)場(chǎng)景:超過30分鐘未付款的訂單自動(dòng)關(guān)閉,這個(gè)功能應(yīng)該怎么實(shí)現(xiàn)? RabbitMQ使用死信隊(duì)列,可以實(shí)現(xiàn)消息的延遲接收。 隊(duì)列有一個(gè)消息過期屬性。就像豐巢超過24小時(shí)就收費(fèi)一樣,通過設(shè)置這個(gè)屬性,超過了指定事件的消息將會(huì)被丟棄。 這個(gè)屬性交:x-message

    2024年02月13日
    瀏覽(104)
  • 使用StreamBridge實(shí)現(xiàn)RabbitMq 消息收發(fā) && ack確認(rèn) && 延時(shí)消息

    使用StreamBridge實(shí)現(xiàn)RabbitMq 消息收發(fā) && ack確認(rèn) && 延時(shí)消息

    下載地址:link 1.下載完成放到rabbitmq安裝目錄plugins下 2.執(zhí)行命令啟用插件 3.重啟mq Exchanges - add a new exchange - type 出現(xiàn)x-delayed-message即安裝成功

    2024年02月11日
    瀏覽(56)
  • 使用RabbitMQ實(shí)現(xiàn)延時(shí)消息自動(dòng)取消的簡(jiǎn)單案例
  • .Net 6 下WorkerService+RabbitMq實(shí)現(xiàn)消息的異步發(fā)布訂閱

    ? ? ? ? 近期項(xiàng)目里有需要用到RabbitMq實(shí)現(xiàn)一些業(yè)務(wù),學(xué)習(xí)整理之后在此記錄一下,如有問題或者不對(duì)的地方,歡迎留言指正。 注意: 多線程消息發(fā)布時(shí),應(yīng)避免多個(gè)線程使用同一個(gè)IModel實(shí)例,必須保證Imodel被一個(gè)線程獨(dú)享,如果必須要多個(gè)線程訪問呢一個(gè)實(shí)例的話,則可以

    2024年01月18日
    瀏覽(35)
  • Spring整合RabbitMQ-配制文件方式-3-消息拉模式

    拉消息的消費(fèi)者 spring-rabbit.xml 當(dāng)啟動(dòng)消費(fèi)者后,便可獲取到發(fā)送至隊(duì)列的消息 檢查隊(duì)列的消息的情況: 經(jīng)過檢查確認(rèn),發(fā)現(xiàn)消息已經(jīng)被消費(fèi)了。 至此拉模式的消費(fèi)者完成。

    2024年02月09日
    瀏覽(19)
  • Spring整合RabbitMQ-配制文件方式-1-消息生產(chǎn)者

    Spring-amqp是對(duì)AMQP的一些概念的一些抽象,Spring-rabbit是對(duì)RabbitMQ操作的封裝實(shí)現(xiàn)。 主要有幾個(gè)核心類 RabbitAdmin 、 RabbitTemplate 、 SimpleMessageListenerContainer 等 RabbitAdmin 類完成對(duì)Exchange、Queue、Binding的操作,在容器中管理 了 RabbitAdmin 類的時(shí)候,可以對(duì)Exchange、Queue、Binding進(jìn)行自動(dòng)聲

    2024年02月09日
    瀏覽(34)
  • 【Spring Boot】集成Kafka實(shí)現(xiàn)消息發(fā)送和訂閱

    【Spring Boot】集成Kafka實(shí)現(xiàn)消息發(fā)送和訂閱

    最近忙著搞低代碼開發(fā),好久沒新建spring項(xiàng)目了,結(jié)果今天心血來潮準(zhǔn)備建個(gè)springboot項(xiàng)目 注意Type選Maven,java選8,其他默認(rèn) 點(diǎn)下一步后完成就新建了一個(gè)spring boot項(xiàng)目,配置下Maven環(huán)境,主要是settings.xml文件,里面要包含阿里云倉(cāng)庫(kù),不然可能依賴下載不下來 在maven配置沒問

    2024年02月09日
    瀏覽(32)
  • 使用Spring Boot和Kafka實(shí)現(xiàn)消息訂閱和發(fā)送

    使用Spring Boot和Kafka實(shí)現(xiàn)消息訂閱和發(fā)送

    最近忙著搞低代碼開發(fā),好久沒新建spring項(xiàng)目了,結(jié)果今天心血來潮準(zhǔn)備建個(gè)springboot項(xiàng)目 注意Type選Maven,java選8,其他默認(rèn) 點(diǎn)下一步后完成就新建了一個(gè)spring boot項(xiàng)目,配置下Maven環(huán)境,主要是settings.xml文件,里面要包含阿里云倉(cāng)庫(kù),不然可能依賴下載不下來 在maven配置沒問

    2024年02月11日
    瀏覽(25)
  • 使用Spring Boot和Kafka實(shí)現(xiàn)消息發(fā)送和訂閱

    使用Spring Boot和Kafka實(shí)現(xiàn)消息發(fā)送和訂閱

    最近忙著搞低代碼開發(fā),好久沒新建spring項(xiàng)目了,結(jié)果今天心血來潮準(zhǔn)備建個(gè)springboot項(xiàng)目 注意Type選Maven,java選8,其他默認(rèn) 點(diǎn)下一步后完成就新建了一個(gè)spring boot項(xiàng)目,配置下Maven環(huán)境,主要是settings.xml文件,里面要包含阿里云倉(cāng)庫(kù),不然可能依賴下載不下來 在maven配置沒問

    2024年02月11日
    瀏覽(32)
  • RabbitMq應(yīng)用延時(shí)消息

    RabbitMq應(yīng)用延時(shí)消息

    一.建立綁定關(guān)系 二.建立生產(chǎn)者 1.消息實(shí)體 三.建立消費(fèi)者 四.測(cè)試類測(cè)試 五.效果如圖所示

    2024年02月12日
    瀏覽(24)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包