国产91精品在线播放,欧美精品在线免费,日韩中文字幕在线有码视频网

上海校區切換校區
圖標

學習文章

當前位置:首頁 > >學習文章 > >

“id串行化”的實現方式

發布時間: 2017-06-16 14:08:05


如何保證一個群gid的消息落到同一個服務器處理呢,“id串行化”具體是怎么實現的呢,這個問題就由騰科小編來為大家解答一下。

一、互聯網高可用常見分層架構

客戶端,反向代理層,接入層,服務層,存儲層,這是互聯網常見的高可用分層架構。服務層的引入至關重要,群消息的投遞不能保證落在同一個接入層,但可以保證落在同一個服務層。

二、服務層上下游細節

服務化的service一般由RPC-server框架實現,上游應用是多線程程序(站點層http接入應用,或者長連接tcp接入應用)一般通過RPC-client訪問service,而RPC-client內部又通過連接池connection-pool訪問下游的service(為了保證高可用,是一個service集群)。

如上圖:

(1)上游是業務應用(站點層http接入應用,或者長連接tcp接入應用)

(2)下游是service集群

(3)業務應用,它又分為了這么幾個部分

(3.1)最上層是任務隊列【或許web-server例如tomcat幫你干了這個事情了】

(3.2)中間是工作線程【或許web-server的工作線程或者cgi工作線程幫你干了線程分派這個事情了】,每個工作線程完成實際的業務任務,典型的工作任務是通過服務連接池進行RPC調用

(3.3)最下層是服務連接池,所有的RPC調用都是通過服務連接池往下游服務去發包執行的

工作線程的典型工作流偽代碼是這樣的:

  1. void work_thread_routine(){ 
  2. Task t = TaskQueue.pop(); // 獲取任務 
  3. // 任務邏輯處理,組成一個網絡包packet,調用下游RPC接口 
  4. ServiceConnection c = CPool.GetServiceConnection();  
  5. // 從Service連接池獲取一個Service連接 
  6. c.Send(packet); // 通過Service連接發送報文執行RPC請求 
  7. CPool.PutServiceConnection(c); // 將Service連接放回Service連接池 

如何保證同一個群gid的消息落在同一個service上呢?

只要對服務連接池進行少量改動:

獲取Service連接的CPool.GetServiceConnection()【返回任何一個可用Service連接】改為

CPool.GetServiceConnection(long id)【返回id取模相關聯的Service連接】

只要傳入群gid,就能夠保證同一個群的請求獲取到同一個連接,從而使請求落到同一個服務Service上。

需要注意的是,連接池不關心傳入的long id是什么業務含義:

(1)傳入群gid,同gid的請求落在同一個service上

(2)傳入用戶uid,同uid的請求落在同一個service上

(3)傳入任何業務xid,同業務xid的請求落在同一個service上

三、其他問題解答

問:id串行化訪問service,同一個id訪問同一個service,當service掛掉時,是否會影響service的可用性?

答:不會,當有下游service掛掉的時候,service連接池能夠檢測到連接的可用性,取模時要把不可用的服務連接排除掉。

問:取模訪問service,是否會影響各連接上請求的負載均衡?

答:不會,只要數據訪問id是均衡的,從全局來看,由id取模獲取各連接的概率也是均等的,即負載是均衡的。

四、總結

升級RPC-client內部的連接池,在service連接選取上做微小改動,就能夠實現“id串行化”,實現不同類型的業務gid/uid等的串行化、序列號需求(這下查找日志就方便了,一個群gid/用戶uid的日志只需去一臺機器grep啦)。

上一篇: 如何選擇合適的數據庫性能工具?

下一篇: Linux新手最容易誤入的幾個坑

在線咨詢 ×

您好,請問有什么可以幫您?我們將竭誠提供最優質服務!

<menuitem id="vlare"></menuitem>

    <ul id="vlare"><rp id="vlare"><optgroup id="vlare"></optgroup></rp></ul>

  • 主站蜘蛛池模板: 屏东县| 达州市| 芷江| 雷州市| 连江县| 威远县| 灵寿县| 乌恰县| 海晏县| 桂阳县| 含山县| 宁国市| 突泉县| 贵定县| 景德镇市| 北票市| 静乐县| 道孚县| 行唐县| 石首市| 嘉黎县| 鸡泽县| 洞口县| 新郑市| 沅江市| 桂平市| 息烽县| 阆中市| 光山县| 荣成市| 郧西县| 民权县| 特克斯县| 贵州省| 武陟县| 长治市| 安义县| 宜章县| 喀什市| 定西市| 运城市|