为了账号安全,请及时绑定邮箱和手机立即绑定

系统设计中的消息队列

标签:
架构 中间件

想象一个在线商店的情景,每当顾客提交订单时,你需要:

  1. 处理付款流程。
  2. 更新库存信息。
  3. 发送确认电子邮件。

立即执行所有这些步骤,尤其是在交通高峰期,可能会降低客户的体验速度。

在这种情况下,我们面临大量的应用程序事件,无法一次性处理所有事件。

当然,我们可以增加服务器的容量来处理这些大量的应用程序事件,但如果我们不需要一次性处理所有事件,最好将这些事件放入队列,稍后再处理。

消息队列的基础架构

消息队列是一种持久组件,驻留在内存中,支持异步通信功能。它充当缓冲区,同时分发异步请求。

消息队列的基本结构非常简单。发送方服务,称为生产者或发布者,生成并发布消息至消息队列。其他服务,称为消费者或订阅者,连接到队列并根据消息执行相应操作。

在实际应用中,可能会有许多应用程序向队列写入,而有许多服务器从队列中读取。

回到例子

因此,在我们的情况中,不是立即处理每个任务,你可以将它们添加到队列的后面,然后从这个队列发送到我们的服务器。

  1. 订单创建: 订单详情被放入一条消息中。
  2. 消息加入队列: 消息被加入队列。
  3. 工作者处理: 独立的工作者从队列的前端拉取消息并处理任务。

此外,我们的服务器确认它已接收并处理了一条消息,队列会将其移除,以避免它被重复发送。

消息队列的优势

主要的优势是我们解耦了这些事件,这个消息队列将使我们能够异步处理这些事件。我们可以在能够处理时再处理它们。

使用消息队列,生产者可以在消费者无法处理消息时将消息发布到队列中。

即使生产者不可用,消费者也可以读取消息。

另一个巨大的好处是,它们持久耐用。即使队列崩溃,数据也不会丢失,因为数据不是存储在 RAM 中,而是存储在磁盘上。

如果一个工人在处理消息时出了故障,没有问题!消息仍然在队列中等待,并将由另一个工人处理。

消息队列也提供了可扩展性。如果你收到大量订单,队列长度会增加。你可以增加更多的处理者来应对额外的负载,而不会影响到网站的运行。

队列的不同类型

有多种类型的消息队列系统。最常见的包括例如:

  • FIFO(先进先出): 就像普通的排队一样,消息按照它们到达的顺序被处理。这对于处理如支付等事务非常重要。
  • 优先级队列: 有些消息可能比其他消息更重要。你可以为这些消息设定优先级,使它们优先得到处理。

推 vs 拉

一些队列等待工作者来取消息,而另一些则主动将消息发送给工作者(推送式队列)。

示例(示例)

以下是一些流行的消息队列系统示例:

  • RabbitMQ: 一个适用于多种使用场景的多功能消息队列。
  • Kafka: 专为高吞吐量和实时数据流而设计。适用于日志记录、事件驱动架构等场景。
  • Amazon SQS(简单队列服务): 由 AWS 提供的完全托管的基于云的消息队列服务。它具有可扩展性和可靠性,支持延迟队列和死信队列等功能。

如果您想了解在设计大规模分布式系统时消息队列的实际应用,那么请务必查看接下来的文章,我们在其中设计了一个类似 Twitter 的应用程序系统。

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
JAVA开发工程师
手记
粉丝
205
获赞与收藏
1008

关注作者,订阅最新文章

阅读免费教程

  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消