首页 > 其他分享 >聊聊企业级消息推送的架构设计(001)

聊聊企业级消息推送的架构设计(001)

时间:2023-10-13 11:33:20浏览次数:40  
标签:架构设计 服务 通知 用户 企业级 001 消息 优先级 推送

最近有小伙伴拿到了一线互联网企业如阿里、网易、有赞、希音、百度、网易、滴滴的面试资格,遇到一几个很重要的面试题:

  • 企业级消息通知系统有哪些需求?如何满足?
  • 企业级消息通知系统,该如何做架构设计?

所以,这里今天给大家做一下系统化、体系化的梳理,使得大家可以充分展示一下大家雄厚的 “技术肌肉”,让面试官爱到 “不能自已、口水直流”。

一、架构目标

构建企业级统一基础推送服务,支持通过多渠道推送,能够统一集成的电子邮件、短信、聊天、钉钉、企业微信和其他公共社交应用:

  • 聊天 - 微信Wechat/QQ
  • 站内推送通知(移动设备和Web浏览器)
  • 站外推送通知(移动设备,APP没有开启)
  • 短信(如登录密码、营销活动)
  • 电子邮件
  • 钉钉
  • 企业微信

企业级统一基础推送服务,是一个通用特性,适用于所有现代分布式应用,无论采用何种编程语言和技术。

二、推送能力的演进

2.1 第一阶段(模块化):各自为政、各自封装

企业内部,早期业务量比较少,各系统基本都是有自己的推送模块,类型也是五花八门:

  • 聊天模块
  • 短信模块
  • 电子邮件模块
  • Websocket 模块

各自封装模块比较简单,但是实现分散、各系统模块的质量也很难统一保证。

2.2 第二阶段(框架化):集成框架

为了减少重复性设计、开发成本, 设计了统一的推送框架。

同一套微服务框架,共用一个统一的推送框架。

为了解决上述分散实现的问题,企业内部统一实现了一个综合各类推送功能的基础库,供业务方统一调用。

  • 聊天基础 starter
  • 短信基础 starter
  • 电子邮件基础 starter
  • Websocket 基础 starter

于是,我们把 springboot-starter 的逻辑封装到了服务治理框架内,微服务服务启动时,每一个服务对各种的 starter 进行运维管理、配置管理。

2.3 第三阶段(服务化):推送服务

集成到框架,每一套服务,都需要重复性的解决三高问题。

  • 推送服务,数据量大,需要解决跨库查询问题
  • 推送服务,性能要求高,需要解决高并发问题

大数据量、并发量高,意味着:

  • 硬件资源投入大
  • 运维成本高

这样的基础服务,需要进行沉淀,剥离,集中成统一的、基础服务,由专门团队负责维护、迭代、运维。降低重复投入、重复建设成本, 真正的降本增效。

于是, 推送框架 演进为 推送服务

三、推送服务在业务系统中的位置

一个业务应用, 基本上有很多原子服务编排、整合而来,最终构建出一个完整的架构图。

  • 接入层,这是外部请求进入内部系统的门户,所有的请求都必须通过 API 网关。
  • 应用层,也被称为聚合层,它为相关业务提供聚合接口,并调用中台服务进行组合。
  • 原子服务,包括就是原子技术服务,原子业务服务,根据业务需求提供相关的接口。原子服务为整个架构提供可复用的能力。

例如,在B站视频网站平台上,评论服务作为一项原子服务,在B站的视频、文章、社区都需要,那么为了提高复用性,评论服务就可以独立为原子服务,不能与特定需求紧密耦合。

在这种情况下, 评论服务,需要供一种可以适应不同场景的复用能力。

image

类似的,文件存储、数据存储、推送服务、身份验证服务等功能,都会沉淀为原子服务,业务开发人员,在原子服务基础上,进行编排、配置、组合,可以快速构建业务应用。

3.1 推送服务功能要求

  • 发送通知
  • 对通知进行优先级排序
  • 根据客户的保存偏好发送通知
  • 支持单个/简单的通知消息和批量通知消息
  • 各种通知的分析用例
  • 通知消息的报告

3.2 推送非功能性需求(NFR)

  • 高性能:qps > 1W
  • 高可用性(HA):99.99%
  • 低延迟:TP99 在10ms以下
  • 高扩展:可扩展/可插拔的设计,以便添加更多适配器和提供商,与所有通知模块的API集成以及与客户端和服务提供商/供应商的外部集成
  • 跨平台:支持Android/iOS移动设备和桌面/笔记本电脑的Web浏览器
  • 自伸缩:可在本地(VMware Tanzu)和 AWS、GCP 或 Azure 等公共云服务上扩展负载

四、推送系统设计架构

image

这些解决方案设计的考虑因素和组件包括:

4.1 通知客户端

这些客户端通过 API 调用请求单个和批量消息。它们将向简单和批量通知服务发送通知消息。

  • 简单通知客户端:专门用于发送单个通知的客户端,负责向用户发送单一通知。这些客户端通常用于向特定用户发送重要通知,例如密码找回或账户异常提醒。
  • 批量通知客户端:专门用于发送批量通知的客户端,负责向用户批量推送通知。这些客户端通常用于需要通知大量用户的场景,例如企业内部通知或营销活动。

4.2 通知服务

作为入口点的这些服务,通过暴露 REST API 与客户端互动。

它们负责构建通知消息,通过调用"模板服务"。这些消息将使用"验证服务"进行验证。

  • 简单通知服务:该服务将提供 API,主要负责处理简单通知请求,提供与后端服务集成的 API,以便将通知发送给用户。这种服务通常用于处理较少的通知请求,例如针对特定用户或事件的简单通知。
  • 批量通知服务:该服务将提供 API,主要负责处理批量通知请求,提供与后端服务集成的 API,以便批量发送通知。这种服务通常用于处理大量的通知请求,例如企业内部的批量通知或营销活动的批量推送。

此服务还将管理通知消息。它将发送的消息持久化到数据库并维护活动日志。

可以使用这些服务的 API 重新发送同一条消息。

它将提供添加/更新/删除和查看旧消息和新消息的 API。

它还将提供 Web 仪表板,该仪表板应具有筛选选项,以根据不同的条件(如日期范围、优先级、模块用户、用户组等)筛选消息。

4.3 模板服务

此服务主要负责所有可用的一次性密码(OTP)、短信、电子邮件、聊天以及其他推送通知消息的模板管理。

它还提供了 REST API,以便创建、更新、删除和管理模板。

除此之外,它还将提供一个用户界面(UI)的仪表板页面,使用户能从网络控制台检查和管理各种消息模板。

4.4 消息分发服务

  • 定时分发服务:

该服务将提供API来安排立即或指定时间的通知。可以是以下任何一种:

  • 分钟
  • 每小时
  • 每天
  • 每周
  • 每月
  • 每年
  • 自定义频率等。

还可能有其他自动触发的服务,基于预定时间进行消息触发。

  • 消息验证服务:

此服务全权负责根据业务规定和预期格式对通知信息进行核实。批量通知需由授权的系统管理员同意。

  • 消息优先级服务:

该服务负责对通知进行优先级排序,分为高、中、低三个等级。

通知信息具有较高的优先级和有时间限制的到期时间,它们将始终以较高优先级发送。

"通用出口处理器"会接收消息并根据相同的优先级从高、中和低三个不同的队列中发送和处理。

在非工作时间,可以以低优先级发送批量通知。

在交易过程中的应用程序通知可以发送到中优先级,如电子邮件等。企业可以根据通知的重要性确定优先级。

4.5 事件优先级队列(消息队列)

此服务提供事件中心功能,负责接收通知服务的高、中、低三个优先级的信息。

它会根据业务的优先级来发送和接收通知。企业可以根据通知的重要性来设定优先级。

服务内部包含三个主题,用于根据业务优先级接收和发送通知:

  • 低优先级:主要用于在非工作时间发送批量通知。
  • 中优先级:适用于在交易过程中发送的应用程序通知,如电子邮件等。
  • 高优先级:通知信息具有较高的优先级和有时间限制的到期时间,它们将始终以较高优先级发送。

4.6 通用出站处理程序

该服务通过轮询事件优先级队列来接收事件中心中的通知信息,并根据其优先级进行处理。

高优先级的通知会优先处理"高"队列,依次类推。

最后,它通过事件中心将通知信息发送到特定的适配器。

此外,该服务还从用户选择服务中获取目标用户/应用程序,以便进行通知的分发。

在处理过程中,通用出口处理器会根据事件的优先级进行相应的操作,确保重要事件得到优先处理。

这样,企业可以根据通知的优先级来确定处理顺序,从而提高通知的处理效率。

除此之外, 通用出站处理程序,还能进行消息的进一步按照通道类型进行分发:

该服务将消息发送到各种支持的适配器。

这些适配器会根据不同的设备(如桌面/移动设备)和通知类型(如短信/OTP/电子邮件/聊天/推送通知)进行转换。

4.7 通知适配器

这些转换器将从消息队列(RocketMQ)接收传入信息并根据其所支持的格式传递给外部合作伙伴。

以下是一些转换器,根据需求可以增加更多:

  • QQ 通知适配器服务
  • 微信 Wechat 聊天通知适配器服务
  • 应用内通知适配器服务
  • 电子邮件适配器服务
  • 短信适配器服务
  • OTP 适配器服务

4.8 通道供应商

这些是外部的 SAAS(云上/本地)服务提供商,利用它们的基础设施和技术实现实际的通知传递。

它们可能是像 AWS SNS、MailChimp 等的付费推送通道服务。

  • QQ 供应商集成服务
  • 微信 Wechat 供应商集成服务
  • 应用推送通知供应商集成服务
  • 电子邮件供应商集成服务
  • 短信供应商集成服务

4.9 用户选择服务

该服务提供选择目标用户和各种应用程序模块的功能。

这可能包括将批量消息发送到特定的用户组或不同的应用程序模块。

可能是 AD/IAM/eDirectory/用户数据库/用户组,具体取决于客户的偏好。

在服务内部,它将使用"用户配置文件服务"API 来消费和检查客户的通知偏好。

4.10 用户配置文件服务

此服务提供各种功能,包括管理用户配置文件及其偏好设置。

还管理内部用户标识,和外部通道标识之间的关联关系

  • 钉钉用户标识 和 用户标识 关联关系
  • 企业微信 用户标识 和 用户标识 关联关系
  • 用户和邮箱的关联关系
  • 等等

它还将提供取消订阅通知以及通知接收频率等功能。

"通知服务"将依赖于此服务,以便根据用户的通知偏好来发送通知。

此外,该服务还可以用于统计和分析用户对通知的偏好,以帮助企业优化通知策略。

4.11 分析服务

该处理器将负责执行所有的分析工作,识别通知使用情况、趋势并生成报告。

它将从分析数据库(Cassandra)和通知数据库中提取所有最终的通知信息,用于分析和报告目的。

以下是一些用例:

  • 每天/每秒的总通知数
  • 哪个通知系统使用最频繁
  • 消息的平均大小和频率
  • 基于优先级过滤消息等等...

4.12 通知跟踪器

此服务将持续监视事件中心队列并跟踪所有发送的通知。

它捕获通知的元数据,如传输时间、传送状态、通信渠道、消息类型等。

4.13 通知数据库:MySQL 数据库集群

通知数据库,用于存储库用于存储所有通知信息,包括发送时间、状态等。

它包括一个数据库集群,其中领导者用于执行所有写操作,读取操作则在读取副本/跟随者上进行。

这个数据库群集将持久化所有通知,供分析和报告使用。

它基于“写入更多,读取更少”的理念。

它能提供良好的性能和低延迟,适应大量的通知,因为它内部处理大量的写操作,并与其他数据库节点同步,保持高可用性和可靠性的冗余数据/消息。

在任何节点崩溃的情况下,消息将始终可用。

转自:redeemer,

链接:juejin.cn/post/7277489276270985257

标签:架构设计,服务,通知,用户,企业级,001,消息,优先级,推送
From: https://www.cnblogs.com/hefeng2014/p/17761692.html

相关文章

  • QECon大会亮相产品,更合适的企业级测试平台:RunnerGo
    在当今这个数字化时代,应用程序的性能至关重要。一款可靠的性能测试工具,能够为企业带来无数的好处。最近,一款名为RunnerGo的开源性能测试工具备受瞩目。本文将详细介绍RunnerGo的特点、优势以及如何解决性能测试中的痛点。 RunnerGo产品介绍RunnerGo是一款由国内开发者自主研......
  • 直播预约丨《实时湖仓实践五讲》第二讲:实时湖仓功能架构设计与落地实战
    如今,大规模、高时效、智能化数据处理已是“刚需”,企业需要更强大的数据平台,来应对数据查询、数据处理、数据挖掘、数据展示以及多种计算模型并行的挑战,湖仓一体方案应运而生。《实时湖仓实践五讲》是袋鼠云打造的系列直播活动,将围绕实时湖仓的建设趋势和通用问题,邀请奋战于企业数......
  • xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance(xsi:schemaLocation详解)
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"中xsi的意思是:本xml文件中要用到某些来自xsi代表的“http://www.w3.org/2001/XMLSchema-instance”这个命名空间的元素 比如用来引入无命名空间schema文件的noNamespaceSchemaLocation="XXX";以及引入自带命名空间的sch......
  • 20230925~20231001
    [ABC321E]CompleteBinaryTree二叉树,计数。每次往上跳father的时候算一算就行,答案是一个等比数列求和状物。test20230925前一天没睡好,感觉脑子根本不转,考的很烂,应该要想到的东西没想到。T1:写了个很劣的dp,知道不能把\(s\)放在状态里,但是没想到直接乘个组合数就行。还有......
  • 中小型企业级子网划分
     一、基础知识(一)ip地址组成及子网掩码    首先ip地址是由网络部分和主机部分组成,也就是网络位和主机位,用于描述某个范围的某台设备,类似于手机号码的在大陆区号是86,香港的是852,先确定范围,再锁定目标。    那么怎么区分网络位和主机位呢?这就要提到一个新的概念......
  • 企业级增量实战
    企业级增量恢复实战背景:某大型网站,mysql数据库,数据量500G,每日更新量100M-200M备份策略:xtrabackup,每周六0:00进行全备,周一到周五及周日00:00进行增量备份。故障场景:周三下午2点出现数据库意外删除表操作。模拟故障:#编辑脚本#!/bin/bashmysql-uroot-p123-e"dropda......
  • Kafka在企业级应用中的实践
    前言前面说了很多Kafka的性能优点,有些童鞋要说了,这Kafka在企业开发或者企业级应用中要怎么用呢?今天咱们就来简单探究一下。1、使用Kafka进行消息的异步处理Kafka提供了一个可靠的消息传递机制,使得企业能够将不同组件之间的通信解耦,实现高效的异步处理。在企业级应用中,可以......
  • 研发三维GIS系统笔记/实现wgs84投影-001
    1.工作内容,改造引擎,支持wgs84投影改造原因:目前投影是墨卡托投影(与GoogleMap一致)目前的GIS系统是二维的采用这个坐标系是没有问题的但不支持wgs84瓦片数据以及高程数据,工作中很多数据是wgs84格式的,尤其很多三维GIS都是采用wgs84投影wgs84与mercator从数据上......
  • 2023年软考-系统架构设计师论文预测
    2023年11月4日软考-系统架构设计师论文预测:微服务:一种云原生架构方法,在单个应用中包含众多松散耦合且可单独部署的小型组件或服务层次风格:数据访问层、业务逻辑层、表示层基于架构的软件开发:ABSD有三个基础,功能拆分、架构风格、使用软件模板。它强调由商业、质量和功能需求的组合驱......
  • 复杂系统的架构设计与开发(节选一)
    本文内容摘自《系统架构. 复杂系统的产品设计与开发》系统架构原则涌现原则(2.2.2节) 当各实体拼合成一个系统时,实体之间的交互会把功能、行为、性能和其他内在属性涌现出来。 整体原则(2.4.3节) 每个系统都作为某一个或某些个大系统的一小部分而运作,同时,每个系统中......