相对于传统的本地 Java API 调用,跨进程的分布式服务调用面临的故障风险更高:

  1. 网络类故障:链路闪断、读写超时等。
  2. 序列化和反序列化失败。
  3. 畸形码流。
  4. 服务端流控和拥塞保护导致的服务调用失败。
  5. 其它异常。

对于应用而言,分布式服务框架需要具备足够的健壮性,在平台底层能够拦截并向上屏蔽故障,业务只需要配置容错策略,即可实现高可靠性。

阅读全文 »

0 前言

关于 ZooKeeper实现分布式锁,笔者在武汉小米一面(结果挂了)被问到过,因此记录如下。

以下的理论知识源自《 从Paxos到Zookeeper分布式一致性原理与实践 》第六章,代码 完全根据书本理论进行实现,并且经多线程测试,在正常情况可行。

源码:https://github.com/LiWenGu/MySourceCode/tree/master/example/src/main/java/com/lwg/zk_project

阅读全文 »

随着业务分布式架构的发展,系统间的系统调用日趋复杂,以电商的商品购买为例,前台界面的购买操作设计到底层上百次服务调用,涉及到的中间件包括:

  1. 分布式服务框架
  2. 消息队列
  3. 分布式缓存
  4. 分布式数据访问中间件
  5. 分布式文件存储系统
  6. 分布式日志采集
  7. 其它……

如果无法有效清理后端的分布式调用和依赖关系,故障定界将会非常困难。利用分布式消息跟踪系统可以有效解决服务化之后系统面临的运维挑战,提高运维效率。

阅读全文 »

随着业务发展,服务越来越多,如何协调线上运行的各个服务,保障服务的 SLA,以及小服务资源浪费的问题,需要能够基于服务调用的性能 KPI数据进行容量管理,合理分配各个服务的资源占用。
线上业务发生故障,需要对故障业务做服务降级、流量控制,快速恢复业务。
为了满足服务线下管控、保障线上高效运行,需要有一个统一的服务治理框架对服务进行统一、有效管控,保障服务的高效、健康运行。

阅读全文 »

当系统当前资源非常有限时,为了保证高优先级的服务能够正常运行,保障服务 SLA,需要降低一些非核心服务的调度频次,释放不防资源占用,保障系统的整体运行平稳。

1 设置服务优先级

服务优先级调度有多种策略:

  1. 基于线程调度器的优先级调度策略。
  2. 基于优先级队列的优先级调度策略。
  3. 基于加权配置的优先级调度策略。
  4. 基于服务迁入迁出的优先级调度策略。
阅读全文 »

  1. 业务高峰期,为了保证核心服务的 SLA,往往需要停掉一些不太重要的业务,例如商品评论、论坛或者粉丝积分等。
  2. 某些服务因为某种原因不可用,但是流程不能直接失败,需要本地 Mock 服务端实现,做流程放通。例如图书阅读,如果用户登录余额鉴权服务不能正常工作,需要做业务放通,记录消费话单,允许用户继续阅读,而不是返回失败。
阅读全文 »

当资源成为瓶颈时,服务框架需要对消费者做限流,启动流控保护机制。

1 静态流控

主要针对客户端访问速率进行控制,它通常根据服务质量等级协定(SLA)中约定的 QPS做全局流量控制,例如订单服务的静态流控阈值为 100QPS,则无论集群有多少个订单服务实例,它们总的处理速率之和不能超过 100QPS。

1.1 传统静态流控设计方案

阅读全文 »

服务上线之后,由于功能变更、BUG修复,以及服务升级,需要对服务采用多版本管理。

1 服务多版本管理设计

管理的对象包括服务提供者和消费者:

  1. 服务提供者:发布服务的时候,支持指定服务的版本号。
  2. 服务消费者:消费服务的时候,支持指定引用的服务版本号或者版本范围。

1.1 服务版本号管理

服务的版本号是有序的,在服务名相同的情况下,两个相同服务名的不同服务版本的版本号可以比较大小。完整的版本号由“主版本号(Major)+副版本号(Minor)+微版本号(Micro)”构成:

阅读全文 »

服务消费者和提供者之间进行通信时,除了接口定义的请求参数,往往还需要携带一些额外参数,例如消费提供者的 IP地址、消息调用链的跟踪 ID等;这些参数不能通过业务接口来进行传递,需要底层的分布式服务框架支持这种参数传递方式。

1 内部参数

1.1 业务内部参数传递

  1. 硬编码,在业务逻辑中进行 API调用,参数通过 API接口进行引用传参。
  2. 业务编排引擎对业务流程进行编排,参数往往通过抽象的编排上下文进行传递。
  3. 通过专业的 BPM流程引擎进行业务逻辑编排,参数通过流程上下文进行传递。
阅读全文 »

灰度发布是指在黑与白之间,能够平滑过渡的一种发布方式。AB test 就是一种灰度发布方式:让一部分用户继续用 A,一部分用户开始用 B;如果用户对 B没有什么反对意见,那么逐步扩大范围,把所有用户都迁移到 B上面来。灰度发布可以保证整体系统的稳定,在初始灰度的时候就可以发现、调整问题,以保证其影响度。

阅读全文 »