直播平臺製作,重試機制和死信佇列的合理運用
一、重試機制
spring: rabbitmq: host: 127.0.0.1 port: 5672 virtual-host: mq-test username: ******** password: ******** listener: simple: # ACK模式(none,auto,manual,預設為auto) acknowledge-mode: auto # 開啟重試 retry: # 是否開啟重試機制 enabled: true # 最大重試次數 max-attempts: 5 # 重試間隔(ms) initial-interval: 5000
二、死信佇列
三、重試+死信的實現
spring: rabbitmq: host: 127.0.0.1 port: 5672 virtual-host: mq-test username: ******** password: ******** listener: simple: # ACK模式(預設為auto) acknowledge-mode: auto # 開啟重試 retry: enabled: true max-attempts: 5 initial-interval: 5000
@RabbitListener(queues = RabbitMqConfig.USER_ADD_QUEUE, concurrency = "10") public void userAddReceiver(String data, Message message, Channel channel) throws Exception { UserVo vo = OBJECT_MAPPER.readValue(data, UserVo.class); boolean success = messageHandle(vo); // 透過業務控制是否消費成功,消費失敗則丟擲異常觸發重試 if (!success) { log.error("消費失敗"); throw new Exception("訊息消費失敗"); } }
spring: rabbitmq: host: 127.0.0.1 port: 5672 virtual-host: mq-test username: ******** password: ******** listener: simple: # ACK模式(預設為auto) acknowledge-mode: manual
/** * 訊息最大重試次數 */ private static final int MAX_RETRIES = 3; /** * 重試間隔(秒) */ private static final long RETRY_INTERVAL = 5; private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper(); @RabbitListener(queues = RabbitMqConfig.USER_ADD_QUEUE, concurrency = "10") public void userAddReceiver(String data, Message message, Channel channel) throws IOException, InterruptedException { UserVo vo = OBJECT_MAPPER.readValue(data, UserVo.class); // 重試次數 int retryCount = 0; boolean success = false; // 消費失敗並且重試次數<=重試上限次數 while (!success && retryCount < MAX_RETRIES) { retryCount++; // 具體業務邏輯 success = messageHandle(vo); // 如果失敗則重試 if (!success) { String errorTip = "第" + retryCount + "次消費失敗" + ((retryCount < 3) ? "," + RETRY_INTERVAL + "s後重試" : ",進入死信佇列"); log.error(errorTip); Thread.sleep(RETRY_INTERVAL * 1000); } } if (success) { // 消費成功,確認 channel.basicAck(message.getMessageProperties().getDeliveryTag(), false); log.info("建立訂單資料消費成功"); } else { // 重試多次之後仍失敗,進入死信佇列 channel.basicNack(message.getMessageProperties().getDeliveryTag(), false, false); log.info("建立訂單資料消費失敗"); } }
來自 “ ITPUB部落格 ” ,連結:https://blog.itpub.net/69978258/viewspace-3002918/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- netcore下RabbitMQ佇列、死信佇列、延時佇列及小應用NetCoreMQ佇列
- RabbitMQ使用 prefetch_count優化佇列的消費,使用死信佇列和延遲佇列實現訊息的定時重試,golang版本MQ優化佇列Golang
- RabbitMQ 高階 - 死信佇列MQ佇列
- SpringCloud 2020.0.4 系列之 Stream 訊息出錯重試 與 死信佇列 的實現SpringGCCloud佇列
- Golang 實現 RabbitMQ 的死信佇列GolangMQ佇列
- 用 RabbitMQ 的死信佇列來做定時任務MQ佇列
- 《RabbitMQ》什麼是死信佇列MQ佇列
- Kafka 延時佇列&重試佇列Kafka佇列
- 直播平臺搭建原始碼,java相簿製作原始碼Java
- 直播平臺製作,使用 NProgress 進度條
- 直播平臺製作,SwipeRefreshLayout下拉重新整理的用法
- RabbitMQ 消費端限流、TTL、死信佇列MQ佇列
- 直播平臺原始碼,用CSS製作毛玻璃效果(高斯模糊效果)原始碼CSS
- 直播平臺製作,css之如何清除浮動CSS
- 直播平臺製作,登入頁面的切換
- 面試官:RabbitMQ過期時間設定、死信佇列、延時佇列怎麼設計?面試MQ佇列
- 直播平臺製作,Flutter ChoiceChip 用來實現選擇標籤效果Flutter
- 求教測試平臺底層是如何運作的
- RabbitMQ 學習筆記 -- 12 死信佇列 DLX + TTL 方式實現延遲佇列MQ筆記佇列
- RabbitMQ從零到叢集高可用(.NetCore5.0) - 死信佇列,延時佇列MQNetCore佇列
- 直播平臺製作,支援其他應用開啟,接收其他應用檔案並儲存
- Kafka聯結器深度解讀之錯誤處理和死信佇列Kafka佇列
- 直播平臺製作,base64圖片字串和file之間互相轉換字串
- 如何使用 Laravel 的佇列機制?有哪些場景需要使用佇列 ?Laravel佇列
- RabbitMQ重試機制MQ
- 直播平臺製作,禁止頁面滾動 / 滾動事件穿透事件穿透
- 直播平臺製作,利用python批量讀取儲存圖片Python
- 重試/retrying/retry/重試控制機制
- 你的佇列為啥一直重試 ?佇列
- 告訴你製作直播平臺都需要什麼硬體和軟體的乾貨文
- 直播平臺製作,ViewPager自動輪播,手指按住停止輪播Viewpager
- 直播平臺製作,html+css復刻登入輸入框HTMLCSS
- 直播平臺製作,依靠C語言實現圖片輪播C語言
- Spring Retry重試機制Spring
- 用redis實現訊息佇列(實時消費+ack機制)Redis佇列
- 使用Java和Spring Retry實現重試機制JavaSpring
- 直播平臺製作,Glide載入網路圖,進度條顯示IDE
- 陣列模擬佇列 以及佇列的複用(環形佇列)陣列佇列