⭐⭐⭐ Spring Boot 项目实战 ⭐⭐⭐ Spring Cloud 项目实战
《Dubbo 实现原理与源码解析 —— 精品合集》 《Netty 实现原理与源码解析 —— 精品合集》
《Spring 实现原理与源码解析 —— 精品合集》 《MyBatis 实现原理与源码解析 —— 精品合集》
《Spring MVC 实现原理与源码解析 —— 精品合集》 《数据库实体设计合集》
《Spring Boot 实现原理与源码解析 —— 精品合集》 《Java 面试题 + Java 学习指南》

摘要: 原创出处 知了一笑 「知了一笑」欢迎转载,保留摘要,谢谢!


🙂🙂🙂关注**微信公众号:【芋道源码】**有福利:

  1. RocketMQ / MyCAT / Sharding-JDBC 所有源码分析文章列表
  2. RocketMQ / MyCAT / Sharding-JDBC 中文注释源码 GitHub 地址
  3. 您对于源码的疑问每条留言将得到认真回复。甚至不知道如何读源码也可以请教噢
  4. 新的源码解析文章实时收到通知。每周更新一篇左右
  5. 认真的源码交流微信群。

一、业务背景

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

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

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

二、消息通知

1、流程管理

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

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

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

2、流程时序

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

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

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

3、结构设计

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

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

三、实践总结

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

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

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

文章目录
  1. 1. 一、业务背景
  2. 2. 二、消息通知
    1. 2.1. 1、流程管理
    2. 2.2. 2、流程时序
    3. 2.3. 3、结构设计
  3. 3. 三、实践总结