日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
“ID串行化”是如何保證消息順序性的?

在《消息順序性為何這么難?》中,介紹了一種為了保證“所有群友展示的群消息時(shí)序都是一致的”所使用的“ID串行化”的方法:讓同一個(gè)群gid的所有消息落在同一臺服務(wù)器上處理。

在南明等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì) 網(wǎng)站設(shè)計(jì)制作按需求定制網(wǎng)站,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),高端網(wǎng)站設(shè)計(jì),營銷型網(wǎng)站,外貿(mào)網(wǎng)站建設(shè),南明網(wǎng)站建設(shè)費(fèi)用合理。

ID串行化是如何實(shí)現(xiàn)的呢?

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

客戶端,反向代理層,接入層,服務(wù)層,存儲(chǔ)層,這是互聯(lián)網(wǎng)常見的高可用分層架構(gòu)。

畫外音:這個(gè)圖用過好多次。

這里的“服務(wù)層”至關(guān)重要,ID串行化保證的是,同一個(gè)群gid的消息落在同一個(gè)服務(wù)上。

畫外音:服務(wù)集群有很多節(jié)點(diǎn),如果能落在同一個(gè)服務(wù)節(jié)點(diǎn)上,就可以利用這個(gè)服務(wù)節(jié)點(diǎn)做消息串行化。

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

服務(wù)一般由RPC框架實(shí)現(xiàn),上游調(diào)用方是多線程程序,通過RPC-client訪問服務(wù),而RPC-client內(nèi)部又通過連接池connection-pool來訪問的。

畫外音:為了保證高可用,連接池會(huì)對集群中的每個(gè)服務(wù)都建立連接。

如上圖:

(1)上游是業(yè)務(wù)應(yīng)用;

(2)下游是服務(wù)集群;

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

  • 上層是任務(wù)隊(duì)列(粉色);
  • 中間是工作線程(藍(lán)色),每個(gè)工作線程完成實(shí)際的業(yè)務(wù)任務(wù),典型的工作任務(wù)是通過服務(wù)連接池進(jìn)行RPC調(diào)用;
  • 下層是服務(wù)連接池(綠色),所有的RPC調(diào)用都是通過服務(wù)連接池往下游服務(wù)發(fā)請求執(zhí)行;

畫外音:橙色是連接池中的一條連接。

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

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

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

對連接池進(jìn)行少量改動(dòng),獲取連接時(shí):

 
 
 
 
  1. CPool.GetConnection() 

畫外音:返回任何一個(gè)可用服務(wù)連接。

升級為

 
 
 
 
  1. CPool.GetConnection(long id) 

畫外音:返回id取模相關(guān)聯(lián)的服務(wù)連接。

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

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

  • 傳入群gid,同gid的請求落在同一個(gè)服務(wù)上;
  • 傳入用戶uid,同uid的請求落在同一個(gè)服務(wù)上;
  • 傳入任何業(yè)務(wù)xid,同業(yè)務(wù)xid的請求落在同一個(gè)服務(wù)上;

ID串行化訪問服務(wù),同一個(gè)id訪問同一個(gè)服務(wù),當(dāng)服務(wù)掛掉時(shí),會(huì)不會(huì)受影響服務(wù)可用性?

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

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

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

【本文為專欄作者“58沈劍”原創(chuàng)稿件,轉(zhuǎn)載請聯(lián)系原作者】

戳這里,看該作者更多好文


本文標(biāo)題:“ID串行化”是如何保證消息順序性的?
轉(zhuǎn)載來源:http://m.5511xx.com/article/ccidsge.html