超越架构师!消息通知系统优化设计

这篇具有很好参考价值的文章主要介绍了超越架构师!消息通知系统优化设计。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

5 收集联系信息流程

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

超越架构师!消息通知系统优化设计

用于存储联系信息的简化的数据库表模式。它是个带有电子邮件、电话、设备令牌和外部通道的单个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 通知发送和接收流程

初始设计的通知系统:

超越架构师!消息通知系统优化设计

图从左到右:

外部生产者 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中的事件总数和排队通知的总数。如果这两个指标很大,那么通知事件没有被工作人员快速处理。这意味着我们应该扩展,需要更多的工作人员。
  • 事件跟踪 — 一些重要的自定义指标,如开放率、点击率和参与度,对于理解客户行为很重要。我们应该为事件分配状态:已创建 → 待处理 → 已发送 → 已打开 → 已点击或错误、已退订。将事件状态集成到通知系统中,我们可以追踪通知事件。

更新的高级架构

超越架构师!消息通知系统优化设计

带有AWS的优化通知系统

8 结论

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

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

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

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

本文由博客一文多发平台 OpenWrite 发布!文章来源地址https://www.toymoban.com/news/detail-760062.html

到了这里,关于超越架构师!消息通知系统优化设计的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 分布式系统架构设计之分布式消息队列的水平扩展性、安全可用性以及监控与调优

    随着业务的快速发展和数据的不断增长,单一的消息队列服务器往往难以满足高并发、高可用和高吞吐量的需求,因此,如何实现消息队列的水平扩展成为了一个重要的问题。这部分我将从分区、副本、负载均衡等关键概念出发,一起探讨如何实现分布式消息队列的水平扩展

    2024年02月01日
    浏览(48)
  • 分布式系统架构设计之分布式数据存储的安全隐私和性能优化

    在前面分布式系统部分,有对安全性做过介绍,如前面所述,在分布式系统中,确保系统的安全性和隐私是至关重要的。安全性关注系统的防护措施,而隐私是关注用户的个人信息保护。 身份认证:确保用户和系统组件的身份是合法的,通过通过密码、令牌或证书实现 授权

    2024年02月02日
    浏览(57)
  • 大数据智能决策系统架构:数据收集与预处理

    作者:禅与计算机程序设计艺术 随着互联网、大数据、云计算的发展,越来越多的人能够接受并依赖于网络服务。但是,如何有效地利用这些数据进行智能决策,成为各个企业面临的重大课题。如何从海量的数据中提取有效信息,对企业管理具有重要意义。如何将海量的、复

    2024年02月06日
    浏览(40)
  • 【设计模式】深入理解中介者模式,解耦对象之间的复杂交互,实现用户之间的消息传递,优化飞机之间的航线协调,构建高效的系统交互方式

    中介者模式是一种行为型设计模式,其核心思想是通过引入一个中介者对象来封装一组对象之间的交互。这种模式可以降低对象之间的耦合度,使得对象之间的交互更加灵活和可维护。 在现实世界中,我们经常会遇到需要协调多个对象之间交互的场景,例如聊天室中的用户之

    2024年01月23日
    浏览(39)
  • 【Harmony OS - 消息通知】

    应用可以通过接口发送通知消息,提醒用户关注应用中的变化。用户可以在通知栏查看和操作通知内容,通常用于当应用处于后台时,发送,本文主要来介绍在Harmony OS中的三种消息通知。 总体流程有三步: 导入notification模块 配置通知参数之后通过publish发布通知 取消通知

    2024年02月01日
    浏览(40)
  • 小程序进阶-用户消息通知

    在使用或开发小程序过程中,我们会发现消息通知是非常重要的一个环节。我把小程序消息通知分为“ 小程序内通知 ”和“ 微信内通知 ”两种。小程序内通知包含各种步骤提示、错误提示以及各种实时消息通知,这些通知只有在用户进入小程序才会看到。微信内通知则是跳

    2024年02月09日
    浏览(43)
  • Jenkins 飞书消息通知

    如何在群组中使用机器人? 一、功能简介机器人 ( bot ) 是一种自动化的程序,可以向你自动推送消息,或与你进行简单的交互。你可以在群组中添加机器人,与团队成员实时共享消息,开展高效协作。例如,你可以利用飞书提醒机器人向团队成员发送提醒。注:一个群最多可

    2024年02月13日
    浏览(39)
  • 微信小程序服务通知(订阅消息)定时推送消息功能

    首先先说项目需求:向预约参观的用户提前一天晚上8点推送消息。小程序端主要用到的 API 是我是小程序用到的API。以及服务端用到的 API :我是服务端用到的API。 1. 开通订阅消息功能 (1)、 首先需要在小程序管理后台开通订阅消息功能。没开通前如下图所示: (2)、开通之

    2024年02月08日
    浏览(76)
  • 简化通知基础设施:开源的消息通知服务 | 开源专题 No.41

    Stars: 22.9k License: MIT Novu 是一个开源的通知基础设施项目,它提供了统一的 API 来通过多个渠道发送通知,包括应用内、推送、电子邮件、短信和聊天。主要功能有: 为所有消息提供商 (应用内、电子邮件、短信、推送和聊天) 提供单一 API 管理多个渠道上的通知非常容易 配备

    2024年02月08日
    浏览(34)
  • 微信小程序——订阅通知消息

    1.在微信公众平台的订阅消息页面设置模板消息 2.后端发送订阅消息需要得到用户的唯一id 通过   wx.login() 获取微信的唯一配置 code (每一个微信号只有一个code) 通过接口把获取到的 code 发送给后端 获取openid   3.在登录页面点击登录按钮的时候让用户同意接收订阅消息 使用

    2024年02月13日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包