Kubernetes从1.8版本起就声称单集群最多可支持5000个节点和15万个Pod,这个规模对于腰部以下团队来讲已经足够应对业务膨胀。但是总会出于混合云、可扩展性、降低网络延迟或者跨可用区故障隔离等各种各样因素考量去部署多集群。Kubernetes Cluster Federation 又名 KubeFed 或 Federation v2,Federation将使管理多个集群变得简单,打破各个集群边界,使之不再是一个个孤岛。
我们在探讨微服务时,通常避不开服务的颗粒度和服务之间的松耦合。也就是说服务应该是能够自治的,能够掌控服务所有的依赖,并且尽量降低同步通信的频率。今天我们来探讨一下实现分布式服务松耦合的事件驱动架构模式,以及异构语言系统如何实现事件驱动架构设计。
问题描述
在生产环境,我们最近部署了Istio Service Mesh,Istio控制平面会在每个服务Pod里自动注入一个sidecar。当各个服务都初始化istio-proxy,通过sidecar去实现服务间的调用时,应用和服务就会面临一个很普遍的问题:upstream 服务调用收到HTTP 503/504 response,这个报错信息通常都是由istio-proxy产生的。HTTP 503通常发生在应用和istio-proxy的inbound或者outbound调用,或者是服务网格外部的服务调用。影响面相对严重的是通过网格访问外部服务的outbound流量,相对小的是网格内部的inbound流量。HTTP 504的问题相对要少一些,只有在upstream service的接口response时间超过15秒时才会发生,因为istio-proxy的默认response超时时间就是15秒。
领域驱动设计(Domain Driven Design,简称DDD)是一种软件设计方法论,它的目标是通过深入理解业务领域,将该领域的知识转化为软件模型和实现,以实现高效、可维护、可扩展和易于理解的软件系统。
领域驱动设计的核心理念是将业务领域的知识与软件开发过程紧密结合。在DDD中,业务领域被视为软件系统中最重要的部分,因为它提供了系统的核心价值。因此,DDD将业务领域作为软件设计的中心,将其抽象为一个领域模型。领域模型是业务领域知识的表达,它描述了业务领域中的实体、值对象、聚合和业务规则等概念,并将它们组织成一个有机的整体。通过领域模型,DDD可以将业务知识转化为软件设计中的实体和类,使得开发人员可以更好地理解业务需求,更加高效地实现软件系统。
这篇文章的初衷,是记录拜读由Nathan Bronson, Aleksey Charapko, Abutalib Aghayev, and Timothy Zhu共同发表的论文Metastable Failures in Distributed Systems的收获,这篇论文描述了一个在大规模分布式系统中很常见的失败场景:亚稳定失败(metastable failures),它们为什么通常在高负载分布式系统中发生,以及解决问题的思路框架:如何识别和从亚稳定失败中恢复,甚至如何避免发生亚稳定失败。