1. 程式人生 > >RabbitMq六種使用模式(2)_多個消費者

RabbitMq六種使用模式(2)_多個消費者

上一篇文章中,一個佇列只有一個消費者,其實可以同時有多個消費者從同一佇列裡面取訊息,如何分配有rabbitmq伺服器決定;


程式碼基本上如上文一致,只是有多個consumer在監控著佇列,每個consumer獨立處理獲取的訊息;

1:訊息的確認機制

目前的程式碼,一旦consumer獲取到message,那麼這個message就立刻從queue裡面移除(自動的訊息接收確認);但是如果還沒有處理該message,worker被kill,那麼這個訊息就沒有被成功處理;此外,一個consumer可能同時收到了多個訊息,這些訊息也相當於丟失;        此時,需要使用訊息的手動確認機制,處理成功之後,通知rabbitmq伺服器將訊息刪除;如果沒有收到確認訊息,改訊息狀態變成unacked,不會刪除;如果rabbitmq重啟或者當前client連結失效或者當前worker失效,unacked的訊息會參與重新分配,有consumer重新處理;
QueueingConsumer consumer = new QueueingConsumer(channel);
boolean autoAck = false;//預設的是true,自動確認
channel.basicConsume("hello", autoAck, consumer);

while (true) {
  QueueingConsumer.Delivery delivery = consumer.nextDelivery();  //此時,consumer可能已經從rabbitmq獲得和多個訊息
  channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);
  //delivery.getEnvelope().getDeliveryTag()訊息的標識,false只確認當前一個訊息收到,true確認所有consumer獲得的訊息
}

2:訊息的持久化 目前程式碼,訊息仍然有可能丟失;如果rabbitmq伺服器掛掉,佇列和訊息都沒有被持久化;     
boolean durable = true;
channel.queueDeclare("hello", durable, false, false, null);
//宣告該佇列需要持久化
   此外訊息也需要被持久化,有可能rabbitmq收到了訊息但是還沒有放入佇列,伺服器掛了,此時訊息仍有可能丟失;
channel.basicPublish("", "task_queue",MessageProperties.PERSISTENT_TEXT_PLAIN,message.getBytes());


3:公平的訊息分發 目前的訊息佇列,分發訊息時沒有考慮consumer的具體情況,有可能造成有的consumer負載過重,有的consumer負載太輕;      應該考慮consumer沒有確認訊息的數量,如果unacked的訊息過多,則應該少往此consumer傳送訊息;      
int prefetchCount = ;//maximum number of messages that the server will deliver, 0 if unlimited
channel.basicQos(prefetchCount);//

相關推薦

RabbitMq使用模式(2)_消費者

上一篇文章中,一個佇列只有一個消費者,其實可以同時有多個消費者從同一佇列裡面取訊息,如何分配有rabbitmq伺服器決定; 程式碼基本上如上文一致,只是有多個consumer在監控著佇列,每個consumer獨立處理獲取的訊息; 1:訊息的確認機制 目前的程式碼,一旦co

易學筆記-RabbitMQ教程2:一個生產者和消費者

易學筆記 十年IT經驗個人學習筆記分享: 開發語言:C/C++/JAVA/PYTHON/GO/JSP WEB架構:Servlets/springMVC/springBoot/springClound 容器架構:Docker容器/Docker叢集/Docker與微服務整合/

RabbitMQ工作模式有哪些?怎樣用SpringBoot整合RabbitMQ

目錄 一、RabbitMQ入門程式 二、Work queues 工作模式 三、Publish / Subscribe 釋出/訂閱模式 四、Routing 路由模式 五、Topics 六、Header 七、RPC 八、Spring Data Elasticsearch 一、RabbitMQ入門程式 <

php擴展開發筆記(2源代碼文件的配置和編譯

nes repr 過程 http fadein ews add ng- star 我們在開發過程中,為了代碼得可讀性和易維護性,肯定是須要多個代碼文件的,而不不過通過 ext_skel 生成得骨架文件。這篇文章主要介紹下。多個代碼文件的時候。我們須要註意

linux日常維護(rsync介紹,常用選項,rsync模式

rsync介紹 rsync常用選項 rsync六種模式 一、rsync介紹rsync命令是一個遠程數據同步工具,可通過LAN/WAN快速同步多臺主機間的文件。rsync使用所謂的“rsync算法”來使本地和遠程兩個主機之間的文件達到同步,這個算法只傳送兩個文件的不同部分,而不是每次都整份傳送,因此

isco 的模式(cisco 系統)

ESS cisc type fff ado ges image text 技術 isco 的六種模式(cisco 系統)

單例的兩實現方式、版本及利弊對照

        單例設計模式,顧明思議,只有一個例項,先交代重要一點,為防止外界對該類進行例項化,需要把類的建構函式宣告為私有的,這樣大家對原理理解更深入些。 1、餓漢式 餓漢模式單例程式碼,經典,可用,無需改進。 package com.sing

Python 訊息佇列rabbitmq使用之工作佇列使用worker接收訊息

前面已經介紹過怎麼安裝rabbitmq以及要使用的三方庫 因此這裡直接進入例項 1、釋出端程式碼 # new_task.py import pika # 匯入pika import sys

如果findChessboardCorners函式找到了2角點。。

findChessboardCorners函式的一個問題 今天我使用openCV3標定相機,在使用findChessboardCorners函式的時候,程式卡死在drawChessboardCorners函式,輸出findChessboardCorners找到的角點,有1億8千多萬個

RabbitMQ模式

佇列模式 五種佇列 Queue——簡單佇列 Work queue——Work模式 Publish/Subscribe——釋出/訂閱者模式 Routing——路由模式 Topics——

RabbitMQ訊息通訊,一個生產者和消費者,廣播式訊息通訊

上一則我們說到了一個對多個的RabbitMQ訊息佇列通訊的實現方法,生產者傳送的訊息只能被一個消費者接收並處理,上則請閱讀:http://blog.csdn.net/u012631731/article/details/78450389 本則說的是廣播式的訊息通訊方法實現,

RabbitMQ訊息通訊,一個生產者和消費者

上一則文章講解了RabbitMQ的安裝和簡單一對一訊息通訊實現方法,具體可參考上一篇文章:http://blog.csdn.net/u012631731/article/details/72887588 這則文章講述一個生產者和多個消費者的訊息通訊。 直接上原始碼,在原始

命令列模式下編譯C/C++原始檔

最近在學習linux,需要經常使用命令列,這時才發現熟悉命令列之後,命令列真的很強大,也很有逼格 由於在linux系統中需要在命令列格式下對C語言進行編譯,順便也研究了一下windows系統下的命令列編譯,感覺也蠻方便的。 單個原始檔編譯 linux系統下:g++ pro

oracle全文索引_欄位按照關鍵字的匹配度排序

在網上看到oracle全文索引都是對一張表一個欄位進行全文檢索,我想對多個表多個欄位按照關鍵字的匹配度排序,sql語句如下 select score(1)  ,score(2), CDA.AREANAME,CDS.STREETNAME from  C_DICT_STREE

微服務理論與實踐(四)----微服務架構的模式

1.微服務架構模式方案 用Scale Cube方法設計應用架構,將應用服務按功能拆分成一組相互協作的服務。每個服務負責一組特定、相關的功能。每個服務可以有自己獨立的資料庫,從而保證與其他服務解耦。 1.1 聚合器微服務設計模式         聚合器呼叫多個服務實現

java_執行緒_socket通訊_客戶端傳送,伺服器響應

/** * 伺服器端不斷接受請求 * 接受一個請求開啟一段執行緒 */ package 練習0927; import java.io.BufferedReader; import java.io.IOException; import java.io.InputSt

js_對同名id 新增 事件_物件如何繫結同一事件

$("[id='s_username']").change(function(){ if($("[id='s_username']").val()==''){ $

active mq 消費者實戰(釋出訂閱模式

            注意:所有的配置檔案都在src檔案下            宣告:  在這裡不講activemq 是什麼,本人只是根據平時用到的東西整理一下希望對大家有所幫助。         首先是生產者的配置檔案 <?xml version="1.0" e

科略教育—企業管理的模式

決策 https 生涯 mage -o 優化 pro 績效管理 可見 企業管控模式常見六種,其中最常用的是三種:客戶導向的組織結構模式,前後端型組織結構模式以及產品導向的組織結構模式,同時還認為,不同的組織結構模式適應企業在不同的發展階段來使用,不可從以一而終,組織結構模式

Disruptor消費者不重復處理生產者發送過來的消息

all instance add reads 字節 mil consumer win 類型 1、定義事件事件(Event)就是通過 Disruptor 進行交換的數據類型。 package com.ljq.disruptor; import java.io.Se