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

简介: 聊聊 消息中心的设计与实现

一、业务背景

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

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

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

基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

二、消息通知

1、流程管理

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

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

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

2、流程时序

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

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

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

3、结构设计

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

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

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

三、实践总结

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

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

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

相关实践学习
快速体验阿里云云消息队列RocketMQ版
本实验将带您快速体验使用云消息队列RocketMQ版Serverless系列实例进行获取接入点、创建Topic、创建订阅组、收发消息、查看消息轨迹和仪表盘。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
相关文章
|
存储 消息中间件 缓存
|
11月前
|
SQL 关系型数据库 MySQL
SQL 判断是否“存在”?99% 的人还在写错!
在判断数据是否存在时,使用 `COUNT(*)` 会导致性能浪费,因为它会统计所有匹配记录,而我们只需知道是否存在即可。推荐使用 `EXISTS`,它在找到第一条匹配记录后立即返回,大幅提升查询效率。本文通过多个示例展示了 `EXISTS` 的用法,并对比了其与 `COUNT(*)` 的性能差异,帮助你写出更高效、优雅的 SQL 查询。
1191 3
|
数据采集 存储 搜索推荐
从零开始搭建埋点采集体系:轻松解锁用户行为分析
埋点技术因其高精度和定制化能力,成为许多公司的首选方式。然而,有些公司在埋点采集时,将其视为开发过程中的“附加任务”,让研发人员在开发过程中顺带加上一些埋点,而没有完整的规划和验证。这往往导致数据分析的效果不尽如人意。为了避免这种情况,我们需要将数据采集提升到项目级别,进行系统化的规划和实施。
1092 3
从零开始搭建埋点采集体系:轻松解锁用户行为分析
|
人工智能 Java 数据库连接
接口设计,接口返回信息,当账号不存在时候,应该返回200还是500,是直接返回R.fail()还是throw exception
本文探讨了Java接口设计中账号不存在时返回状态码(200、404或500)及处理方式(直接返回R.fail()或抛出异常)的选择。200适用于业务逻辑允许的情况,通过响应体告知客户端;404符合RESTful原则,表示资源未找到;500用于服务器内部错误。返回信息可使用R.fail()封装统一响应,或在异常情况下抛出异常并全局捕获。实际开发需依据业务需求与规范决定最佳方案。
490 5
|
开发者
如何画业务架构图
如何快速上手画业务架构图
14468 2
|
Dubbo Java 应用服务中间件
Dubbo两小时快速上手教程(直接代码、Spring、SpringBoot)
最近项目中需要用到dubbo,虽然我知道dubbo是一个RPC框架,但是没有去详细了解这个框架。既然项目要用,那就先把Dubbo的应用给学会,等熟练使用之后,再去了解Dubbo内部的原理。如果想要项目代码,直接联系我即可。如果想要demo代码,直接联系我即可。
8689 1
|
负载均衡 网络协议 网络性能优化
配置 Cisco 基于策略的路由 (PBR)
【8月更文挑战第31天】
1377 1
配置 Cisco 基于策略的路由 (PBR)
|
存储 缓存 监控
聊聊消息中心的设计与实现逻辑
消息通知的流程设计,在各个业务线中通过消息中心提供的接口方法,将不同场景下的消息内容提交到消息中心,消息中心进行统一维护管理,并根据消息的来源和去向,适配相应的推送逻辑。
1729 0
聊聊消息中心的设计与实现逻辑
|
监控 Java Linux
JVM内存问题之如果堆内存一直缓慢上涨,如何解决
JVM内存问题之如果堆内存一直缓慢上涨,如何解决
1906 1
|
消息中间件 Java Kafka
Java微服务架构中的消息总线设计
Java微服务架构中的消息总线设计