阿里P7的消息中心架构设计笔记

news2024/10/7 14:24:29

前言

最近我们在重构消息中心,关于设计上的部分记录一下笔记,希望能够帮助到正在做类似设计的。另外我创建了一个高级研发的笔记分享群,免费加入,有兴趣的可以在文章底部扫描二维码加入

需求

我们的消息中心主要服务于如下场景:

1、业务使用消息通知对应人员;这也是我们目前主要的使用场景

2、给租户发送通知;如新功能上线,试用,开通功能场景

3、运营类的场景

以上只是列举了在企业中常见的3个场景,其实还有很多,消息中心存在着以下几个特征:

调用量大

消息中心的上游系统很多是监控系统、或者是营销系统等,这些系统的特点就是瞬间的调用量大,比如当云厂商发生故障时,基本上所有的监控系统都在告警,往外push消息。又或者营销系统在某个时间点大量发送营销消息。这个问题的答案就是引入MQ来削峰。

低延迟

业务方通常希望自己的消息越快越好,最好实时送达,但是我们的资源是有限的,所以我们应该给消息分级别和分泳道,因为重要的消息一般量小,需要低延时。而不重要的消息量大,往往可以接收一定时间的延时。按消息级别分泳道,不要让不重要的消息阻塞重要消息的发送。

不丢消息、不重复发送消息

消息要保证不丢失,不重复发送。我们要记录消息的状态,保证消息的幂等,还要支持发送失败的消息自动或手动重试。

历史消息查询和备份

我们可以分库分表,或者定期归档到hdfs。

消息统计分析

对消息的统计和分析主要用来治理我们的上游调用方,比如:有些业务大量的使用重要级别发送不重要消息,或者大量消息占用成本等等。

整体设计

我们先来看下整体的设计

图片

消息配置准备流程
图片

消息推送流程
图片

消息任务生命周期
图片

消息中心关键业务对象
图片

用户免打扰
某些用户可能不想接收消息,某些场景下用户可以主动设置,租户管理员也可以手动设置某些用户免打扰,不需要接收消息,或者限制接收消息的频次

技术方案

推模型
一般来说消息都是读多写少

拉模型
官方消息其实很少,可以采用客户端拉取模型

当然如果数据量太大可以放弃掉mysql,改用hbase存储

为什么是Hbase?
HBase 和 MySQL 的核心差异在于底层的数据结构,HBase 使用 LSM(Log-Structure Merge)树,Innodb 使用 B+树。

LSM 树,即日志结构合并树(Log-Structured Merge-Tree)。其实它并不属于一个具体的数据结构,它更多是一种数据结构的设计思想。

核心思路其实非常简单,就是假定内存足够大,因此不需要每次有数据更新就必须将数据写入到磁盘中,而可以先将最新的数据驻留在内存中,等到积累到最多之后,再使用归并排序的方式将内存内的数据合并追加到磁盘队尾 (因为所有待排序的树都是有序的,可以通过合并排序的方式快速合并到一起)。

LSM 具有批量特性,存储延迟。当写读比例很大的时候(写比读多),LSM 树相比于 B 树有更好的性能。因为随着 insert 操作,为了维护 B 树结构,节点分裂。读磁盘的随机读写概率会变大,性能会逐渐减弱。多次单页随机写,变成一次多页随机写,复用了磁盘寻道时间,极大提升效率。

缓解压力

1、异步写入消息

2、先写缓存

优先分发

利用消息优先级队列,将不同优先级的消息发送到不同的队列当中

SPI机制的运用

消息限流规则场景,用户可以利用SPI机制自定义限流规则

设计模式的运用

1、渠道工厂
利用工厂模式创建渠道对象

2、模板方法+策略模式-发送消息流程
消息发送的流程大体上是一致的,比如 选择渠道-》执行消息推送-》消息日志记录-〉状态更新

3、状态模式-消息状态
消息是有状态的,就绪、发送、到达、丢失、创建,每一个状态都有对应的逻辑,如果消息到达后会更改状态

DDD上下文划分

关于DDD的上下文划分也给出来了,DDD其实在我们系统设计中用到很多了,无论是子域、上下文划分到聚合设计

图片

未来展望

一个租户的短信消息可能走阿里云短信,可能走腾讯云短信

这样做一方面是为了并发处理和可用性,一方面是为了节省成本支出,因为不同数量的短信在不同的厂商的价格是不一样的。我们可以组合不同的价格策略对外提供消息价格,比如,外部接入消息价格为1条消息1毛,腾讯云和阿里云每个账号1w以下免费,那么我们就可以白赚2w条消息的钱。

因为高级研发笔记分享群是邀请制,评论留下你的微信号,我邀请你

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/694637.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++类与对象(下)

类与对象(下) 1.再谈构造函数1.1构造函数体赋值1.2初始化列表1.3explicit关键字 2.static成员2.1概念2.2特性 3.有元3.1有元函数3.2有元类 4.内部类4.1概念及特性 5.匿名对象6.拷贝对象时的一些编译器优化7. 再次理解类和对象 1.再谈构造函数 1.1构造函…

Acer宏碁掠夺者Predator战斧300 PH315-53原厂Windows10系统工厂模式,恢复安装原装OEM预装系统

Acer宏基笔记本电脑,Acer宏碁Predator掠夺者战斧300 PH315-53原装出厂Windows10系统 系统自带所有驱动、Office办公软件、出厂主题壁纸LOGO、 Acer Care Center、Quick Access、PredatorSense风扇键盘背光控制中心等预装程序 所需要工具:32G或以上的U盘…

Django框架实现简单的接口开发

前提创建一个Django项目&#xff0c;目录如下&#xff1a; Django框架上进行GET请求接口开发示例: 1.在上面项目结构目录Template下&#xff0c;新建一个login.html页面&#xff0c;定义表单提交请求的方式为post&#xff0c;具体代码如下。 <!DOCTYPE HTML> <html …

LSTM

其中一个门用来从记忆单元中输出条目&#xff0c;将其称为输出门&#xff08;output gate&#xff09;&#xff1b;另外一个门用来决定何时将数据读入记忆单元&#xff0c;将其称为输入门&#xff08;input gate&#xff09;&#xff1b;同时还需要一种机制来重置单元的内容&am…

Android Jetpack Compose之RadioGroup的使用

Android Jetpack Compose是一个现代化的UI工具包&#xff0c;帮助开发者以声明式的方式构建出美观且功能强大的Android应用。在本文中&#xff0c;我们将详细介绍其中的一个重要组件——RadioGroup。 一. RadioGroup简介 Jetpack Compose中并没有像传统View系统中那样直接提供…

刷题遇到的问题

前言&#xff1a;好记性不如烂笔头&#xff0c;在刷题的时候遇到了如下代码&#xff0c;最终运行结果与我想的答案有所不同&#xff0c;在此记录一下方便下次理解 1、变量提升与函数声明 var time new Date(); function fx() {console.log(time); // undefinedif (false) {…

LeetCode 剑指 Offer 13. 机器人的运动范围(深度遍历)

LeetCode 剑指 Offer 13. 机器人的运动范围 原题思路代码运行截图收获 原题 LeetCode 剑指 Offer 13. 机器人的运动范围 思路 通过深度遍历来找出所有可达的格子通过0、1、2来区分未遍历、可到达、不可到达三种状态 代码 class Solution { public:int visited[109][109];i…

Scala面向对象【下】

1、特质 Scala 语言中&#xff0c;采用特质 trait&#xff08;特征&#xff09;来代替接口的概念&#xff0c;也就是说&#xff0c;多个类具有相同的特质&#xff08;特征&#xff09;时&#xff0c;就可以将这个特质&#xff08;特征&#xff09;独立出来&#xff0c;采用关键…

VSCode 关闭未修改文件编辑器的替换

文章目录 1 关闭编辑预览参考 1 关闭编辑预览 在setting中搜索preview取消enable Preview 选项[可选] 设置不同工作区 参考 vs code取消打开一个文件会替换之前未修改文件 https://blog.csdn.net/networkhunter/article/details/105043771

多个域名映射一个nginx多个80端口

阿里云多个二级域名&#xff0c;解析到同一个机器外网ip地址&#xff1a; http://demo.xxx.com.cn/ http://yang.xxx.com.cn/ nginx.conf 配置文件&#xff1a; server{listen 80;server_name yang.xxx.com.cn;# 第1个二级域名映射80端口index index.html index.htm index.ph…

【深度学习】6-2 卷积神经网络 - 池化层

池化是缩小高、长方向上的空间的运算。比如下图&#xff0c;将2 x 2的区域集约成1个元素的处理&#xff0c;缩小空间大小 上面的例子是按步幅2进行2x2的Max池化时的处理顺序。“Max池化”是获取最大值的运算&#xff0c;“2 x 2”表示目标区域的大小。从2x2的区域中取出最大的…

探索Gradio的Chatbot模块:创建交互式聊天机器人

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️ &#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…

构建高效学生志愿者活动管理系统:基于前后端分离的设计与实现

本文介绍了一种基于前后端分离的学生志愿者活动管理系统的设计与实现。通过前后端分离的架构,系统实现了高度可扩展性和灵活性,能够有效管理学生志愿者活动,并提供友好的用户界面。文章将详细介绍系统的架构设计、技术选型以及核心功能的实现,并给出相应的代码示例。 学生…

Linux——4linux实用操作

目录 4.1 各类小技巧&#xff08;快捷键&#xff09; 4.2 软件安装 4.3 systemctl 4.4 软连接 4.5 日期、时区 4.6 IP地址、主机名 IP地址 主机名 域名解析 配置主机映射 虚拟机配置固定IP 4.7 网络传输 下载和网络请求 端口 4.8 进程管理 4.9 主机状态 4.10 …

使用docx4j实现word转pdf

前言 word文件转pdf docx4j 将word转pdf 导入依赖 <dependency><groupId>org.docx4j</groupId><artifactId>docx4j-JAXB-Internal</artifactId><version>8.3.9</version></dependency><dependency><groupId>or…

计算机网络 - 第一章(下)

1.2_1 分层结构、协议、接口、服务_哔哩哔哩_bilibili1.2_1 分层结构、协议、接口、服务是王道计算机考研 计算机网络的第7集视频&#xff0c;该合集共计76集&#xff0c;视频收藏或关注UP主&#xff0c;及时了解更多相关视频内容。https://www.bilibili.com/video/BV19E411D78…

移远通信推出新款卫星通信模组CC660D-LS,加速IoT终端直连卫星

上海&#xff0c;2023年6月27日 — 在2023上海世界移动通信大会&#xff08;MWC Shanghai&#xff09;期间&#xff0c;全球领先的物联网整体解决方案供应商移远通信宣布&#xff0c;推出其在卫星通信领域的最新力作—— CC660D-LS 模组。该模组现阶段面向北美和欧洲市场&#…

【雕爷学编程】Arduino动手做(133)---LCD1602扩展板模块

7款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&…

FDTD Solutions基础到精通,适用于微纳光学领域光学器件、超表面的仿真

专题二&#xff1a; “ FDTD 时域有限差分数值模拟方法与应用 课 程 内 容 FDTD基础入门 1 FDTD Solutions 求解物理问题的方法 1.1 FDTD与麦克斯韦方程 1.2 FDTD中的网格化 2 FDTD Solutions 特点与应用 3 FDTD功能与使用 主窗口——CAD人机交互界面计算机辅助设计…

SQL Server Management Studio (SSMS) 指定端口Port连接, 用逗号, 例如: localhost,1433

Microsoft SQL Server Management Studio (SSMS) 指定端口连接, 用,逗号, 例如 localhost,1433 localhost 等效 localhost,(逗号&#xff09;1433