我们知道,任何 IT 系统都是为实现业务功能而存在的,并且会随着业务的发展不断升级。比如淘宝网,创业初期也仅仅只是个很简单的单体 Web 应用,包括一个 MySQL 数据库和一个 Apache Tomcat 服务器。但是随着用户数量的上升,系统越来越不能满足业务的需要,出现性能瓶颈。这时候就需要调整系统架构以满足当前业务的需要了。
将单体应用拆分成多个服务,例如用户服务、订单服务、库存服务等等,每个服务独立部署,使用各自的数据库,必要时可以很方便地针对各个服务进行横向伸缩以应对用户量的暴涨。这就是分布式微服务系统。如图 1:

图 1 服务拆分和微服务架构
当然,服务拆分在解决了用户暴涨带来的性能瓶颈问题的同时,也引入了更多的复杂性和问题,例如数据一致性问题、调用链路过长、问题难跟踪、幂等性问题等等。这些问题并非一本书一篇文章能够讲清楚的,我们今天只聊其中最重要的一点——可靠性。
可靠性对分布式系统具有重大意义。我们简单举例,在图一中的订单服务通过异步消息通知商品服务完成商品库存的扣减,如果因为网络抖动导致消息丢失,商品库存扣减失败,最后导致商品库存数据不正确,那么这个问题就严重了。我们可以断言,一个不能保证数据正确性的系统是一个毫无价值的系统。
分布式系统可靠消息的难题
在一个分布式系统中,各个服务相互独立,一个完整的业务往往要跨越多个服务,也就是我们所谓的服务链调用。在这个过程中,避免不了异构系统之间服务的相互调用。
在服务化之前服务之间通常是本地调用,本地方法调用损耗小调用快。服务化以后,不同的服务往往部署在不同的远程服务器上,服务提供者和消费者之间通过远程网络通信,不仅损耗大而且调用的延时也大大增大,所以分布式环境下,服务之