偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

MQ 平滑遷移都不會(huì),還做什么架構(gòu)師?

開發(fā) 架構(gòu) MySQL
有童鞋問我說,切換MQ,從一個(gè)舊的服務(wù)商升級(jí)為新的服務(wù)商,能否平滑遷移?今天和大家聊聊這個(gè)問題。

繼《MySQL如何不停服平滑遷移?》之后,有童鞋問我說,切換MQ,從一個(gè)舊的服務(wù)商升級(jí)為新的服務(wù)商,能否平滑遷移?今天和大家聊聊這個(gè)問題。

一、MQ架構(gòu)簡(jiǎn)述

如上圖,使用MQ異步通信,一般分為三層:

  • 消息發(fā)送方:使用MQ客戶端生成消息。
MQ-client::SendMsg(topic, msg);
  • MQ服務(wù):中轉(zhuǎn)消息。
  • 消息接收方:使用MQ客戶端消費(fèi)消息。
MQ-client::RecvMsg(topic, msg, CALLBACK_FUNC);

這是一個(gè)典型的pub-sub架構(gòu),如果要替換MQ供應(yīng)商,至少三個(gè)地方要替換:

  • 發(fā)送方mq-client;
  • MQ-server;
  • 接收方mq-client。

二、平滑遷移方案

平滑遷移的目標(biāo)是:不停服,平滑升級(jí)。

如果有很多主題,需要一個(gè)一個(gè)主題的遷移,每個(gè)主題的遷移,分為三個(gè)步驟。

步驟一:消費(fèi)方雙向訂閱

如上圖所示,不妨設(shè):

  • 粉色是舊MQ體系;
  • 藍(lán)色是新MQ體系;

平滑遷移最終目的,是“發(fā)布-服務(wù)-訂閱”三層全由粉色升級(jí)為藍(lán)色。

第一步升級(jí)消費(fèi)方,同一個(gè)主題,既要訂閱舊MQ,又要訂閱新MQ。

此時(shí),“新服務(wù)-新訂閱”之間雖然有TCP連接,但“新發(fā)布”沒有上線,實(shí)際上不會(huì)有消息發(fā)送過來(上圖虛線),消息仍走的是舊MQ(上圖實(shí)線)。

步驟二:生產(chǎn)方升級(jí)為新發(fā)布

第二步升級(jí)生產(chǎn)方,由舊MQ發(fā)布,升級(jí)為新MQ發(fā)布。

此時(shí),“新發(fā)布-新服務(wù)-新訂閱”之間會(huì)建立TCP連接,消息會(huì)轉(zhuǎn)移到新通道(上圖實(shí)線),“舊服務(wù)-舊訂閱”之間雖然有TCP連接,但實(shí)際不會(huì)有消息發(fā)送過來(上圖虛線)。

步驟三:消費(fèi)方下線舊訂閱

第三步升級(jí)消費(fèi)方,將舊訂閱下線,整個(gè)MQ的遷移完成。

三、架構(gòu)啟示

MQ更換服務(wù)商,螞蟻搬家,一步步平滑遷移,成本其實(shí)還挺高的。

之所以這么麻煩,不能統(tǒng)一升級(jí),本質(zhì)是業(yè)務(wù)與底層基礎(chǔ)設(shè)施細(xì)節(jié)(即,具體使用哪個(gè)MQ)的耦合。如果公司在早期技術(shù)體系規(guī)劃的時(shí)候,能夠“淺淺的封裝一層”,便能隔離“業(yè)務(wù)代碼”與“底層基礎(chǔ)設(shè)施細(xì)節(jié)”。

舉個(gè)更通俗的例子。

假如沒有封裝一層,業(yè)務(wù)代碼是:

ActiveMQ-client::SendMsg(topic, msg);
ActiveMQ-client::RecvMsg(topic, msg, CALLBACK_FUNC);

即,業(yè)務(wù)方需要關(guān)心ActiveMQ,如果基礎(chǔ)設(shè)施升級(jí)為RabbitMQ,業(yè)務(wù)代碼需要升級(jí)。

假如有一層淺淺的封裝:

ShenJianMQ::SendMsg(topic, msg){
ActiveMQ-client::SendMsg(topic,msg);
}
ShenJianMQ::RecvMsg(topic, msg,CALLBACK_FUNC)
ActiveMQ-client::RecvMsg(topic,msg, CALLBACK_FUNC);
}

業(yè)務(wù)方不需要關(guān)心底層是什么MQ,而只需要依賴基礎(chǔ)組件ShenJianMQ。

此時(shí)如果基礎(chǔ)設(shè)施升級(jí)為RabbitMQ,只需要基礎(chǔ)組件ShenJianMQ升級(jí)。

第一步:RecvMsg升級(jí)為雙向訂閱。

ShenJianMQ::RecvMsg(topic, msg,CALLBACK_FUNC)
ActiveMQ-client::RecvMsg(topic, msg, CALLBACK_FUNC);
RabbitMQ-client::RecvMsg(topic, msg, CALLBACK_FUNC);
}

第二步:SendMsg升級(jí)為新發(fā)布。

ShenJianMQ::SendMsg(topic, msg){
RabbitMQ-client::SendMsg(topic, msg);
}

第三步:RecvMsg下線舊訂閱。

ShenJianMQ::RecvMsg(topic, msg,CALLBACK_FUNC)
RabbitMQ-client::RecvMsg(topic, msg, CALLBACK_FUNC);
}

會(huì)發(fā)現(xiàn),除了升級(jí)依賴新版的ShenJianMQ基礎(chǔ)組件,業(yè)務(wù)代碼不需要修改代碼。

不僅MQ,緩存與數(shù)據(jù)庫(kù)的客戶端,淺淺封裝一層也能實(shí)現(xiàn)業(yè)務(wù)代碼與基礎(chǔ)組件的解耦,在基礎(chǔ)組建替換,或者基礎(chǔ)組建升級(jí)的時(shí)候,業(yè)務(wù)代碼不需要升級(jí)。

MQ平滑遷移,你學(xué)廢了嗎?

知其然,知其所以然。

思路比結(jié)論更重要。

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

2025-10-30 07:06:00

內(nèi)存管理架構(gòu)memcache

2025-10-30 08:00:00

緩沖池架構(gòu)MySQL

2025-10-29 07:10:00

MySQL架構(gòu)數(shù)據(jù)庫(kù)

2021-02-25 11:30:17

代碼開發(fā)技術(shù)

2022-03-27 22:07:35

元宇宙虛擬人IBM

2022-12-26 18:53:00

MQ宕機(jī)倉(cāng)儲(chǔ)服務(wù)

2015-03-16 11:33:16

程序員代碼bug

2017-02-08 19:49:03

內(nèi)存SSDDRAM

2021-07-07 06:54:37

網(wǎng)頁(yè)Selenium瀏覽器

2020-09-15 09:55:13

架構(gòu)師架構(gòu)選型

2019-12-26 09:56:34

Java多線程內(nèi)部鎖

2023-05-16 07:15:11

架構(gòu)模型對(duì)象

2019-07-05 16:05:29

機(jī)器人AI人工智能

2020-08-05 14:39:49

交換機(jī)攻擊交換機(jī)安全

2021-04-20 09:55:37

Linux 開源操作系統(tǒng)

2020-09-27 06:50:56

Java互聯(lián)網(wǎng)注解

2019-08-09 08:05:11

MQ平滑遷移架構(gòu)

2014-12-11 10:01:09

程序員

2010-10-26 11:05:27

霍金

2012-12-13 09:47:15

軟件架構(gòu)師架構(gòu)師
點(diǎn)贊
收藏

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