背景🧊:
大家好我是Kane,最近在做一个轮子类项目--用Java开发RPC框架。在开发注册中心模块的时候,为了保证注册中心的高可用,(迫不得已)去了解了Etcd的集群机制,翻着官方文档中与集群相关文章的同时突然又联想到了分布式系统中的『多个提供者』,脑中突然闪过些什么,于是便有了本文。
距今为止,我接触微服务大概半年了,中间件的集群机制和单个服务多个提供者的概念也有意无意接触过不少了,但平时的练手项目中真的很少有实践的场景,更多是停留在有这个概念的层次上,所以一直懵懵懂懂地以为『中间件的集群』和『单个服务但有多个提供者』是同一种架构模式,但实际上它们是两种不同的架构模式,在分布式系统中也扮演着不同的角色。从英文的角度也可以看出来🤣。
✨中间件的集群(Middleware Cluster) :
-
- 定义:中间件集群指的是中间件服务自身以集群的形式运行,提供高可用性和负载均衡。例如,Redis可能在多个服务器上运行,以支持更高的并发和数据的冗余存储。
- 目的:提高系统的可用性、可扩展性和容错性。通过在多个节点上运行中间件服务,可以避免单点故障,并允许系统在节点故障时继续运行。
- 特点:
-
-
- 通常涉及到中间件自身的复制和同步机制。
- 集群节点之间可能需要通信,以保持状态一致或进行负载均衡。
- 客户端可能需要使用特定的负载均衡策略来访问集群中的节点。
-
✨单个服务但有多个提供者(Multiple Providers for a Service) :
-
- 定义:这指的是对于某个特定的服务,有多个独立的实例或服务提供者存在,它们可能运行在不同的服务器或容器中。
- 目的:实现服务的冗余、扩展服务能力以及提供负载均衡。例如,一个订单服务可能有多个实例来处理不同的订单请求。
- 特点:
-
-
- 每个服务提供者都是独立的
- 客户端需要使用服务发现机制来找到可用的服务提供者。
- 可以通过API网关或负载均衡器来管理对服务提供者的访问。
-
🔎区别:
- 角色定位:中间件集群更多关注中间件自身的高可用性,而多个服务提供者关注的是如何提供服务的高可用性和冗余。
- 服务发现:在多个服务提供者的场景中,服务发现通常是必需的,以便客户端能够找到并访问服务实例。而大多数中间件本身就支持集群机制。
- 负载均衡:在两种场景中,负载均衡都很重要,但在中间件集群中,负载均衡可能是由中间件自身处理的,而在多个服务提供者的场景中,负载均衡可能需要外部组件如API网关或服务网格来实现。
- 故障转移:中间件集群通常有内置的故障转移机制,而多个服务提供者可能依赖于外部的容错机制。