微服务间的异步通信与挑战
1. 消息类型与最终一致性
在微服务架构中,消息主要分为事件消息和命令消息。事件消息用于宣布某个动作已经发生,通常用过去式表述,可发送给多个微服务,包含的信息仅够让消费服务知晓动作已完成。例如向邮件服务发送的消息可视为事件,邮件服务会相应地传递信息。
命令消息通常针对需要发布或修改数据的微服务。在消息被消费并执行操作之前,预期的数据在一段时间内不可用,这就是异步消息模型的关键缺点之一,被称为最终一致性。
最终一致性是分布式计算系统中的一个概念,它接受数据在一段时间内会不同步。这种约束仅在分布式系统和容错应用中可接受。在单体应用中,管理单个数据库中的一个数据集相对容易,因为数据始终是最新的,并且可以保证ACID事务。但在分布式系统中,当一个微服务中的数据发生变化时,另一个微服务中的数据也会发生变化,导致数据存储之间在一段时间内出现不一致。
CAP定理指出,我们无法保证分布式系统的三个主要属性:一致性、可用性和分区容错性:
- 一致性 :每次对数据存储的读取操作都将返回当前和最新版本的数据,如果系统无法保证是最新的,则会引发错误。
- 可用性 :即使返回的数据不是最新的,读取操作也总是会返回数据。
- 分区容错性 :即使存在可能会在正常情况下使系统停止的瞬态错误,系统仍将继续运行。例如,服务和/或消息系统之间存在轻微的连接问题,数据更新会延迟,但我们需要在可用性和一致性之间做出选择。
2. 消息总线的选择与配置
选择一致性还是可用性是一个非常重要的决策。