成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

“id串行化”到底是怎么實(shí)現(xiàn)的?

開發(fā) 開發(fā)工具
有朋友就要問了,如何保證一個(gè)群gid的消息落到同一個(gè)服務(wù)器處理呢,“id串行化”具體是怎么實(shí)現(xiàn)的呢,這個(gè)問題在年初的一篇文章中描述過,這里再給有疑問的同學(xué)解答一下。

[[176512]]

一、需求緣起

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

有朋友就要問了,如何保證一個(gè)群gid的消息落到同一個(gè)服務(wù)器處理呢,“id串行化”具體是怎么實(shí)現(xiàn)的呢,這個(gè)問題在年初的一篇文章中描述過,這里再給有疑問的同學(xué)解答一下。

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

客戶端,反向代理層,接入層(此圖是http短鏈接接入,群聊消息的話是tcp長連接接入),服務(wù)層(處理群消息業(yè)務(wù)邏輯),存儲(chǔ)層(緩存cache存儲(chǔ),固化db存儲(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請(qǐng)求 
  7. CPool.PutServiceConnection(c); // 將Service連接放回Service連接池 

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

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

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

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

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

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

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

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

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

四、其他問題

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

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

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

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

五、總結(jié)

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

文章來源微信號(hào):gh_10a6b96351a9

責(zé)任編輯:趙寧寧 來源: 架構(gòu)師之路
相關(guān)推薦

2019-03-25 07:39:35

ID串行化消息順序性高可用

2009-09-11 12:17:59

C#控件屬性

2022-01-07 07:59:14

Go語言Go Error

2022-01-14 17:01:44

GoError結(jié)構(gòu)

2009-07-10 09:38:06

Java swing組

2009-11-18 11:05:27

PHP串行化

2010-01-12 10:29:51

VB.NET對(duì)象串行化

2009-06-09 16:14:47

Java swing組件串行化

2018-05-03 15:03:09

內(nèi)存虛擬化空間

2024-03-15 08:06:58

MySQLJOIN命令

2024-05-11 09:41:45

線程安全代碼

2020-12-28 08:18:55

安全代碼線程

2019-05-28 13:50:27

MySQL幻讀數(shù)據(jù)庫

2023-10-10 16:03:48

數(shù)字化信息化

2009-11-02 16:41:55

VB.NET串行化對(duì)象

2019-12-18 18:31:10

黑客醫(yī)療保險(xiǎn)軟件

2023-07-14 12:21:29

流程@Autowired方法

2024-02-22 08:00:00

SoraOpenAI

2022-08-08 08:00:00

人工智能機(jī)器學(xué)習(xí)計(jì)算機(jī)應(yīng)用

2023-10-12 08:54:20

Spring事務(wù)設(shè)置
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 亚洲综合色视频在线观看 | 国产一区免费 | 亚洲一区电影 | 国产成人99久久亚洲综合精品 | 国产在线精品区 | 国产成人精品久久二区二区 | 精品啪啪 | 亚洲成人蜜桃 | 亚洲国产精品99久久久久久久久 | 国产精品一区三区 | 天天天天天天操 | 91在线视频观看 | 一区二区三区四区在线 | 一区二区在线免费观看 | 成人av一区 | 人人擦人人 | 日韩午夜电影 | 综合二区 | 亚洲精品黑人 | 日韩在线视频免费观看 | 亚洲欧美日韩国产 | 午夜日韩| www.久| 亚洲成人第一页 | 少妇淫片aaaaa毛片叫床爽 | av一级久久| 91av免费观看 | 黄色免费在线观看 | 欧美综合视频在线 | 久久综合一区二区 | 久久国产免费 | 日韩一区二区三区av | 亚洲视频一区二区三区四区 | 久久精品一区二区视频 | 人人天天操| 性网站免费 | 中文字幕 国产 | 午夜在线视频 | 日韩av在线不卡 | 成人精品高清 | 超碰97免费观看 |