聊聊消息中心的设计与实现逻辑

厌烦被消息打扰,又怕突然间的安静;

一、业务背景

微服务的架构体系中,会存在很多基础服务,提供一些大部分服务都可能需要的能力,比如文件管理、MQ队列、缓存机制、消息中心等等,这些服务需要提供各种可以复用的方法或者接口,以便其他业务服务可以快速调用;下面来看看消息通知的原理:

聊聊消息中心的设计与实现逻辑

这里的消息不同于MQ队列,是指业务侧的通知机制,例如短信、邮件、系统消息等,在业务层面的需求很多,通常会封装单独的消息中心提供通知机制;

从流程上面看,消息通知是典型的生产-消费模式,业务侧不断的生产消息,消息中心在接收之后进行消费,把通知推送到相应的渠道中,很显然这种逻辑具备很高的复用性。

二、消息通知

1、流程管理

消息通知的流程设计,在各个业务线中通过消息中心提供的接口方法,将不同场景下的消息内容提交到消息中心,消息中心进行统一维护管理,并根据消息的来源和去向,适配相应的推送逻辑:

聊聊消息中心的设计与实现逻辑
  • 消息生产:涉及到的场景很多,比如活动、营销机制、系统通知、业务流转、过期提醒等;
  • 消息管理:对预发送消息的结构和参数进行校验,并创建消息推送的任务,维护任务级别的推送管理,跟踪消息的状态周期;
  • 消息消费:基于消息任务的结构,构建消息推送的主体内容,并对接多个发送渠道,实现通知的高效触达;
  • 定时任务:消息可以直接即时推送,但如果是夜间定时任务触发,则要考虑推送延迟问题,将消息放在指定时段投递;
  • 渠道对接:通常不同的渠道意味着不同的场景,例如监控推送钉钉,活动一般推送微信,账户变动发邮件,营销走短信,业务则应用内通知;

在整个流程中涉及到的模块比较多,状态的流转也很复杂,但是通过消息中心进行统一标准管理和流入流出的跟踪,也可以提供清晰的生命周期监控和维护;

2、流程时序

在整个消息通知链路中,在不同的流转节点中,无不涉及状态的变化(即from.to状态),这样可以构成整个生命周期的视图:

聊聊消息中心的设计与实现逻辑
  • 初始化:业务方构建简单的消息结构,请求发送到消息中心后,初始化一个消息任务;
  • 任务化:对消息发送请求进行校验,并将消息转换成一个标准的推送任务结构;
  • 推送中:根据任务推送的时间周期类型,将任务构建成不同渠道的通知主体,从而进行渠道消息推送;
  • 已完成:根据消息在渠道推送的状态回调,更新消息中心的任务完成状态,或者失败重试;

大部分的消息通知机制都可以容忍一定的延迟性,所以消息中心完全可以解耦各个流程,引入MQ队列或者异步机制,业务方只需要将请求发送到消息中心,之后由消息中心统一调度和管理即可;

3、结构设计

这里根据系统的实现过程和经验,给出一个数据结构的设计参考,用来对业务场景做简单的维度描述:

聊聊消息中心的设计与实现逻辑
  • 消息模板:定义通知的主体结构,基于消息的参数模型,构建推送的消息内容;
  • 消息任务:消息中心管理和维护的主体结构,以任务的模式维护消息从生产到推送完成的整个状态周期;
  • 场景记录:消息最终推送出去的内容和场景分类,也可以简单的理解为不同渠道的投递记录;
  • 交互消息:强调消息在接收方是否触达并且对消息产生了交互行为,例如会话,邮件回复,状态关联等;

三、实践总结

最后还是站在技术实现的角度,总结一下消息通知机制中的一些关键问题:

  • 生产消费:消息生产之后写入消息中心的存储容器,之后进行消费流程的管理,是业务解耦的常用手段;
  • 任务管理:以任务的模式进行消息推送的调度,通过任务状态的变化和控制,实现生命周期的管理;
  • 状态机:描述消息的流转节点和状态,在不同的事件中触发不同的状态切换和转移,并在状态变化后衔接各种业务动作;
  • 渠道对接:通常消息推送的渠道多是第三方平台,所以在消息中心会接入诸多的渠道,例如微信、钉钉、短信等;
  • 基础封装:作为分布式系统中的基础功能,在封装消息管理功能时,要考虑一定的复用性和流程的可视化呈现;

消息的本质是信息的触达和传递,但是过多的消息通知也容易让用户产生厌倦心态,所以消息内容的简洁明确,推送的间隔时段以及阅读提醒,在产品具体的实现上需要极为用心,从而让消息在业务体系中发挥更大的价值。

四、参考源码

编程文档:
https://gitee.com/cicadasmile/butte-java-note

应用仓库:
https://gitee.com/cicadasmile/butte-flyer-parent

Original: https://www.cnblogs.com/cicada-smile/p/16463422.html
Author: 知了一笑
Title: 聊聊消息中心的设计与实现逻辑

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/610584/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 5.5 Vim移动光标命令汇总

    Vim 文本编辑器中,最简单的移动光标的方式是使用方向键,但这种方式的效率太低,更高效的方式使用快捷键。 Vim 移动光标常用的快捷键及其功能如下面各表所示,需要注意的是,表中所有…

    Linux 2023年6月7日
    0108
  • jmeter并发设置的原理

    简介 广义并发 绝对并发 简介 ​ 性能测试过程中是否需要进行同步定时器的设置,需要根据实际情况来考虑。 ​ 举个栗子来讲是我们的双十一秒杀活动,这时候就必须实现请求数量达到一定数…

    Linux 2023年6月14日
    0148
  • LAMP 架构介绍及环境搭建

    1、LAMP 架构介绍及环境搭建 1.LAMP分别代表什么? L代表服务器操作系统使用Linux A代表网站服务使用的是Apache软件基金会中的httpd软件 M代表网站后台使用…

    Linux 2023年6月7日
    0111
  • 国产银河麒麟Kylin V10操作系统

    今天想在国产银河麒麟Kylin V10操作系统中设置win+E显示资源管理器(我的电脑)的快捷键,首先需要判断麒麟操作系统使用的哪种桌面, 在终端Terminal中执行 echo …

    Linux 2023年6月14日
    0101
  • ajax的发展

    ajax(Asynchronous Javascript and XML)异步javascrip和XMl. ajax只是一种web交互方法。在客户端(浏览器)和服务区段之间传输少量…

    Linux 2023年6月13日
    089
  • java程序使用ssl证书连接mysql

    bash;gutter:false; 1. 在mysql服务器上生成证书 openssl genrsa 2048 > ca-key.pem openssl req -new …

    Linux 2023年6月7日
    0104
  • 6.20(HTML和CSS–>练习案例)

    HTML脑图:how2j找的阶段性练习,话说VScode编辑器确实比DW好用,简洁免费(不是打广告哈哈) #0 <head> <meta charset=&quo…

    Linux 2023年6月7日
    0118
  • 进程间通信(IPC)

    进程间通信(Interprocess Communication,IPC)是指两个或者多个进程之间进行数据交换的过程 进程拥有独立的内存空间 命令行参数(向子进程传递和exec系列…

    Linux 2023年6月6日
    0121
  • 最新超详细VMware下CentOS系统安装

    一、了解CentOS系统 CentOS是免费的、开源的、可以重新分发的开源操作系统,CentOS(Community Enterprise Operating System,中文意…

    Linux 2023年6月15日
    0142
  • 自动化集成:Pipeline整合Docker容器

    前言:该系列文章,围绕持续集成:Jenkins+Docker+K8S相关组件,实现自动化管理源码编译、打包、镜像构建、部署等操作; 本篇文章主要描述流水线集成Docker用法。 一…

    Linux 2023年5月27日
    0117
  • 5.7 Linux Vim可视化模式

    相信大家都使用过带图形界面的操作系统中的文字编辑器,用户可以使用鼠标来选择要操作的文本,非常方便。在 Vim 编辑器中也有类似的功能,但不是通过鼠标,而是通过键盘来选择要操作的文本…

    Linux 2023年6月7日
    0133
  • CAPL学习笔记

    CAPL是CANOE自带的一种编程语言,要和CANOE中的一个节点绑定在一起。它的文件后缀是.can。 两种添加方式:1. 在simulation setup中增加一个网络节点,配…

    Linux 2023年6月13日
    091
  • 【转】对于任意的非负整数,统计其二进制展开中数位1的总数

    问题: 对于任意的非负整数,统计其二进制展开中数位1的总数。 解决: 在看这篇之前可以先看看上述这篇,这篇主要讨论其优化问题。 常规解法: O(logn): 无非就是每次取其二进制…

    Linux 2023年6月7日
    091
  • Linux动静分离与Rewrite

    一、动静分离 1.1 单台机器动静分离 1、创建NFS挂载点(NFS服务端) mkdir /static vim /etc/exports /static 172.16.1.0/2…

    Linux 2023年6月14日
    089
  • 实现邮箱发送验证码功能

    实现注册和忘记密码界面的邮箱发送验证码功能 邮箱验证步骤 本文使用了redis数据库做验证码的缓存,不想用redis数据库也可以直接将验证码放入mysql中,设置验证码有效期即可。…

    Linux 2023年6月7日
    0143
  • shell加密

    如何保护自己编写的shell程序要保护自己编写的shell脚本程序,方法有很多,最简单的方法有两种:1、加密 2、设定过期时间,下面以shc工具为例说明: 一、下载安装shc工具s…

    Linux 2023年5月28日
    087
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球