本文为各位开发者、架构师讲述系统设计中的消息队列,场景,设计与实践。
想象一下一个在线商店,每次客户下订单时,我们都需要:
处理付款。
更新库存。
发送确认电子邮件、短信等。
立即执行所有这些操作,尤其是在流量高峰期,可能会降低客户的体验。在这种情况下,有大量的应用程序事件,我们无法一次处理所有事件。
当然,我们可以扩展服务器来处理这些大量的应用程序事件,但如果不用一次处理所有事件,那么最好将这些事件排队并稍后处理。
在现实世界中,可能有许多应用程序写入队列,也有许多服务器从队列读取。
已下订单:订单详情已放入消息中。
消息已发送:消息已添加到队列。
工作进程:单独的进程(Workers,工作者)从队列前面拉取消息并处理任务。
此外,我们的服务器确认它已收到并处理了一条消息,然后队列会将其删除,以便不会再次发送。
有了消息队列,当消费者无法处理消息时,生产者可以向队列发布消息。
此外,即使生产者不可用,消费者也可以从队列中读取消息。
另一个特别大的好处是它们非常耐用。如果队列崩溃,数据不会丢失,因为它不是存储在内存,而是存储在磁盘中。
如果某个 worker 在处理消息时崩溃了,也没有问题!消息仍在队列中,将由另一个 worker 接收。
消息队列还提供可扩展性。如果您收到大量订单,队列只会变得更长一些。您可以添加更多worker来处理额外的负载,而不会影响网站。
FIFO(先进先出):与普通线路一样,消息按到达的顺序进行处理。这对于付款处理等而言非常重要。
优先级队列:某些消息可能比其他消息更重要。您可以对这些消息进行优先级排序,以便更快地处理它们。
RabbitMQ:一种适用于多种用例的多功能队列。
Kafka:专为高吞吐量和实时数据流而构建。非常适合日志记录和事件驱动架构等。
Amazon SQS(简单队列服务):AWS 提供的完全托管的基于云的队列服务。它具有可扩展性和可靠性,具有延迟队列和死信队列等功能。
关于消息队列,各位有何看法?欢迎留言讨论~
作者:万能的大雄
本文为 @ 万能的大雄 创作并授权 21CTO 发布,未经许可,请勿转载。
内容授权事宜请您联系 webmaster@21cto.com或关注 21CTO 公众号。
该文观点仅代表作者本人,21CTO 平台仅提供信息存储空间服务。