通知系统已经成为许多应用进程非常流行的功能近年来。通知提醒用户重要信息,例如突发新闻、
产品更新、活动、产品等。它已成为我们日常生活中不可或缺的一部分。在本章中,您将被要求设计一个通知系统。
通知不仅仅是移动推送通知。三种类型的通知格式
分别是:移动推送通知、短信和电子邮件。图 10-1 显示了一个示例这些通知中的每一个。
构建一个每天发送数百万条通知的可扩展系统并非易事。它需要对通知生态系统有深入的了解。面试问题是故意设计为开放式和模棱两可的,您有责任询问问题以阐明要求。
应聘者:系统支持哪些类型的通知?
面试官:推送通知、短信和电子邮件。
应聘者:是实时系统吗?
面试官:让我们说这是一个软实时系统。我们希望用户接收通知尽快。但是,如果系统处于高工作负载下,则会有轻微的延迟可以接受。
应聘者:支持哪些设备?
面试官:iOS 设备、Android 设备和笔记本电脑/台式机。
应聘者:什幺会触发通知?
面试官:通知可以由客户端应用进程触发。它们也可以是在服务器端调度。
应聘者:用户可以选择退出吗?
面试官:是的,选择退出的用户将不再收到通知。
应聘者:每天发送多少条通知?
面试官:1000 万条移动推送通知、100 万条短信和 500 万条电子邮件。
本部分介绍支持各种通知类型的高级设计: iOS 推送通知、Android 推送通知、短信和电子邮件。其结构如下:
Android 推送通知
Android 采用类似的通知流程。Firebase Cloud Messaging 不使用 APNs,而是使用 APNs(FCM) 通常用于向 Android 设备发送推送通知。
短信
对于 SMS 消息,第三方 SMS 服务,如 Twilio [1]、Nexmo [2] 等常用。其中大多数是商业服务。
电子邮件
尽管公司可以创建自己的电子邮件服务器,但其中许多公司选择商业电子邮件服务。Sendgrid [3] 和 Mailchimp [4] 是最受欢迎的电子邮件服务之一,提供更好的交付率和数据分析。
图 10-6 显示了包含所有第三方服务后的设计。
联系信息收集流程
要发送通知,我们需要收集移动设备令牌、电话号码或电子邮件地址。如图 10-7 所示,当用户安装我们的应用进程或首次注册时,API 服务器收集用户联系信息并将其存储在数据库中。
图 10-8 显示了用于存储联系人信息的简化数据库表。电子邮件地址和电话数字存储在用户表中,而设备令牌存储在设备表中。一个用户可以有多个设备,表示可以向所有用户发送推送通知设备。
通知发送/接收流程
我们将首先介绍初始设计;然后,提出一些优化建议。
高级设计
设计如图 10-9 所示,下面对各个系统组件进行说明。
服务 1 到 N:服务可以是微服务、cron 作业或分布式系统,触发通知发送事件。例如,计费服务发送电子邮件提醒客户应付款或购物网站告诉客户他们的包裹将明天通过短信发送。
**通知系统:**通知系统是发送/接收的核心通知。从简单的事情开始,只使用一个通知服务器。它提供服务 1 到 N 的 API,并为第三方服务构建通知有效负载。
**第三方服务:**第三方服务负责将通知发送至用户。在与第三方服务集成的同时,我们需要格外注意扩展。良好的可扩展性意味着一个灵活的系统,可以很容易地插入或拔下第三方服务。另一个重要的考虑因素是第三方服务可能在新市场或将来不可用。例如,FCM 是在中国不可用。因此,使用了 Jpush、PushY 等替代第三方服务那里。
iOS、Android、短信、电子邮件:用户在其设备上接收通知。
此设计中发现了三个问题:
图 10-10 显示了改进的高级设计。
浏览上图的最佳方法是从左到右:
服务 1 到 N:它们表示通过 API 发送通知的不同服务通知服务器。
**通知服务器:**它们提供以下功能:
在高层设计中,我们讨论了不同类型的通知、联系信息收集流程和通知发送/接收流程。我们将深入探讨以下内容:
user_id bigInt
channel varchar # 推送通知、电子邮件或短信
opt_in boolean # 选择接收通知
在向用户发送任何通知之前,我们首先检查用户是否选择接收此类型
通知。
速率限制
为了避免用户被过多的通知淹没,我们可以限制的数量用户可以接收的通知。这很重要,因为接收器可能会关闭如果我们发送得太频繁,则完全通知。
重试机制
当第三方服务发送通知失败时,该通知将被添加到Message Queue 进行重试。如果问题仍然存在,将向开发人员发送警报。
推送通知的安全性
对于 iOS 或 Android 应用,appKey 和 appSecret 用于保护推送通知 API[6]. 只有经过身份验证或验证的客户端才能使用我们的蜜蜂属。有兴趣的用户应参考参考资料 [6]。
监控排队的通知
要监视的一个关键指标是排队通知的总数。如果数量很大,工作人员处理通知事件的速度不够快。为避免延误通知传递,需要更多的工人。图 10-12(归功于 [7])显示了一个要处理的排队消息的示例。
事件跟踪
通知指标(例如打开率、点击率和参与度)在以下方面很重要了解客户行为。分析服务实现事件跟踪。集成通常需要在通知系统和分析服务之间。图 10-13显示了可能出于分析目的而跟踪的事件示例。
更新的设计
将所有内容放在一起,图 10-14 显示了更新的通知系统设计。
在此设计中,与以前的设计相比,添加了许多新组件。
通知是必不可少的,因为它们让我们随时了解重要信息。它可能是关于 Netflix 上您最喜欢的电影的推送通知、关于折扣的电子邮件有关新产品的信息,或有关您在线购物付款确认的消息。
在本章中,我们描述了一个可扩展的通知系统的设计,该系统支持多种通知格式:推送通知、短信、电子邮件。我们采用了消息队列来解耦系统组件。
除了高层设计之外,我们还深入挖掘了更多组件和优化。
恭喜您已经走到这一步了。好工作!
参考资料
[1] Twilio 短信:https://www.twilio.com/sms
[2] Nexmo 短信:https://www.nexmo.com/products/sms
[3]发送网格:https://sendgrid.com/
[4] Mailchimp:https://mailchimp.com/
[5] 你不能进行精确一次交付:https://bravenewgeek.com/you-cannot-have exactly-once-delivery/
[6] 推送通知的安全性:https://cloud.ibm.com/docs/services/mobilepush?
主题=移动推送通知安全性推送通知
[7]RadditMQ:https://bit.ly/2sotIa6