想象一个在线商店的情景,每当顾客提交订单时,你需要:
- 处理付款流程。
- 更新库存信息。
- 发送确认电子邮件。
立即执行所有这些步骤,尤其是在交通高峰期,可能会降低客户的体验速度。
在这种情况下,我们面临大量的应用程序事件,无法一次性处理所有事件。
当然,我们可以增加服务器的容量来处理这些大量的应用程序事件,但如果我们不需要一次性处理所有事件,最好将这些事件放入队列,稍后再处理。
消息队列的基础架构
消息队列是一种持久组件,驻留在内存中,支持异步通信功能。它充当缓冲区,同时分发异步请求。
消息队列的基本结构非常简单。发送方服务,称为生产者或发布者,生成并发布消息至消息队列。其他服务,称为消费者或订阅者,连接到队列并根据消息执行相应操作。
在实际应用中,可能会有许多应用程序向队列写入,而有许多服务器从队列中读取。
回到例子因此,在我们的情况中,不是立即处理每个任务,你可以将它们添加到队列的后面,然后从这个队列发送到我们的服务器。
- 订单创建: 订单详情被放入一条消息中。
- 消息加入队列: 消息被加入队列。
- 工作者处理: 独立的工作者从队列的前端拉取消息并处理任务。
此外,我们的服务器确认它已接收并处理了一条消息,队列会将其移除,以避免它被重复发送。
消息队列的优势主要的优势是我们解耦了这些事件,这个消息队列将使我们能够异步处理这些事件。我们可以在能够处理时再处理它们。
使用消息队列,生产者可以在消费者无法处理消息时将消息发布到队列中。
即使生产者不可用,消费者也可以读取消息。
另一个巨大的好处是,它们持久耐用。即使队列崩溃,数据也不会丢失,因为数据不是存储在 RAM 中,而是存储在磁盘上。
如果一个工人在处理消息时出了故障,没有问题!消息仍然在队列中等待,并将由另一个工人处理。
消息队列也提供了可扩展性。如果你收到大量订单,队列长度会增加。你可以增加更多的处理者来应对额外的负载,而不会影响到网站的运行。
队列的不同类型有多种类型的消息队列系统。最常见的包括例如:
- FIFO(先进先出): 就像普通的排队一样,消息按照它们到达的顺序被处理。这对于处理如支付等事务非常重要。
- 优先级队列: 有些消息可能比其他消息更重要。你可以为这些消息设定优先级,使它们优先得到处理。
一些队列等待工作者来取消息,而另一些则主动将消息发送给工作者(推送式队列)。
示例(示例)以下是一些流行的消息队列系统示例:
- RabbitMQ: 一个适用于多种使用场景的多功能消息队列。
- Kafka: 专为高吞吐量和实时数据流而设计。适用于日志记录、事件驱动架构等场景。
- Amazon SQS(简单队列服务): 由 AWS 提供的完全托管的基于云的消息队列服务。它具有可扩展性和可靠性,支持延迟队列和死信队列等功能。
如果您想了解在设计大规模分布式系统时消息队列的实际应用,那么请务必查看接下来的文章,我们在其中设计了一个类似 Twitter 的应用程序系统。
共同学习,写下你的评论
评论加载中...
作者其他优质文章