架構師面試(三十六):廣播消息

題目

在像 IM、短視頻、游戲等實時在線類的業務系統中,一般會有【廣播消息】業務,這類業務具有瞬時高流量的特點。

在對【廣播消息】業務實現時通常需要同時寫 “系統消息庫” 和更新用戶的 “聯系人庫” 的操作,用戶的聯系人表中會有未讀數字段,寫入一條系統消息,肯定要更新用戶的 “系統聯系人” 的未讀數了。

我們知道:“系統消息庫” 和 “聯系人庫”是兩個不同的數據庫,不具備【原子性】操作;這樣就很容易出現用戶收到了系統消息,但是沒有未讀數的提醒,或者有未讀數的提醒,但是沒有真正的系統消息內容,這樣非常差的用戶體驗。

那么在瞬時廣播 6000萬 系統消息時,為了保證系統消息和未讀數的【一致性】,下面哪一個才是最優的解決方案呢?

A. 引入 XA 解決方案;

B. 引入 Saga 解決方案;

C. 引入事務消息解決方案;

D. 改造實現流程,在廣播時只寫系統消息庫;在用戶登錄時,由登錄事件觸發拉齊系統消息與用戶未讀數的一致性動作。

解析

先說 XA 解決方案。

XA是一個規范,該規范定義了TM與RM之間的接口;什么是 RM 呢?即資源管理器,就是數據庫,MySQL 和 Oracle 都實現了 XA規范,那么 MySQL 和 Oracle 都可以作為 RM;什么是 TM 呢?即事務管理器,就是與所有的RM(數據庫)通信的一個組件,該組件往往嵌入在應用程序中運行,如下圖所示。

圖片

2PC,即兩階段提交,是一個協議,該協議基于 XA 規范實現了分布式事務的細節。基于 XA 規范的 2PC 協議是分布式事務的強一致性實現,從理論上完全可以滿足題目中所描述的業務場景,即實現 “系統消息庫” 和 “聯系人庫” 數據的一致性。但是 2PC 以及后面推出的 3PC存在一個最大的問題,就是性能太低;之前我們團隊有人做過測試,其性能與不用 XA方案時幾乎差一個數量級;所以面對 瞬時廣播 6000萬 的系統消息,XA解決方案是不合適的。

再說 Saga解決方案。Saga 也是一種協議,又叫做分布式事務的補償協議方案,由實現者對該協議方案進行落地;一個分布式事務可以拆分為多個本地事務,每個本地事務包括相應的“執行模塊”和“補償模塊”,“執行模塊” 負責正常的業務邏輯,在 “執行模塊” 失敗時由TM(事務管理器)負責調度 對應的 “補償模塊” 來對已經提交的事務進行數據恢復,如下圖所示。

圖片

Saga 解決方案沒有 XA 解決方案低性能的問題,但是需要業務開發同學針對每一個本地事務都需要編寫相應的“補償邏輯代碼”,這樣的解決方案對業務的侵入性較大;更重要的是,如果“補償模塊”執行失敗了又該如何處理呢?尤其是在 瞬時6000萬的廣播系統消息的場景中,“執行模塊”會失敗,其“補償模塊”失敗的概率是非常高的;所以在該場景中,Saga解決方案也是不合適的。

接著說事務消息解決方案。所謂【事務消息】即意圖通過MQ消息中間件的“消息”達到“分布式事務”的目的。RocketMQ 官方推出了基于 RocketMQ的事務消息解決方案(我們在P7架構師課上曾詳細分析過),生產者通過預先發送 “半消息” 的方式通知 MQ 服務端,在本地事務完成或失敗后再確認“半消息”是否提交,若生產者出現異常可由MQ服務端進行回調確認;?如下圖所示。

圖片

事務消息方案因為需要業務開發者提供回調接口,所以對業務的侵入性仍然很大;對于此,我們公司實現了【本地消息事務方案】,即生產者不需要提供回調接口,在執行本地事務時向本地數據庫的消息表中寫入一條消息,然后開啟另外專門的線程讀取消息和發送消息。不管是【官方版的事務消息解決方案】,還是【本地消息事務解決方案】,對于消費端來說,在消費16次仍然失敗的情況下,是需要人工介入才能解決的;而且更重要的,站在整個業務系統的角度分析,為了實現“系統消息庫”和“聯系人庫”的數據一致性,需要額外引入一個 MQ 中間件,會加大整個系統的架構復雜度,增加維護的工作量。所以在業務場景下,事務消息解決方案也是不合適的。

最后看一下改造業務實現流程的落地方案。在業務場景中,大部分用戶(80%左右)是處于離線狀態的,所以可以據此降低瞬時廣播時對數據庫的瞬時壓力。如下圖所示,流程改造如下:在廣播系統消息時,對于離線用戶,只寫 “系統消息庫” (允許寫失敗,在這里數據的一致性才是重點要考慮的);在用戶登錄的時候(用戶登錄動作不是集中發生的,這就起到了壓力分攤的效果),發送一條消息到MQ,觸發拉齊“系統消息庫” 和 “聯系人庫”的 【數據對齊邏輯】。這樣登錄的用戶就可以從 “聯系人庫” 中獲取到 未讀數,然后從 “系統消息庫”中獲取到 廣播的系統消息了。該解決方案相對于 上面的三種解決方案來說,改造成本最低,改造風險最低,更容易達到效果!

圖片

最后總結一下:對于業務系統開發過程中碰到的問題,可以借鑒市面上流行的解決方案,但是一定要結合自己實際的業務場景來設計 解決方案;【降本增效】是架構設計最根本的原則。

所以,題目中D選項是最合適的解決方案!大家若有疑惑,我們隨時探討!

參考答案

D(應試時,一般選擇描述最長的選項!)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/902883.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/902883.shtml
英文地址,請注明出處:http://en.pswp.cn/news/902883.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

大模型微調 - transformer架構

什么是Transformer Transformer 架構是由 Vaswani 等人在 2017 年提出的一種深度學習模型架構,首次發表于論文《Attention is All You Need》中 Transformer 的結構 Transformer 編碼器(Encoder) 解碼器(Decoder) …

基于華為云 ModelArts 的在線服務應用開發(Requests 模塊)

基于華為云 ModelArts 的在線服務應用開發(Requests 模塊) 一、本節目標 了解并掌握 Requests 模塊的特點與用法學會通過 PythonRequests 訪問華為云 ModelArts 在線推理服務熟悉 JSON 模塊在 Python 中的數據序列化與反序列化掌握 Python 文件 I/O 的基…

python pymysql如何保證數據庫更新成功

python pymysql如何保證數據庫更新成功 在使用Python的PyMySQL庫與MySQL數據庫交互時,確保數據庫更新操作成功執行,可以通過以下幾種方式: 使用execute()和commit() 當執行一個更新(UPDATE)、插入(INSERT)或刪除(DELETE)操作時,你需要調用execute()方法來執行SQL語句…

【數據可視化-30】Netflix電影和電視節目數據集可視化分析

🧑 博主簡介:曾任某智慧城市類企業算法總監,目前在美國市場的物流公司從事高級算法工程師一職,深耕人工智能領域,精通python數據挖掘、可視化、機器學習等,發表過AI相關的專利并多次在AI類比賽中獲獎。CSDN…

【深度強化學習 DRL 快速實踐】逆向強化學習算法 (IRL)

Inverse Reinforcement Learning (IRL) 詳解 什么是 Inverse Reinforcement Learning? 在傳統的強化學習 (Reinforcement Learning, RL) 中,獎勵函數是已知的,智能體的任務是學習一個策略來最大化獎勵 而在逆向強化學習 (Inverse Reinforc…

入侵檢測系統(IDS)與入侵防御系統(IPS):功能對比與部署實踐

入侵檢測系統(IDS)與入侵防御系統(IPS):功能對比與部署實踐 在網絡安全防御體系中,入侵檢測系統(Intrusion Detection System, IDS)與入侵防御系統(Intrusion Preventio…

P12167 [藍橋杯 2025 省 C/Python A] 倒水

P12167 [藍橋杯 2025 省 C/Python A] 倒水 題目描述 小藍有 n n n 個裝了水的瓶子,從左到右擺放,第 i i i 個瓶子里裝有 a i a_i ai? 單位的水。為了美觀,小藍將水循環染成了 k k k 種顏色,也就是說,第 i i i …

短視頻矩陣系統可視化剪輯功能開發,支持OEM

在短視頻營銷與內容創作競爭日益激烈的當下,矩陣系統中的可視化剪輯功能成為提升內容產出效率與質量的關鍵模塊。它以直觀的操作界面和強大的編輯能力,幫助創作者快速將創意轉化為優質視頻。本文將結合實際開發經驗,從需求分析、技術選型到核…

制作一款打飛機游戲22:表格導出

編輯器功能擴展 今天,我想讓編輯器能夠處理一個數組,這是編輯器將要編輯的東西,它只編輯數組。這些區域在后續的不同版本的編輯器中會有不同的含義,但現在我想創建一個模板,能夠加載一個二維數組,并將二維…

AI數據分析的利器:解鎖BI工具的無限潛力

在數字化浪潮席卷全球的今天,數據已成為企業最寶貴的資產之一。如何高效、準確地分析這些數據,挖掘其中的價值,成為企業決策的關鍵。AI數據分析,作為新時代的數據分析利器,正逐漸改變著企業的決策方式。而BI&#xff0…

【每天一個知識點】IPv4(互聯網協議版本4)和IPv6(互聯網協議版本6)

IPv4(互聯網協議版本4)和IPv6(互聯網協議版本6)是用于在互聯網上標識和定位設備的兩種主要協議。它們的主要區別在于地址空間、結構、以及一些附加功能。以下是兩者的對比: 1. 地址長度 IPv4: 地址長度為32位&#xf…

numpy.random.normal與numpy.random.randn的區別與聯系

先說結論: numpy.random.normal 對應的是 正態分布,numpy.random.randn 對應的是標準正態分布,所以 numpy.random.randn 是 numpy.random.normal 的一個特例。 1. numpy.random.normal 從正態(高斯)分布中抽取隨機樣…

基于 EFISH-SBC-RK3588 的無人機智能巡檢終端方案?

一、硬件架構設計? ?核心算力平臺(EFISH-SBC-RK3588)? ?異構計算能力?:搭載 8 核 ARM 架構(4Cortex-A762.4GHz 4Cortex-A551.8GHz),集成 6 TOPS NPU 與 Mali-G610 GPU,支持多傳感器數據并…

軟測面經(私)

測試流程 分析需求——>制定測試計劃——>設計測試用例——>執行測試——>編寫測試報告 黑盒測試 等價類劃分、邊界值分析法、猜錯法、隨機數法、因果圖。 白盒測試 代碼檢查法、程序變異、靜態結構分析法、靜態質量度量法、符號測試法、邏輯覆蓋法、域測試、…

那些年踩過的坑之Arrays.asList

一、前言 熟悉開發的兄弟都知道,在寫新增和刪除功能的時候,大多數時候會寫成批量的,原因也很簡單,批量既支持單個也支持多個對象的操作,事情也是發生在這個批量方法的調用上,下面我簡單說一下這個事情。 二…

通過VIN車輛識別代碼查詢_精準版API,獲取車輛精準參數

通過17位VIN碼的精準匹配,幫助用戶快速獲取車輛的品牌、型號、出廠日期、排量、外觀、車輛型號等詳細參數。這一API廣泛應用于二手車交易、車輛租賃、配件采購和車輛維修等領域,為用戶提供一個高效、準確的解決方案。 代碼示例 返回格式:js…

Virtuoso ADE采用Spectre仿真中出現MOS管最小長寬比滿足要求依然報錯的情況解決方法

在ADE仿真中錯誤問題如下: ERROR (CMI-2440): "xxx.scs" 46338: I2.M1: The length, width, or area of the instance does not fit the given lmax-lmin, wmax-wmin, or areamax-areamin range for any model in the I2.M3.nch_hvt group. The channel w…

LeetCode hot 100—最長有效括號

題目 給你一個只包含 ( 和 ) 的字符串,找出最長有效(格式正確且連續)括號子串的長度。 示例 示例 1: 輸入:s "(()" 輸出:2 解釋:最長有效括號子串是 "()"示例 2&#xf…

Vue3集成sass

安裝依賴 pnpm add -D sass-embedded配置全局變量 新建文件 src/styles/variables.scss配置Vite 修改 vite.config.ts variables.scss $base-color: bluevite.config.ts // https://vite.dev/config/ export default defineConfig({plugins: [vue(),],resolve: {alias: {:…

【力扣題目分享】棧專題(C++)

目錄 關于棧的題目: 1. 最小棧: 思路: 實現代碼(最終): 2. 棧的壓入、彈出序列: 思路: 實現代碼: 3. 逆波蘭表達式求值: 思路: 實現代碼: 深入了解…