前言
在下首语言是golang,所以会用他作为示例。
原文参见 @arialdomartini的: Back-End Developer Interview Questions
面向服务架构(SOA)和微服务(Microservice)相关问题
1. 在SOA中,为什么长期存活的事务(Long-lived transation)不被看好,而Saga却被看好?
在面向服务的体系结构(SOA)中,长期存活的事务(Long-lived transaction)之所以不被看好,主要是因为以下几个原因:
-
数据一致性问题:长期事务跨越长的时间窗口,涉及多个服务的操作,这期间任何一个服务的失败或暂时不可用都可能导致事务无法完成。传统的ACID(原子性、一致性、隔离性和持久性)事务模型在这种场景下很难保证事务的完整性和一致性。
-
锁定资源时间过长:长事务在等待所有服务操作完成的过程中可能会持有数据库或其他资源的锁,这可能导致资源争用加剧,降低系统的并发性能,甚至导致死锁。
-
复杂性增加:在分布式环境下,维护跨越多个服务边界的大事务会显著增加系统的复杂性,尤其是在涉及到多个服务回滚逻辑时,往往需要复杂的补偿动作。
-
可靠性下降:长事务的生命周期越长,面临的问题越多,比如网络中断、服务重启、数据状态变化等不确定因素,这都会降低事务成功的概率。
相比之下,Saga作为一种分布式事务解决方案,更适合处理这类长期的、跨越多个服务边界的业务流程。Saga的主要优点如下:
-
补偿性事务:Saga模式采用了柔性事务(Eventually Consistent Transaction)的思想,将一个大事务分解成一系列的本地事务,每个本地事务完成后都不可逆,但如果后续事务失败,则通过执行预定的补偿操作来撤销之前已完成事务的影响,从而实现业务流程的整体一致性。
-
解耦与恢复:Saga允许服务之间的解耦,每个服务只需关心自己的业务逻辑和补偿逻辑,无需了解全局事务状态。同时,Saga通过序列化的事务和对应的补偿事务来应对失败,可以在失败后恢复到一个一致的状态。
-
更好的性能和可扩展性:Saga模式避免了长时间锁定资源,提高了系统的并发能力和响应速度,同时也更容易适应大规模分布式环境下的服务扩展。
-
适合微服务架构:在微服务架构中,服务之间相互独立,Saga模式很好地适应了这种分散自治的服务结构,使得每个服务都能够独立地进行版本管理和部署,而不受制于全局事务的约束。
2. SOA和MicroService之间有什么区别?
SOA(面向服务的架构)和微服务架构是两种不同的软件架构风格,它们分别在不同的时代背景下兴起,各有其特点和应用场景,以下是它们之间的一些主要区别:
-
服务粒度:
- SOA:SOA的服务通常是较大的业务功能单元,服务粒度相对较粗,一个服务可能封装多个业务功能,并且这些服务倾向于互相协作以完成更复杂的业务流程。
- 微服务:微服务架构主张服务的细粒度划分,每个服务只专注于完成一个单一的业务功能,并且每个服务都是自主的、可独立部署的实体。
-
自治性与耦合度:
- SOA:SOA服务虽然也是松耦合的,但服务间仍可能存在较高的依赖性,特别是对于共享的数据源和中间件设施如ESB(企业服务总线)。
- 微服务:微服务强调服务的高自治性,每个服务有自己的数据存储,服务间通过轻量级的API接口进行通信,耦合度较低。
-
开发与部署:
- SOA:在SOA中,服务可能仍然是较大规模的应用,开发和部署通常以单体或模块化的方式进行,更新和迭代可能会影响整个服务或者一部分服务。
- 微服务:微服务架构倡导单个服务的小团队独立开发、独立测试和独立部署,这意味着更新可以更加敏捷,风险也更易控制,符合持续集成与持续部署(CI/CD)的实践。
-
技术栈选择:
- SOA:SOA服务的技术栈可能较为统一,尤其是在大型企业中,可能会有一套标准的技术栈和基础设施。
- 微服务:每个微服务可以自由选择最适合自己的技术栈,比如不同的语言、数据库和其他工具,使得团队可以根据服务的具体需求进行最佳实践。
-
通信方式:
- SOA:SOA架构常常使用SOAP这样的重量级协议进行通信,也可能依赖于ESB来进行服务的中介和编排。
- 微服务:微服务更倾向于使用RESTful API、gRPC等轻量级通信协议,而且通常不依赖于中心化的服务总线,而是直接点对点通信。
-
架构目标与重点:
- SOA:SOA旨在解决企业级别的系统集成问题,提高服务的重用性,打破信息孤岛。
- 微服务:微服务架构则着重于快速迭代、持续交付、高可用性和可伸缩性,尤其适用于快速发展的互联网应用和服务。
总结来说,SOA是一个较为宏观的架构思想,它提倡将企业级应用拆分成一系列服务,而微服务架构则是SOA思想的一种进化,它将服务的拆分做得更为彻底,使每个服务都能成为一个可独立运作、易于维护和扩展的实体。
3. 我们来谈谈Web服务的版本管理、版本兼容性、重大变更管理这些事情吧
Web服务的版本管理、版本兼容性以及重大变更管理是现代软件开发和运维中至关重要的环节,它们确保了服务的稳定性、可维护性和持续演进能力。以下是对这三个方面的详细阐述:
Web服务的版本管理
-
目的:版本管理主要用于追踪Web服务的演变过程,包括功能增删改查、性能优化、安全更新等,使得开发者能够有效地控制不同版本的服务,方便回溯历史版本、对比差异和进行协同开发。
-
策略:常见的版本命名一般遵循语义化版本控制系统(Semantic Versioning, SemVer),即
主版本号.次版本号.修订号
的形式。主版本号变动表