国产精品一区二区在线观看完整版,在线观看91精品国产性色,欧美日韩另类视频

杭州校區(qū)切換校區(qū)
圖標(biāo)

學(xué)習(xí)文章

當(dāng)前位置:首頁 > >學(xué)習(xí)文章 > >

“id串行化”的實(shí)現(xiàn)方式

發(fā)布時(shí)間: 2017-06-16 14:08:05


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

一、互聯(lián)網(wǎng)高可用常見分層架構(gòu)

客戶端,反向代理層,接入層,服務(wù)層,存儲(chǔ)層,這是互聯(lián)網(wǎng)常見的高可用分層架構(gòu)。服務(wù)層的引入至關(guān)重要,群消息的投遞不能保證落在同一個(gè)接入層,但可以保證落在同一個(gè)服務(wù)層。

二、服務(wù)層上下游細(xì)節(jié)

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

如上圖:

(1)上游是業(yè)務(wù)應(yīng)用(站點(diǎn)層http接入應(yīng)用,或者長連接tcp接入應(yīng)用)

(2)下游是service集群

(3)業(yè)務(wù)應(yīng)用,它又分為了這么幾個(gè)部分

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

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

(3.3)最下層是服務(wù)連接池,所有的RPC調(diào)用都是通過服務(wù)連接池往下游服務(wù)去發(fā)包執(zhí)行的

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

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

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

只要對服務(wù)連接池進(jìn)行少量改動(dòng):

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

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

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

需要注意的是,連接池不關(guān)心傳入的long id是什么業(yè)務(wù)含義:

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

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

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

三、其他問題解答

問:id串行化訪問service,同一個(gè)id訪問同一個(gè)service,當(dāng)service掛掉時(shí),是否會(huì)影響service的可用性?

答:不會(huì),當(dāng)有下游service掛掉的時(shí)候,service連接池能夠檢測到連接的可用性,取模時(shí)要把不可用的服務(wù)連接排除掉。

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

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

四、總結(jié)

升級RPC-client內(nèi)部的連接池,在service連接選取上做微小改動(dòng),就能夠?qū)崿F(xiàn)“id串行化”,實(shí)現(xiàn)不同類型的業(yè)務(wù)gid/uid等的串行化、序列號需求(這下查找日志就方便了,一個(gè)群gid/用戶uid的日志只需去一臺(tái)機(jī)器grep啦)。

上一篇: 如何選擇合適的數(shù)據(jù)庫性能工具?

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

在線咨詢 ×

您好,請問有什么可以幫您?我們將竭誠提供最優(yōu)質(zhì)服務(wù)!

<bdo id="pdyax"></bdo>

    <pre id="pdyax"></pre>
    <menuitem id="pdyax"></menuitem>
      <form id="pdyax"><tbody id="pdyax"></tbody></form>

      1. <center id="pdyax"><center id="pdyax"></center></center>
          1. 主站蜘蛛池模板: 且末县| 孝感市| 西吉县| 南康市| 沁阳市| 沽源县| 武鸣县| 盐亭县| 宜丰县| 白山市| 连山| 宜宾县| 汉寿县| 永定县| 马公市| 莱阳市| 柯坪县| 济阳县| 黄骅市| 新乡县| 宕昌县| 二连浩特市| 星子县| 安化县| 古丈县| 石门县| 安丘市| 逊克县| 乐清市| 卢龙县| 凯里市| 南丰县| 罗城| 广河县| 崇仁县| 南木林县| 铜陵市| 大埔县| 尼木县| 五原县| 内乡县|