系统设计:分布式消息队列
学习消息队列,为什么我们使用它以及重要的用例。
什么是消息队列?
消息队列是互动实体之间的中间组件,这些实体被称为生产者和消费者。生产者生产消息并将它们放入队列中,而消费者从队列中检索消息并处理它们。可能有多个生产者和消费者同时与队列交互。
这里是通过单个消息队列相互作用的两个应用程序的示例:
动机
消息队列具有多个优点和应用场景。
提高性能: 消息队列使得两个交互实体(生产者和消费者)之间可以异步通信,并消除它们的相对速度差异。生产者将消息放入队列中而不等待消费者。同样,消费者在消息变为可用时处理它们。此外,队列通常用于将较慢的操作与关键路径分离开来,因此有助于减少客户端感知的延迟。例如,代替等待一个花费大量时间完成的特定任务,生产者进程发送一条消息,如果有多个请求,则将其保留在队列中,并继续执行其操作。消费者可以使用另一个队列通知我们有关处理的命运,无论是成功还是失败。
更好的可靠性: 通过消息队列将互动实体分离使系统更具容错性。例如,生产者或消费者可以独立失败而不影响其他人,并稍后重新启动。此外,将消息队列复制到多个服务器上可确保系统在一个或多个服务器宕机时仍然可用。
粒度扩展: 异步通信使系统更具可扩展性。例如,许多进程可以通过消息队列通信。此外,当请求数量增加时,我们在多个消费者之间分配工作负载。因此,应用程序完全可以根据其当前需求调整生产者或消费者进程的数量。
简单解耦: 消息队列解耦了系统中不同实体之间的依赖关系。交互实体通过消息通信,并且不了解彼此的内部工作机制。
速率限制: 消息队列还有助于吸收任何负载峰值并防止服务过载,充当一种基本形式的速率限制,如果需要避免丢弃任何传入请求。
优先级队列: 可以使用多个队列来实现不同的优先级,例如为每个优先级设置一个队列,并将更多的服务时间分配给更高的优先级队列。
消息队列的使用场景
消息队列在单服务器和分布式环境中具有许多用例。例如,它可以用于操作系统内部的进程间通信。它还可以在分布式环境中启用进程之间的通信。以下是一些消息队列的用例。
- 发送大量电子邮件: 电子邮件用于许多目的,例如共享信息、帐户验证、重置密码、营销活动等。为不同目的编写的所有这些邮件不需要立即处理,因此它们不会干扰系统的核心功能。在这种情况下,消息队列可以帮助协调不同发送方和接收方之间的大量电子邮件。# 数据后处理:
许多多媒体应用需要为不同的观众需求处理内容,例如在手机和智能电视上消费。通常来说,应用将内容上传到存储库并使用消息队列进行离线内容后处理。这样做可以显著减少客户感知的延迟,并使服务能够在适当的时间安排离线工作——可能是在计算能力不太繁忙的深夜。
推荐系统:
一些平台使用推荐系统向用户提供喜好内容或信息。推荐系统使用用户的历史数据进行处理,并预测相关内容或信息。由于这是一个耗时的任务,可以在推荐系统和请求处理之间加入消息队列以增加和加快性能。
我们如何设计分布式消息队列?
我们将分布式消息队列的设计分为以下五个步骤:
需求: 这里,我们专注于设计分布式消息队列的功能和非功能需求。我们还在这一步讨论单服务器消息队列及其缺点。
设计考虑: 在这一步中,我们讨论可能影响分布式消息队列设计的一些重要因素,例如在队列中放置消息的顺序、它们的提取、在队列中的可见性以及传入消息的并发性等。
设计: 在这一步中,我们详细讨论了分布式消息队列的设计。我们还描述了队列复制的过程以及设计涉及的各种组成部分之间的交互。
评估: 在这一步中,我们基于分布式消息队列的功能和非功能需求进行评估。
测验: 在本章的结尾,我们通过测验来评估对分布式消息队列设计的理解。
让我们首先了解分布式消息队列设计的需求。