在同步包装器和CQRS实现之间有一个中间地带,每个服务/组件都可以支持同步查询和异步写入,这适用于中等规模运行的系统。所以读取查询可以在组件之间跳转以完成同步读取。另一方面,写入系统将流入异步通道。这里有一个权衡,对系统的读和写进行独立优化是不可能的,或者,这对于在高流量下运行的系统是有益的。
消息总线是故障的中心点
这不是一种折衷,而是一种预防措施。在异步通信方式中,消息总线是系统的支柱,所有的服务都不断地从消息总线上生产和消费。这使得消息总线成为系统的致命弱点, 因为它仍然是故障的中心点。消息总线支持横向扩展非常重要,否则它可能违背分布式系统的目标。
最终一致性
异步系统可以是最终一致性,这意味着查询结果可能不是最新的,即使系统已经发布了写入。虽然这种权衡可以让系统更好地扩展,但也需要同时考虑系统设计和用户体验。
混合可以同时使用异步和同步通信,但这两种方法的权衡会压倒他们的优势。一方面,系统必须交换处理两种通信风格,同步调用会导致级联降级和失败。另一方面,异步通信会增加设计的复杂性。根据我的经验,选择单一方式对于系统设计来说更加富有成效。
结语马丁福勒有一个关于如何构建微服务的伟大博客。一旦决定构建微服务架构,需要仔细审议其执行流程风格。对于写入繁重系统来说,带有同步包装的异步系统是最佳选择。而对于读取繁重系统,同步通信就很好。
对于读写繁重,但具有适度规模要求的系统而言,同步设计将大大简化设计。如果一个系统具有显著的规模和性能需求,那么使用CQRS模式的异步设计是一种可选方案。
腾讯云分布式微服务腾讯分布式微服务TSF围绕应用和微服务的PaaS平台,提供服务全生命周期管理能力和数据化运营支持,提供多维度应用、服务、机器的监控数据,助力服务性能优化;拥抱 Spring Cloud 开源社区技术更新和K8s容器化部署。
详见 https://cloud.tencent.com/product/tsf
问答
微服务架构:跨服务数据共享如何实现?
相关阅读
基于微服务的 Abixen 平台中的领域驱动设计方法
次世代的会话管理项目 Spring Session
使用Akka HTTP构建微服务:CDC方法