亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

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

.net分布式架構之業務消息隊列

2019-11-14 13:50:06
字體:
來源:轉載
供稿:網友

開源QQ群: .net 開源基礎服務  238543768

開源地址: http://git.oschina.net/chejiangyi/Dyd.BusinessMQ

## 業務消息隊列 ##
業務消息隊列是應用于業務的解耦和分離,應具備分布式,高可靠性,高性能,高實時性,高穩定性,高擴展性等特性。

## 優點: ##
- 大量的業務消息堆積能力
- 無單點故障及故障監控,異常提醒
- 生產者端負載均衡,故障轉移,故障自動恢復,并行消息插入。
- 消費者端負載均衡,故障保持,故障自動恢復,并行消息消費。
- 消息高可靠性持久化,較高性能,較高實時性,高穩定性,高擴展性。
- 支持99*99個消息分區,單個消息分區單天支持近1億的消息存儲。
- 消費者拉方式獲取消息,在高并發,大量消息涌入的情況下,只要消費能力足夠,不會有消息延遲,消息越多性能越好。 

## 缺點: ##
- 能保證消息順序插入,保證相同分區的消息是順序的(排除網絡延遲),但是多個分區之間的可能是亂序的。
- 消息并行消費或者多個分區并行消費或者負載均衡情況下的,消息消費順序是亂序。

## 缺點原因: ##
- 消息的負載均衡是基于消息的分區存儲,故多個分區之間的消息是亂序的,但是相同分區的消息是順序的。
- 消息的消費者負載均衡也是基于消息的分區進行均衡的,同時單個消費者訂閱多個分區的情況下,也可并行進行消費。意味著不同分區的消息的消費是亂序的,但是相同分區的消息消費是順序的。

## 缺點解決方案: ##
- 生產者自定義負載均衡算法,按照業務維度(用戶,商戶)等進行分區(多個用戶之間可以消息亂序,單個用戶的消息必須是順序的),不同維度可以指向不同的分區,但是單個維度的消息是可以保證順序的。
- 本解決方案在故障的情況下,故障會移除某些故障節點,意味著故障節點會立即報錯(當然也可自己指定故障節點進行轉移,但是轉移的節點消息會被提前消費,故障的消息會在恢復故障后重新消費,這樣也會出現故障程度上的消息亂序消費)。
- 本解決方案在線上無縫擴容和擴展性能方面也會有限制,看要具體的負載均衡算法,但是一般情況下,如果要擴容還是會進行部分消息遷移的情況。

## 問答: ##
### *1.大量的業務消息堆積能力,如何實現?* ###
  每個分區表支持約1億的消息存儲,可以通過增加分區表進行擴容。消費者進行消息消費,內部僅保留某個分區上一次消費的指針,所以不會影響消費者。
  消息持久化到磁盤,不會在內存駐留,理論上不影響內存。

### *2.無單點故障及故障監控,異常提醒?* ###
  故障一般會發生在redis,數據節點,管理中心,日志中心。
  redis節點故障會影響消費者的消息消費響應及時度,一般延遲5s以內。不會影響消息消費速度和消息消費QPS
  數據節點故障會影響生產者和消費者的消息,并造成消息暫時丟失(但是都是可恢復的,具體的看數據庫的高可用做到什么程度)。
  生產者端會無縫的進行節點移除,但是會默認1分鐘重新嘗試重連。消費者會持續報錯至日志中,但是不會影響其他分區消費。
  管理中心故障會影響生產者和消費者的心跳檢測和新注冊的生產者,消費者,但不會影響生產者和消費者具體的消息存儲和發送接收。
  日志中心故障不會影響生產者和消費者,但是影響日志的打印,日志中心故障會通知公司內部監控平臺。
  雖然故障不會影響線上已有的消息運行,但是還是會在高并發情況下出現性能問題,和系統穩定性,所以一旦發現要重視和及時處理。

### *3.生產者端負載均衡,故障轉移,故障自動恢復,并行消息插入?* ###
  默認負載均衡采用多個分區順序輪詢插入,在并發情況下輪詢插入是并行插入到不同分區的;某個數據節點出現故障,會移除相關數據節點的所有分區;
  默認1分鐘會重新載入故障分區進行重試。

### *4.消費者端負載均衡,故障保持,故障自動恢復,并行消息消費。* ###
  默認消費者端負載均衡是根據消費者訂閱的分區進行的(一個消費者可以訂閱多個分區,多個相同業務的消費者可以訂閱多個不同分區進行負載)。
  一個消費者訂閱多個分區,這個消費者可以開啟并行進行多分區消費。并行度=分區數,效果理論上最佳。
  分區節點出現故障等,單個分區或者數據節點就會暫停消費,并通知日志中心打印錯誤日志。當故障恢復后,消費繼續進行。

### *5.消息高可靠性持久化,較高性能,較高實時性,高穩定性,高穩定性。* ###
  消息傳遞到消息中心后,立即持久化到磁盤,故不會丟失消息。生產者可以采用多個分區進行并行插入,消費者可以采用并行進行消息消費,故理論上性能是可擴展無限量的。
  消息是通過拉取的方式獲取的,發送消息會由redis進行即時通知消費者拉?。磿r消息默認會合并在500ms內redis通知消息),一般在20ms內消息會被消費掉。
  批量拉消息的方式相對push的消息推送方式在高并發和大量消息處理的情況下,消息發送性能應該是更優的。
  穩定性是基于數據庫的穩定性和故障轉移層面來確保的,擴展性體現在線上無縫的遷移和擴容。

### *6.支持9999個消息分區,單個消息分區單天支持近1億的消息存儲。* ###
  數據節點是01~99個,節點里面的表分區是01~99個,所以可以支持近1萬個分區節點。單表的mqid最大應該是(1億-1)條,應該滿足一般的業務需求,
  若不能滿足,可以通過多個分區的方式擴容。

### *7.消費者拉方式獲取消息,在高并發,大量消息涌入的情況下,只要消費能力足夠,不會有消息延遲,消息越多性能越好。* ###
  push推消息的模式能保證更高的實時性,但是在大量消息的情況下,消息堆積的情況更嚴重,性能會有所影響。
  pull拉消息的模式在保證消息實時性方面會略差,但是在大量消息涌入的情況下,批量拉消息效率更加。而且會將消息分發的負載轉移到多個消費者端上。

## 未來改進: ##
1.  未來采用leveldb重寫存儲。
1.  剝離broker服務用于支持相對可靠的消息服務。
1.  消息完成標記本地緩存/持久化(或者存儲redis),每秒提交更新至數據庫,消除頻繁消費導致的瓶頸。

## 架構示意圖 ##


## 使用demo示例 ##

 /// <summary>        /// 發送消息        /// </summary>        /// <param name="msg"></param>        public void SendMessageDemo(string msg)        {            //發送字符串示例            var p = PRoducterPoolHelper.GetPool(new BusinessMQConfig() {                     ManageConnectString = "server=192.168.17.201;Initial                     Catalog=dyd_bs_MQ_manage;User ID=sa;PassWord=Xx~!@#;" },//管理中心數據庫                    "dyd.mytest3");//隊列路徑 .分隔,類似類的namespace,是隊列的唯一標識,要提前告知運維在消息中心注冊,方可使用。            p.SendMessage(@"1");            //發送對象示例            /* var obj = new message2 { text = "文字", num = 1 };              var p = ProducterPoolHelper.GetPool(new BusinessMQConfig() {                         ManageConnectString = "server=192.168.17.237;Initial                         Catalog=dyd_bs_MQ_manage;User ID=sa;Password=Xx~!@#;" },//管理中心數據庫                        "test.diayadian.obj");//隊列路徑 .分隔,類似類的namespace,是隊列的唯一標識,要提前告知運維在消息中心注冊,方可使用。            p.SendMessage<message>(obj);            */        }        private ConsumerProvider Consumer;        /// <summary>        /// 接收消息        /// </summary>        /// <param name="action"></param>        public void ReceiveMessageDemo(Action<string> action)        {            if (Consumer == null)            {                Consumer = new ConsumerProvider();                Consumer.Client = "dyd.mytest3.customer1";//clientid,接收消息的(消費者)唯一標示,一旦注冊以后,不能更改,業務下線廢棄后必須要告知運維,刪除消費者注冊。                Consumer.ClientName = "客戶端名稱";//這個相對隨意些,主要是用來自己識別的,要簡短                Consumer.Config = new BusinessMQConfig() { ManageConnectString =                         "server=192.168.17.201;Initial Catalog=dyd_bs_MQ_manage;User                         ID=sa;Password=Xx~!@#;" };                Consumer.MaxReceiveMQThread = 1;//并行處理的線程數,一般為1足夠,若消息處理慢,又想并行消費,則考慮 正在使用的分區=并行處理線程數 為并行效率極端最優,但cpu消耗應該不小。                Consumer.MQPath = "dyd.mytest3";//接收的隊列要正確                Consumer.PartitionIndexs = new List<int>() { 1, 2, 3,4, 5, 6, 7, 8 };//消費者訂閱的分區順序號,從1開始                Consumer.RegisterReceiveMQListener<string>((r) =>                {                    /*                       * 這些編寫業務代碼                       * 編寫的時候要注意考慮,業務處理失敗的情況。                       * 1.重試失敗n次。                       * 2.重試還不行,則標記消息已被處理。然后跳過該消息處理,自己另外文檔記錄這種情況。                       * 消息被消費完畢,一定要調用MarkFinished,標記消息被消費完畢。                       */                    action.Invoke(r.ObjMsg);                    r.MarkFinished();                });            }        }        /// <summary>        /// 關閉消息訂閱連接        /// </summary>        public void CloseReceiveMessage()        {            //注冊消費者消息,消費者務必要在程序關閉后關掉(dispose)。否則導致異常終止,要人工等待連接超時后,方可重新注冊。            if (Consumer != null)            {                Consumer.Dispose();                Consumer = null;            }        }    } 

 

部分截圖

 

備注:.net開源的消息隊列很少,特別是針對業務的高可靠性的消息隊列;希望這個開源的消息隊列,能夠為.net領域帶來更多解決方案,更多的思路和架構設計;同時也希望了解消息隊列的人能夠給于這個解決方案更多的建議和完善意見。

 

作者:車江毅


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲天堂av图片| 久久人人爽亚洲精品天堂| 91在线视频成人| 国产精品极品美女粉嫩高清在线| 欧美伊久线香蕉线新在线| 伊人激情综合网| 在线电影av不卡网址| 浅井舞香一区二区| 欧美激情视频在线观看| 97在线精品国自产拍中文| 久久综合久久88| 一本一本久久a久久精品牛牛影视| 欧美成人四级hd版| 亚洲综合在线播放| 欧美二区在线播放| 亚洲欧美激情精品一区二区| 亚洲成人激情视频| 亚洲尤物视频网| 久热爱精品视频线路一| 日本精品性网站在线观看| 日韩毛片中文字幕| 亚洲伊人久久综合| 另类美女黄大片| 136fldh精品导航福利| 精品亚洲国产成av人片传媒| 日韩精品在线免费观看| 全球成人中文在线| 国产精品高潮呻吟久久av野狼| 色多多国产成人永久免费网站| 国产精品入口免费视| 青草青草久热精品视频在线网站| 欧美日韩一区免费| 国产精品久久91| 久久伊人91精品综合网站| 在线观看日韩欧美| 91国内揄拍国内精品对白| 在线播放日韩av| 97久久精品国产| 国产精品久久久久久久久久久不卡| 在线色欧美三级视频| 国产综合视频在线观看| 亚洲丝袜在线视频| 91国产美女在线观看| 欧美精品一区二区免费| 国产精品入口免费视| 国产精品99蜜臀久久不卡二区| 一区二区三区国产视频| 欧美日韩亚洲国产一区| 欧美日韩国产一区在线| 国产精品欧美激情| 国产精品视频在线播放| 亚洲成色999久久网站| 亚洲新中文字幕| 亚洲va欧美va国产综合久久| 成人xvideos免费视频| 国产成人综合av| 国产99久久久欧美黑人| 久久久久久久国产| 国产日韩欧美在线| 中文字幕欧美在线| 亚洲国产天堂久久综合网| 日韩免费在线电影| 一区三区二区视频| 亚洲综合在线小说| 久久国产精品久久久久| 国产精品久久久久久久久免费| 亚洲精品电影在线观看| 92福利视频午夜1000合集在线观看| 69久久夜色精品国产7777| 91午夜在线播放| 欧美黑人极品猛少妇色xxxxx| 夜色77av精品影院| 国产日韩欧美综合| 欧美午夜精品久久久久久久| 日韩天堂在线视频| 中文字幕日韩专区| www.欧美视频| zzijzzij亚洲日本成熟少妇| 成人激情春色网| 日韩精品视频观看| 中文字幕精品网| 久久国产精品久久久| 国产成人小视频在线观看| 欧美日韩福利电影| 98视频在线噜噜噜国产| 久久伊人免费视频| 精品福利视频导航| 欧美激情日韩图片| 精品亚洲va在线va天堂资源站| 成人av资源在线播放| 亚洲一区二区中文| 国产精品日韩专区| 亚洲精品永久免费精品| 国产丝袜一区二区| 69视频在线播放| 高清日韩电视剧大全免费播放在线观看| 国产成人久久精品| 日韩在线中文字| 亚洲变态欧美另类捆绑| 国内精品久久久久久久| 日韩av在线最新| 日韩电影中文字幕在线观看| 成人av色在线观看| 亚洲国产精品久久久| 懂色av影视一区二区三区| 亚洲国产精彩中文乱码av在线播放| 日本欧美在线视频| 国产精品第2页| 亚洲国产精品va在线看黑人| 国产精品扒开腿爽爽爽视频| 最好看的2019的中文字幕视频| 日韩av在线直播| 欧美激情视频网址| 亚洲男人天堂2024| 国产精品久久久91| 久久免费福利视频| 国产精品第100页| 欧美肥臀大乳一区二区免费视频| 久久精品国产清自在天天线| 日韩大片在线观看视频| 亚洲国产精品悠悠久久琪琪| 91理论片午午论夜理片久久| 日本国产一区二区三区| 国产三级精品网站| 日韩成人中文字幕在线观看| 国产午夜精品全部视频在线播放| 欧美午夜精品久久久久久久| 亚洲人午夜精品| 久久人人爽人人爽人人片亚洲| 欧美国产精品人人做人人爱| 91中文精品字幕在线视频| 国产欧美最新羞羞视频在线观看| 久久久久亚洲精品国产| 久久国产精品偷| 国产成人精品一区二区三区| 日本高清久久天堂| 91亚洲va在线va天堂va国| 国产成人亚洲综合91精品| 午夜精品在线视频| 97国产精品视频人人做人人爱| 久久久视频免费观看| 久久久久久久久久久av| 一本色道久久综合狠狠躁篇的优点| 在线观看国产欧美| 在线成人激情黄色| 亚洲天堂男人天堂女人天堂| 亚洲成人网久久久| 欧美日韩国产一区二区三区| 久久久av亚洲男天堂| 中文精品99久久国产香蕉| 久久99精品久久久久久青青91| 福利精品视频在线| 欧美性猛交xxxx久久久| 亚洲图片在区色| 日韩久久免费视频| 日韩欧亚中文在线| 亚洲成人av在线播放| 国产成人免费av| 欧美韩国理论所午夜片917电影| 国产一区二区丝袜| 亚洲直播在线一区| 精品国产精品三级精品av网址| 国产拍精品一二三| 日韩色av导航|