聊聊消息中心的設計與實現邏輯

来源:https://www.cnblogs.com/cicada-smile/archive/2022/07/10/16463422.html
-Advertisement-
Play Games

消息通知的流程設計,在各個業務線中通過消息中心提供的介面方法,將不同場景下的消息內容提交到消息中心,消息中心進行統一維護管理,並根據消息的來源和去向,適配相應的推送邏輯。 ...


厭煩被消息打擾,又怕突然間的安靜;

一、業務背景

微服務的架構體系中,會存在很多基礎服務,提供一些大部分服務都可能需要的能力,比如文件管理、MQ隊列、緩存機制、消息中心等等,這些服務需要提供各種可以復用的方法或者介面,以便其他業務服務可以快速調用;下麵來看看消息通知的原理:

這裡的消息不同於MQ隊列,是指業務側的通知機制,例如簡訊、郵件、系統消息等,在業務層面的需求很多,通常會封裝單獨的消息中心提供通知機制;

從流程上面看,消息通知是典型的生產-消費模式,業務側不斷的生產消息,消息中心在接收之後進行消費,把通知推送到相應的渠道中,很顯然這種邏輯具備很高的復用性。

二、消息通知

1、流程管理

消息通知的流程設計,在各個業務線中通過消息中心提供的介面方法,將不同場景下的消息內容提交到消息中心,消息中心進行統一維護管理,並根據消息的來源和去向,適配相應的推送邏輯:

  • 消息生產:涉及到的場景很多,比如活動、營銷機制、系統通知、業務流轉、過期提醒等;
  • 消息管理:對預發送消息的結構和參數進行校驗,並創建消息推送的任務,維護任務級別的推送管理,跟蹤消息的狀態周期;
  • 消息消費:基於消息任務的結構,構建消息推送的主體內容,並對接多個發送渠道,實現通知的高效觸達;
  • 定時任務:消息可以直接即時推送,但如果是夜間定時任務觸發,則要考慮推送延遲問題,將消息放在指定時段投遞;
  • 渠道對接:通常不同的渠道意味著不同的場景,例如監控推送釘釘,活動一般推送微信,賬戶變動發郵件,營銷走簡訊,業務則應用內通知;

在整個流程中涉及到的模塊比較多,狀態的流轉也很複雜,但是通過消息中心進行統一標準管理和流入流出的跟蹤,也可以提供清晰的生命周期監控和維護;

2、流程時序

在整個消息通知鏈路中,在不同的流轉節點中,無不涉及狀態的變化(即from.to狀態),這樣可以構成整個生命周期的視圖:

  • 初始化:業務方構建簡單的消息結構,請求發送到消息中心後,初始化一個消息任務;
  • 任務化:對消息發送請求進行校驗,並將消息轉換成一個標準的推送任務結構;
  • 推送中:根據任務推送的時間周期類型,將任務構建成不同渠道的通知主體,從而進行渠道消息推送;
  • 已完成:根據消息在渠道推送的狀態回調,更新消息中心的任務完成狀態,或者失敗重試;

大部分的消息通知機制都可以容忍一定的延遲性,所以消息中心完全可以解耦各個流程,引入MQ隊列或者非同步機制,業務方只需要將請求發送到消息中心,之後由消息中心統一調度和管理即可;

3、結構設計

這裡根據系統的實現過程和經驗,給出一個數據結構的設計參考,用來對業務場景做簡單的維度描述:

  • 消息模板:定義通知的主體結構,基於消息的參數模型,構建推送的消息內容;
  • 消息任務:消息中心管理和維護的主體結構,以任務的模式維護消息從生產到推送完成的整個狀態周期;
  • 場景記錄:消息最終推送出去的內容和場景分類,也可以簡單的理解為不同渠道的投遞記錄;
  • 交互消息:強調消息在接收方是否觸達並且對消息產生了交互行為,例如會話,郵件回覆,狀態關聯等;

三、實踐總結

最後還是站在技術實現的角度,總結一下消息通知機制中的一些關鍵問題:

  • 生產消費:消息生產之後寫入消息中心的存儲容器,之後進行消費流程的管理,是業務解耦的常用手段;
  • 任務管理:以任務的模式進行消息推送的調度,通過任務狀態的變化和控制,實現生命周期的管理;
  • 狀態機:描述消息的流轉節點和狀態,在不同的事件中觸發不同的狀態切換和轉移,併在狀態變化後銜接各種業務動作;
  • 渠道對接:通常消息推送的渠道多是第三方平臺,所以在消息中心會接入諸多的渠道,例如微信、釘釘、簡訊等;
  • 基礎封裝:作為分散式系統中的基礎功能,在封裝消息管理功能時,要考慮一定的復用性和流程的可視化呈現;

消息的本質是信息的觸達和傳遞,但是過多的消息通知也容易讓用戶產生厭倦心態,所以消息內容的簡潔明確,推送的間隔時段以及閱讀提醒,在產品具體的實現上需要極為用心,從而讓消息在業務體系中發揮更大的價值。

四、參考源碼

編程文檔:
https://gitee.com/cicadasmile/butte-java-note

應用倉庫:
https://gitee.com/cicadasmile/butte-flyer-parent

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1.Static 詳情見下麵代碼講解 點擊查看代碼 package com.Tang.oop.demo07; public class Student { private static int age;//靜態變數 private double score;//非靜態變數 public void r ...
  • 本文節選左耳朵耗子相關文章,與讀者共勉! 本質上來說,程式員是手藝人,有手藝的人就能做出別人做不出來的東西,而付費也是一件很自然的事了。那麼,這個問題就成了,如何讓自己的“手藝”更為值錢的問題了。 千里之行,積於跬步 任何一件成功的大事,都是通過一個一個的小成功達到的。所以,你得確保你有一個一個的小 ...
  • django 啟動關閉和基礎文件說明 創建一個項目 成功安裝 django 之後,我們的終端會多出一個叫 django-admin的命令,我們可以使用這個命令來創建我們新的項目 我們可以在命令行輸入下列命令來創建一個新的項目,內部包含一個基礎網頁以及框架的相關內容 # 格式 django-admin ...
  • 帶你系統學習並且自己動手寫一個自己的哈希表,從哈希表的整體設計,再到細節哈希函數、哈希衝突和擴容設計,內容精彩至極!!! ...
  • 1.Instanceof作用 用來判斷兩個兩個類之間是否存在父子關係 代碼及詳解如下: Application類代碼 點擊查看代碼 package com.Tang.oop.demo06; public class Application { public static void main(Stri ...
  • 筆記主要參考《Java併發編程的藝術》並且基於JDK1.8的源碼進行的刨析,此篇只分析獨占模式,後續在ReentrantReadWriteLock和 CountDownLatch中 會重點分析AQS的共用模式 一丶Lock 鎖是用來控制多個線程訪問共用資源的方式,一般來說,一個鎖可以防止多個線程同時 ...
  • IntelliJ IDEA 2022 for Mac是Mac上最好用的Java開發工具,為最大限度地提高開發人員的工作效率而設計,即時和巧妙的代碼完成,動態代碼分析,為各種其他語言(如SQL,JPQL,HTML,JavaScript等)提供智能編碼幫助等強大的功能,是開發人員不可缺少的一款軟體。 詳 ...
  • 1.靜態與非靜態方法在繼承中的應用 (1)靜態方法 (2)非靜態方法 當把A和B類的test方法的static去掉之後就會出現下圖標註的圈,這就表示是重寫。 快速生成重寫方法的快捷鍵:control + enter 或 alt + insert會出現如下圖所示: 下圖當進行方法的重寫之後走的都是A類 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...