麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學院 > 開發設計 > 正文

封裝RabbitMQ.NETLibrary的一點經驗總結

2019-11-14 14:03:39
字體:
來源:轉載
供稿:網友

這篇文章內容會很短,主要是想給大家分享下我最近在做一個簡單的rabbitmq客戶端類庫的封裝的經驗總結,說是簡單其實一點都不簡單。為了節省時間我主要按照Library的執行順序來介紹,在你看來這里僅僅是一個簡單的經驗總結,但是在我看來這些經驗只有在你真正的封裝rabbitmq客戶端庫的時候且將你的客戶端安全穩定的發布上線后才會真的發現這些問題。

比如你的庫只是鏈接單個Node的時候和鏈接高可用集群的HAPRoxy時候是完全兩回事。當你未能在你的庫里使用反向注入LOG接口的時候一旦在線上發生網絡解析和序列化等一系列在線問題時候你是多么無能為力。當你使用同步循環獲取隊列消息的時候一旦發生異常你的鏈接就會斷掉等等這些細節。我總結了我在編寫這個library的時候慢慢穩定下來的過程和經驗。至少目前來看網絡上的文章,當然我是指.NET/C#方面的,都沒有講到這些問題,大部分的文章都是簡單的介紹了一個最最基本的使用和最最基本的demo而已,達不到企業級使用的要求。在這個過程中,感謝我的團隊和給過我指導的同事,讓我明白了一些技術道理。

好東西不能石沉大海,尤其是.NET領域更需要這樣的東西來填補這一空缺。廢話不多說了,進入主題,那些編寫框架和組件的大道理這里就不講了,我只說重點。

1.發送鏈接、通道和接受鏈接、通道要關注點分離

就是說你的接受Channel和發送的Channel要分離開,如果不分開會出現偶發性的消息串掉的錯誤,我這里現在沒有環境無法重現截圖。我是在做壓力測試的時候,用了一個Channel的時候Debug拋出來的異常。如果你有潔癖建議把IConnection也分離開。這樣不容易出錯,就算出錯排錯也會很容易。

(圖1:分開接受和發送的IConnection、Channel)

還有一點,不要將這些對象直接散落在直接使用的Client類中,要建立起一個使用上下文,就算你暴露在外面的是一個具體的類但是那個類也是一個空殼子。

2.客戶端發送消息的時候要標記上消息的持久化狀態

我們可以在創建隊列的時候設置此隊列是持久化的,但是隊列中的消息要在我們發送某個消息的時候打上需要持久化的狀態標記。

(圖2:標記此消息是需要持久化的)

3.要在監聽的線程入口后加try{}catch{}

(圖1:在線程內部方法中加try{}catch{})

這個點很多做封裝的人會容易忽視掉,我這里補充下為了保持這個文章的完整性。

其實在我之前的“.NET應用架構設計—服務端開發多線程使用小結(多線程使用常識)”一文中有講到過。

這個時候你的try{}catch{}其實是不會捕獲到任何ListenInit方法中的異常的,因為他在另外一個線程上下文中執行的。具體原理這里就不解釋了。但是可以很容易的理解就是,你這個方法一旦執行就會立馬返回了。

4. 初始化的監聽連接的時候要訂閱Shutdown事件記錄下LOG

(圖4:監聽Shutdown事件,記錄下LOG便于排查和監管服務的穩定性)

5. 要在內部定義一個LOG反向注入接口

(圖5:組件內部的LOG接口)

此接口就是你內部用來將信息傳輸出去的渠道,而且這個渠道是活的,有各個應用系統決定怎么記錄。

簡單處理你還需要一個LOG接口服務定位器對象,要不然你拿不到這個接口實例。

(圖6:LOG location對象)

6. 千萬不要使用while(true)接受消息

如果我們是使用死循環的方式在接受消息,那么一旦當你的接受消息的程序出現異常那么你的while直接就會跳出,你的鏈接可能是還鏈接在服務器上但是你的channel已經斷開,說白了你的消息是不會接受到的,而且這樣的開發方法很不穩定也不優雅。我們可以使用面向事件的消費者來接受消息。

(圖7:使用Eventing類型的消費者接受消息)

7.設置一次只接受一個消息,而不是直接LOCK住所有的隊列消息

默認情況下,一個隊列里不管多少消息當你一個TCP連接打上去之后會LOCK住所有的消息,也就是說一個連接徹底占用了所有的消息,此時消息不會被其他集群的機器消費。

(圖8:一次只取一個消息進行消費)

但是如果你對消息的處理的前后順序有要求就不能這么做,你需要獨立注冊一個隊列,然后將這樣的一此只消費一個消息配置話。

8.自動重新連接,不需要手動處理自動連接

(圖9:創建出一個會自動重連的Connection對象)

9.心跳超時時間(集群、高可用部署時至關重要的設置)

(圖10:設置心跳超時時間)

如果你連接單臺節點的時候不設置這個值是沒問題的,但是如果你連接的是類似HAProxy虛擬節點的時候就會出現TCP被斷開的可能性。如果你不設置這個心跳超時時間,它默認是不進行心跳保持的,就會出現網絡中的某個設置斷開空閑的TCP連接資源。就這個問題一直搞的我們的團隊到第二天兩點鐘。大家要記住這個點。

10.消費失敗的消息要重新放入隊列

(圖11:重新放入隊列,推送給其他消費著)

總結:

最后,我是基于Rabbitmq.Client 版本3.5.3.0的基礎上開發的,這個大家要注意。版本不一樣會有一定的差異性。希望此文對大家在使用rabbitmq的同志有一點幫助,謝謝。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 久色精品视频 | 在线 日本 制服 中文 欧美 | 激情免费视频 | 午夜久久久精品一区二区三区 | 久久影院一区二区三区 | 免费看一级片 | 国产精品爆操 | 国产亚洲精品久久午夜玫瑰园 | 黄色久| 天天夜夜操操 | 在线免费观看日韩视频 | 一区二区久久久久草草 | 天天色综合2 | 国产99久久精品一区二区 | 久久精品视频在线免费观看 | 国产毛片视频 | 老女人碰碰在线碰碰视频 | 国内精品久久久久影院不卡 | 精品久久久久久久久久久aⅴ | 成人做爰s片免费看网站 | 蜜桃网站在线 | 欧美a视频在线观看 | 黄色7777| 午夜视频久久久 | 亚洲天堂字幕 | 精品久久久久久久久久久aⅴ | 综合网日日天干夜夜久久 | 久久久三区 | 国产羞羞视频免费在线观看 | 中国av免费在线观看 | 久久精品视频16 | 一级大黄毛片免费观看 | 日本成人高清视频 | av之家在线观看 | 国产精品99久久久久久久vr | 久久精品国产精品亚洲 | 黄色毛片18 | 久久99亚洲精品久久99果 | 一级成人欧美一区在线观看 | 亚洲一区二区三区精品在线观看 | 福利在线免费 |