一文理解分布式开发中的服务治理

我们在分布式开发中经常听到的一个词就是“服务治理” 。在理解“服务治理”的概念之前让我们先理解什么是分布式系统,分布式系统之间如何通过RPC(Remote Procedure Call,远程过程调用)方式通信,以及如何解决RPC框架存在的问题,这样才能真正地理解服务治理的核心思想 。
 
分布式系统
分布式系统指的是通过网络连接让多台计算机协同解决单台计算机所不能解决的计算、存储等问题,多台计算机之间通过 RPC 方式通信 。在使用分布式系统前,首要解决的问题是如何拆解当前面临的问题 。通过使用多台计算机分布式解决问题,让分布式系统中的每台机器都负责解决原问题的一个子集 。一般来说,可以使用横向拆分法或者纵向拆分法对复杂的系统进行拆分 。
◎横向拆分:在无状态系统中多部署几个实例,通过负载均衡方式协调每个实例所负载的计算量 。
◎纵向拆分:将一个大应用拆分为多个小应用(例如,将系统拆分为用户、商品、订单服务),每个小应用都负责处理一部分业务 。
然而,虽然通过拆分法解决了计算或存储的问题,但是使用分布式技术进行开发会引发比单体应用更多的问题,比如网络异常、数据一致性及分布式系统性能等 。因此,在使用分布式架构开发系统前,需要先深入理解分布式系统的概念和可能存在的异常 。
01.分布式系统中的常见异常 
◎服务器宕机:服务器宕机是分布式架构下最常见的异常之一 。任何服务器都有可能发生故障,而且故障发生的类型、时间都不尽相同 。所以,分布式系统一般允许部分服务器发生故障,但要求在部分服务器发生故障时不影响整个系统的正常使用 。
◎网络异常:服务器与服务器之间通过网络通信,若在通信过程中出现消息丢失,则两个节点之间无法进行通信,会出现网络分化、消息乱序等网络问题 。
◎分布式系统的三态:如果某个节点向另一个节点发起RPC请求,比如节点A向节点B发送一个消息,节点B根据收到的消息完成某些操作,并将操作的结果通过消息返回给节点A,那么这个RPC请求的执行结果可能有三种状态:成功、失败、超时(未知) 。我们将这三种状态称为分布式系统的三态 。在设计架构时需要考虑成功、失败、超时(未知)这三种状态的处理方式 。
◎存储的数据丢失:对于有状态节点来说,数据丢失意味着状态丢失 。通常只能从其他节点读取、恢复该存储数据的状态 。
02.分布式系统的副本分类 
分布式系统的副本指的是在分布式系统中为数据或服务提供的冗余 。该副本可分为服务副本和数据副本两种类型 。
◎服务副本:多个节点提供某种相同的服务,这种服务不依赖本地节点的存储状态,是一种无状态服务 。
◎数据副本:在不同的节点上持久化同一份数据 。当出现某一个节点存储的数据丢失时,可以从其他副本上读取该数据 。数据多副本是分布式系统解决数据丢失异常的唯一方法,因为数据被分散或者复制到不同的机器上,所以如何保证各台主机之间数据的一致性,成为一个难点 。
对于分布式系统而言,服务副本非常容易控制,由于服务本身具备无状况特性,运维人员可以动态增加或者减少服务副本的数量,而不会影响服务接口返回数据的正确性 。数据副本分布在不同的计算机上,从技术角度来看,数据的一致性面临着巨大的挑战 。数据副本的一致性通常具有以下几种情况 。
◎强一致性:任何时刻任何用户或节点都可以读到最近一次成功更新的副本数据 。这是程度最高的一致性要求,也是实践中最难实现的一致性 。
◎弱一致性:系统并不保证进程或者线程在任何时刻访问数据都会返回最新的更新过的值 。系统在数据成功写入之后,不承诺立即读到最新写入的值,也不承诺最终多久之后可以读到最新值 。
◎最终一致性:数据一旦更新成功,各个副本上的数据最终将达到完全一致的状态,但需要一定的时间 。
然而,分布式系统也存在一些复杂特性,比如分布式系统的三态性、异构性、透明性、并发性、可扩展性等 。我们在应用分布式系统的过程中要仔细斟酌这些特性的优势和副作用 。
03.分布式系统的设计原则◎异构性:由于分布式系统基于不同的网络、操作系统、计算机硬件和编程语言,因此必须考虑采用一种通用的网络通信协议来屏蔽异构系统之间的差异 。开发人员一般选择中间件来屏蔽这些差异 。


推荐阅读