摘要
rabbitmq是目前最流行的jms訊息中介軟體之一,效能良好,安全性高,並且維護性更加出色,以下是簡單的概要,待日後深入繼續更新
目錄[-]
rabbit需求文件
隨著系統之間的資料互動越來越頻繁,系統之間需要進行非同步通訊,如何降低系統之間耦合度,實現各系統之間的資料非同步互動,通訊並且不影響平台正常執行,已經成為我們的越來越重視的環節之一,為此,我們採用目前主流訊息中介軟體rabbitmq來實現我們系統的非同步通訊。
rabbitmq是基於amqp協議標準來實現,amqp主要是面向訊息、佇列、路由的訊息佇列協議,具有一定的安全性和可靠性,rabbitmq用於在分布式系統中儲存**訊息,有良好的易用性、擴充套件性、安全性以及高可用性等。
2.1.1exchange(交換器):
乙個exchange可以繫結多個訊息佇列,訊息佇列又可以繫結routekey,使用者發布訊息是通過這個交換器去指定為哪乙個訊息佇列做訊息持久化儲存(持久化可以設定),當不指定routekey,那麼就預設向所有繫結這個exchange的queue中傳送訊息,如果有就到繫結了該routekey的queue中傳送訊息,exchange、queue、route以及繫結關係需要通過中間平台去定義,不建議開發者在**裡去建立對應關係
messagequeue(訊息佇列):訊息佇列,儲存訊息
route:路由
2.1.2系統使用說明
系統接收方:各個系統可以向rabbitmq平台申請建立n個佇列,用來接收來自其他系統傳遞的訊息我們的佇列都是持久化型別的佇列以確保接收的資料能夠durable,乙個佇列可以接收不同publisher傳遞的訊息,也可以是指定publisher傳遞的訊息,規則看上文
客戶端啟動監聽程式,接收來自rabbitmq伺服器傳來的指定佇列儲存的訊息,目前訊息傳輸型別為bytes(大小?),使用者可以設定接收訊息條數,可以設定回執,如果不回執,系統不會再次接收訊息,監聽斷開,訊息重新放回待讀取區
訊息傳送方:
用來向相應的佇列傳輸訊息,可以指定某個佇列,也可以指定exchange繫結的佇列,也可以是帶有route規則的佇列,目前根據現在的需求,exchange的 direct型別已經可以實現目前的基本業務需求了,如果今後需要拓展,再根據相應需求去完善
不得不說,exchange傳輸有以下幾種型別:
2.2.1 fanout:
通過exchange傳輸資料到繫結佇列,如果沒有佇列繫結到該exchange上面,那麼訊息自動刪除
2.2.2 direct:
通過exchange、routekey去匹配訊息佇列,規則是匹配exchange,然後查詢繫結的queues是否有相同的routekey,如果相同則向該佇列儲存訊息
2.2.3 topic:
和direct型別大體是一樣的匹配規則,不同的是topic型別的routekey可以傳遞 「.*」,「.#」位置 「*」、「#」位置可以不固定,萬用字元*指定的是乙個單詞,#可以指定多個單詞,也可是零個
3.1.1 說明
a、 channel.exchangedeclare(exchange_name, "direct", true);
用於建立exchange的,引數1:exchange名稱,引數2:exchange型別,引數3:exchange是否持久化,也就是斷線會自動儲存。
b、 channel.basicpublish(exchange_name, "", null, message.getbytes());
傳送訊息的具體實現方法,
引數1:佇列名
引數2:routekey
說明:routekey如果為空字串「」,那麼就預設傳送到exchange所繫結的queue,如果指定routekey,那麼在exchange傳遞資料時,會新增routekey過濾,也就是說佇列既要滿足繫結exchange也要滿足繫結routekey值匹配(使用者可以在queue裡面繫結routekey和exchange)
引數3:amqp.basicproperties amqp基本引數,請看文件
引數4:訊息內容
c、 channel.close(); 關閉連線
connection.close();
3.1.2 **
public static final string exchange_name
= "zidingyi";
public static boolean sendmsg(string message) throws ioexception, timeoutexception catch (ioexception e) catch (timeoutexception e) finally
return true;
}3.2.1 說明
a、 channel.basicqos(4);
從訊息佇列裡面每次請求四條資料
b、 dowork(message);
這裡是我們對這條訊息做業務處理用的,方法名可以自定義
c、 factory.setautomaticrecoveryenabled(true)
當網路出現問題時,可以實現自行恢復
d、 channel.basicack(envelope.getdeliverytag(), false);
引數1:回發ack 引數 tag,引數2:是否多個
e、 channel.basicconsume("zidingyi2", false, consumer);
引數1:佇列名
引數2:是否需要回執true/fasle 需要/不需要
引數3:消費者
f、 envelope.getdeliverytag()
3.2.2 **
public static void getmsg() throws ioexception, timeoutexception finally }};
channel.basicconsume("zidingyi2", false, consumer);
// /**
// * 第二個引數設定是否回執
// */
// channel.basicconsume("zidingyi2", true, consumer);
}private static void dowork(string task) catch (interruptedexception _ignored) }}
}
CG簡要情況整理
主要學術 acm siggraph www.siggraph.com gdc vedio game developers www.gdconf.com 基本內容 不介紹opengl固定流水線和shader,主要介紹cg涉及到的幾個模組總覽 一 幾何建模 如何表達三維物體 三角麵片 比較好表達,因為三...
GDB用法簡要整理
使用gdb是需要在編譯是指定 g命令,在可執行檔案中新增符號資訊。可以使用gdbgdb executable file等啟動gdb除錯。退出時,命令列輸入quit q或者ctrl d。在gdb命令介面中可以輸入help獲得幫助資訊。使用backtracewherebt可檢視當前執行緒呼叫堆疊。pri...
簡要整理大數進製轉換
大數進製轉換 最間在寫一道大數題的時候被卡了一下,所以準備整理一下大數的運算,先整理大數的進製轉換.進製轉換的重點是被轉換數不斷被餘被除,一般範圍的整數轉換可以直接用 a b,a b 來解決.int 範圍的十進位制轉二進位制 include using namespace std intmain 儲...