在本文中,我们讨论为什么需要队列,以及它们如何构成微服务架构中异步通信的基石。
为什么使用异步消息传递?
为什么异步消息传递很重要?
考虑订购服务的简单示例:
客户通过 OrderService 下订单。假设涉及以下步骤:
-
它需要向 StockService 发送请求。
-
通过 EmailService 和 SMSService 向用户发送通信。
-
调用PackageService开始投递。
选项 1:单一组件进行所有处理
设计此应用程序的一种方法是使用一个组件来完成所有这些功能。例如,编写一个接受订单并自行完成所有处理的 Java 类。
选项 2:使用队列引入异步消息传递
另一种选择是在接收 OrderService 组件和其余组件之间有一个队列。当 OrderService 收到订单时,它会将请求放入队列中。其余组件是独立的服务,监听队列。
一旦订单被放入队列:
-
StockService 处理订单并更新数据库。
-
EmailService 向客户发送电子邮件。
-
SMSService 向用户发送一条SMS。
-
PackageService 对项目执行所需的包处理。
单个组件与队列
如果您的业务目标是支持数百或数千个用户,那么简单的架构将是一个不错的选择。第一个架构可能就是您所需要的。
然而,当我们谈论大型电子商务 Web 应用程序(例如 Amazon.com)时,它会在短时间内收到数百万个订单,因此您需要很大的灵活性。这时你就需要采取第二种方法,即引入队列。
使用消息队列的优点
让我们看看使用基于消息队列的异步通信的优点。
-
队列提高了可靠性
假设 SMSService 短暂关闭。
方案一中,由于OrderService收到订单后直接调用SMSService,导致短信无法发送出去。这可能意味着取消订单,因为所有步骤都是单个交易的一部分。其中一个组件出现故障将导致客户请求被取消,并需要他在稍后的时间点重新启动订单。
然而,在第二种称为异步通信的方法中,订单请求被放置在队列中。当 SMSService 恢复时,它将找到订单事件并处理它。然后,它可以针对所有待处理的请求发送 SMS 消息。
-
队列提供可扩展性
假设在任何一天,需要发送 100,000 条 SMS 消息。异步通信的一个选项是您可以增加 SMSService 的实例数量。组件实例的这种灵活性提高了系统的可扩展性。
-
队列提高了可测试性
每个组件/服务都是松散联系的,并且具有独立的需求。因此,测试它们中的每一个要容易得多,最好是单独测试。
-
队列提高了可维护性
队列还提高了系统的可维护性,因为应用程序被分为更小的服务。
-
队列提高了灵活性
队列不仅增加了现有服务的实例,还使系统变得灵活并能够在将来添加更多服务。您所需要做的就是向队列上的事件添加一个新的服务侦听器并使用它们。新服务可以插入,并且停机时间最短。
-
流行的消息队列
RabbitMQ 是一个非常流行的消息队列框架。
不同的框架使用不同的通信协议,但它们背后的概念是相同的。在其核心,队列将生成事件的组件与使用事件的服务分开。
一般来说,如果您需要一个能够满足非常大的用户群需求的系统,而这些用户群会提交大量要处理的请求,那么请选择基于队列的系统。
总结
在本文中,我们研究了两种类型的架构——同步和异步。同步系统的缺点是一个组件发生故障会导致整个系统的服务丢失。异步系统通过引入中间队列来保存事件来解决这个问题。基于使用队列的异步通信的体系结构提高了可测试性、可扩展性、可维护性和灵活性。
作者:Ranga Karanam
更多内容请关注公号【云原生数据库】
squids.cn,云数据库RDS,迁移工具DBMotion,云备份DBTwin等数据库生态工具。