在 QCon 伦敦大会上,将微服务术语归功于他的架构师 Sam Newman 回归基础,强调了在处理分布式系统时要做对的三件关键事:超时、重试和幂等性。通过演讲,他提供了使分布式系统更健壮的机制。
他以“戳中”这句名言“ insanity is doing the same thing over and over again and expecting different results.(重复做同一件事却期望不同结果是疯狂的)”开始演讲,指出在许多情况下,尤其是分布式系统中,做同样的事是可取的。他强调开发者不应深入分析 Paxos、Raft 和 SWIM 之间的差异,也不必争论 CAP 定理的细微差别,只需理解超时(“知道何时放弃”)、重试(“应尝试多少次”)和幂等性(使其“有点”安全)。
列举了分布式系统的三个“黄金规则”:
- 不能在两点间瞬间传输信息;
- 有时无法联系到想与之通信的对象;
- 资源是有限的。
在深入探讨使分布式系统更健壮的更多见解之前,他强调这三者共同支撑了分布式系统背后不同抽象所隐藏的所有复杂性。
超时:如果请求在规定时间内未完成,将被终止的阈值。系统在等待时会使用计算资源,等待时间过长会导致系统过载和用户体验下降,要正确设置超时需了解系统执行通常所需时间和用户对系统的期望,合理分配资源可使调用时间更紧凑,且系统应能在不重新编译或重新部署的情况下更改超时值。“超时是将系统健康置于单个请求成功之上”。
重试:选择合适的重试次数具有挑战性,过多重试类似自我造成的拒绝服务攻击。要使系统更具弹性,需在客户端和服务器端实施速率限制以共享超额负载,引入人工网络抖动(重试之间的随机延迟)可让系统有时间从故障中恢复,应避免指数退避,以免给系统带来更多压力。
幂等性:操作多次执行结果不变的属性。如果客户端未收到服务器响应,有两种可能,一是请求未发送,二是请求已处理但响应未到达。幂等性易于预先实现但难以后期改造,可通过使用请求 ID 或对请求进行指纹识别来实现,当请求体可能变化时,最好同时使用这两种机制。
Newman 最后总结,在分布式系统中,重复做同样的事是明智的,但要在使重试安全的范围内,并幽默地指出他的这句名言被错误地归因于阿尔伯特·爱因斯坦。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。