消息通知(Notification)系统优化

点击下方“JavaEdge”,选择“设为星标”

第一时间关注技术干货!

免责声明~

任何文章不要过度深思!

万事万物都经不起审视,因为世上没有同样的成长环境,也没有同样的认知水平,更「没有适用于所有人的解决方案」

不要急着评判文章列出的观点,只需代入其中,适度审视一番自己即可,能「跳脱出来从外人的角度看看现在的自己处在什么样的阶段」才不为俗人

怎么想、怎么做,全在乎自己「不断实践中寻找适合自己的大道」

5 收集联系信息流程

为发送通知,需收集各种信息如移动设备令牌、email、phone和第三方通道信息。

696b70ffb1843b414236b3a4fca31799.png

用于存储联系信息的简化的数据库表模式。它是个带有电子邮件、电话、设备令牌和外部通道的单个NoSQL DynamoDB表。Contacts table schema:

device_tokens 应以 JSON 格式存储。示例:

[{"deviceToken": "[设备令牌UUID]","platform": "apns"},{"deviceToken": "[设备令牌UUID]","platform": "fcm"}
]

external_channels 字段

[{"platform": "slack","url": "[通道的唯一URL]","status": true},{"platform": "another-service","url": "...","status": false}
]

用户可拥有多个设备、第三方通道,表示可将推送通知发送到用户的所有设备。

6 通知发送和接收流程

初始设计的通知系统:

d45882c32d6a00b414b3b6f618f5cba9.png

图从左到右:

外部生产者 1~N — 代表希望通过通知系统提供的API发送通知的不同服务。如结算服务发送短信提醒客户付款到期,或者购物网站的交付消息到他们的客户。

API网关 将为生产者提供API接口,并将请求正确地路由到通知服务(Lambda)。

通知服务 类似后端服务,功能如下:

  • 执行基本验证,以验证电子邮件、电话号码、设备令牌等。

  • 查询数据库以获取生成通知事件所需的数据。

  • 将通知数据推送到事件总线以进行并行处理。

联系人数据库 — 存储有关用户、联系信息、设置等数据的DynamoDB表。

EventBridge,AWS服务,将其用作事件总线。还需定义事件规则以正确将事件路由到队列。

这是通知事件的示例。每个 detail-type 将针对一个通知类型。因此,SQS队列根据属性模式过滤事件。

{"id": "<required::uuid>","source": "payment_request_event","detail-type": ["payment_notification_sms"],"resources": ["payments"],"detail": {...}"time": "<required>","region": "<required>","account": "<required>"
}

消息队列 — 它们用于消除组件之间的依赖关系。SQS队列在需要发送大量通知时充当缓冲区。每种通知事件类型都分配到一个独立的消息队列,以便一个发送服务的中断不会影响其他通知类型。

Worker — 从SQS队列轮询通知事件并将其发送到相应的服务的Lambda服务列表。

SNS或第三方服务 — 这些服务负责将通知传递给消费者。在与第三方服务集成时,我们需要关注可扩展性和高可用性。可扩展性的一个很好的例子是一个灵活的系统,可以轻松切换第三方服务的开/关。另一个重要考虑因素是第三方服务可能在某种程度上不可用,然后我们应该能够切换到另一个服务,并尽量减小对业务的影响。

7 优化

在高级设计中,我们讨论了通知系统的三个主要部分:不同类型的通知、收集联系信息流程和通知发送/接收流程。关键是:

  • 事件和推送通知中的安全性

  • 通知模板和设置

  • 可靠性和弹性

  • 重试机制

  • 速率限制

  • 监视队列中的通知和事件跟踪

事件和推送通知的安全性

  • 在存储敏感数据的情况下,我们应该启用DynamoDB的数据保护,如静态加密,并集成AWS Key Management Service(AWS KMS)以管理用于加密表的加密密钥。并使用IAM角色对DynamoDB的访问进行身份验证。

  • 在访问资源方面实施最小权限原则

  • 通过使用SSL/TLS与AWS资源通信,启用EventBridge的数据保护,以在传输中进行加密。建议使用TLS 1.3。

  • 对于iOS和Android应用,appKey和appSecret用于保护推送通知API。只有经过身份验证或经过验证的客户端才允许使用API发送推送通知。这些凭据应通过Secret Manager或Parameter Store存储和加密。

通知模板和设置

  • 我们应该为相同通知类型创建一个通知模板,其遵循相似的格式。它可以被重用,并避免从头开始构建每个通知内容。

  • 通知模板是预格式化的通知内容,通过自定义参数、跟踪链接

等创建唯一的通知。我们可以将这些通知模板存储在带有定义前缀的S3桶中。

  • 为了为用户提供对通知设置的细粒度控制,我们可以将其存储在单独的通知设置表中。在向用户发送任何通知之前,我们首先检查用户是否愿意接收这种类型的通知。

可靠性和弹性

  • 防止数据丢失 — 通知系统中最重要的非功能性要求之一是不能丢失数据。通知可能会延迟或重新排序,但不应该丢失。为了满足此要求,通知系统将通知数据持久保存在另一个日志表中,并实施重试机制。

  • 接收一条通知确切地一次吗? — 不,不可以。根据第三方服务提供商的SLA,尽管通知大多数时候确切地传递一次,但分布式性质可能导致重复的通知。我们可以减少重复的发生,然后引入去重机制并小心处理故障。

  • 这是一个简化的逻辑:当通知事件首次到来时,我们通过检查 eventId 来查看它是否以前传递过。如果之前成功传递,则将其丢弃。否则,我们将发送通知。

  • 弹性基础设施 — 我们应该考虑在多个可用区部署,您可以设计和操作可以在可用区之间自动故障转移而不中断的应用程序和数据库。可用区比传统的单一或多数据中心基础设施更具高可用性、容错性和可扩展性。

重试机制

  • 当SNS/第三方服务无法发送通知时,通知将被添加到死信队列进行重试。如果问题仍然存在,将向负责的开发人员发送警报。

速率限制

  • 我们应该考虑礼貌地发送通知。为了避免向用户发送过多通知,通过使用SQS并限制用户在一段时间内可以接收的通知数量,我们可以提高通知系统的礼貌度。

监视队列中的通知和事件跟踪

  • 我们应该使用AWS CloudWatch指标监视通知系统。要监视的关键指标是EventBirdge中的事件总数和排队通知的总数。如果这两个指标很大,那么通知事件没有被工作人员快速处理。这意味着我们应该扩展,需要更多的工作人员。

  • 事件跟踪 — 一些重要的自定义指标,如开放率、点击率和参与度,对于理解客户行为很重要。我们应该为事件分配状态:已创建 → 待处理 → 已发送 → 已打开 → 已点击或错误、已退订。将事件状态集成到通知系统中,我们可以追踪通知事件。

更新的高级架构

d3e80de545fb992623a41fb610a094af.png

带有AWS的优化通知系统

8 结论

文章强调了通知在让我们了解关键信息方面的不可或缺性。旨在阐明可扩展、高可用和可靠的通知系统的蓝图,该系统可适应各种通知类型,包括移动推送通知、短信、电子邮件和第三方应用通知。

为实现目标,我选择基于事件的架构,利用EventBridge和SQS队列解耦系统组件。

设计广泛使用AWS服务,采用无服务器框架,这种选择不仅确保了效率,而且还将定价和运营成本降到了最低。

该设计遵循了十二要素应用的原则,将支持服务视为附加资源,将配置存储在环境中,并将日志视为事件流,其中还考虑了其他一些因素。

参考:

  • 编程严选网

写在最后

编程严选网(www.javaedge.cn),程序员的终身学习网站已上线!

点击阅读原文,即可访问网站!

欢迎长按图片加好友,我会第一时间和你分享软件行业趋势面试资源学习途径等等。

6a059a93533ef746d023540ccf151d99.jpeg添加好友备注【技术群交流】拉你进群,更多教程资源应有尽有

关注公众号后,在后台私信:

  • 回复【架构师】,获取架构师学习资源教程

  • 回复【面试】,获取最新最全的互联网大厂面试资料

  • 回复【简历】,获取各种样式精美、内容丰富的简历模板

  • 回复 路线图,获取直升Java P7技术管理的全网最全学习路线图

  • 回复 大数据,获取Java转型大数据研发的全网最全思维导图

  • 微信【ssshflz】私信 【副业】,进副业交流群

  • 点击阅读原文,即可访问程序员一站式学习网站

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

连续型随机变量的概率密度

如果对于随机变量的分布函数&#xff0c;存在非负可积函数&#xff0c;使得对于任意实数&#xff0c;有&#xff1a; 那么就称为连续型随机变量&#xff0c;称为的概率密度函数&#xff0c;简称密度函数。

C语言leetcode集训二:字符串(1):字符串遍历

今天集训的内容是字符串中的字符串遍历题&#xff0c;仍然是简单题&#xff0c;但也可以掌握一些字符串所必要的知识&#xff0c;加深对字符串的理解&#xff0c;关于字符数组和字符串&#xff0c;字符串的输入输出在这就不再做过多赘述&#xff0c;关于字符串的问题&#xff0…

深度学习 Day16——P5运动鞋识别

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制 文章目录 前言1 我的环境2 代码实现与执行结果2.1 前期准备2.1.1 引入库2.1.2 设置GPU&#xff08;如果设备上支持GPU就使用GPU,否则使用C…

CSS的三大特性(层叠性、继承性、优先级---------很重要)

CSS 有三个非常重要的三个特性&#xff1a;层叠性、继承性、优先级。 层叠性 场景&#xff1a;相同选择器给设置相同的样式&#xff0c;此时一个样式就会覆盖&#xff08;层叠&#xff09;另一个冲突的样式。层叠性主要解决样式冲突 的问题 原则&#xff1a;  样式冲突&am…

行政前台快递管理教程

行政前台快递管理&#xff0c;成了企业前台工作人员不可逃避的话题。看似简单的几个字&#xff0c;却难倒了不少人。身边有从事行政前台工作的朋友&#xff0c;应该或多或少都会听其抱怨过...... 为什么公司寄件管理这么难&#xff1f; 为什么员工不能按规定寄件&#xff1f;…

我在代码随想录|写代码之203. 移除链表元素,707. 设计链表,206. 反转链表

​第一题 ​​ 203. 移除链表元素 题目: 思路分析: 我们要删除节点说白了就是将节点移除,将要删除的节点的前一个的next域移动到要删除节点的next域,我们可以这样写当我们运到我们要删除节点然后件他删除,那么怎么删除?我们可以直接让我们要删除的元素找不到。如果我们直接将…

MySQL事务与MVCC详解

前置概念之事务 在开始MVCC的讨论之前&#xff0c;我们必须了解一些关于事务的概念。 什么是事务 现在我们开发的一个功能需要进行操作多张表&#xff0c;假如我们遇到以下几种情况: 某个逻辑报错数据库连接中断某台服务器突然宕机… 这时候我们数据库执行的操作可能才到一…

理解Socket

前言 我在去年就学习过Java中Socket的使用&#xff0c;但对于Socket的理解一直都是迷迷糊糊的。看了网上很多关于Socket的介绍&#xff0c;看完还是不太理解到底什么是Socket&#xff0c;还是很迷。直到最近在学习计算机网络&#xff0c;我才对Socket有了一个更深地理解。之前一…

Chapter 7 - 3. Congestion Management in Ethernet Storage Networks以太网存储网络的拥塞管理

Pause Threshold for Long Distance Links长途链路的暂停阈值 This section uses the following basic concepts: 本节使用以下基本概念: Bit Time (BT): It is the time taken to transmit one bit. It is the reciprocal of the bit rate. For example, BT of a 10 GbE po…

Axure中动态面板使用及轮播图多种登录方式左侧导航栏之案列

&#x1f3ac; 艳艳耶✌️&#xff1a;个人主页 &#x1f525; 个人专栏 &#xff1a;《产品经理如何画泳道图&流程图》 ⛺️ 越努力 &#xff0c;越幸运 目录 一、轮播图简介 1、什么是轮播图 2、轮播图有什么作用 3、轮播图有什么特点 4、轮播图适应范围 5、…

使用opencv的Canny算子实现图像边缘检测

1 边缘检测介绍 图像边缘检测技术是图像处理和计算机视觉等领域最基本的问题&#xff0c;也是经典的技术难题之一。如何快速、精确地提取图像边缘信息&#xff0c;一直是国内外的研究热点&#xff0c;同时边缘的检测也是图像处理中的一个难题。早期的经典算法包括边缘算子方法…

Android--UML类图使用详解

明敕星驰封宝剑&#xff0c;辞君一夜取楼兰 一&#xff0c;定义 类图(Class diagram)是显示了模型的静态结构&#xff0c;特别是模型中存在的类、类的内部结构以及它们与其他类的关系等。类图不显示暂时性的信息。类图是面向对象建模的主要组成部分。它既用于应用程序的系统分…