首页 > 其他分享 >《RPC实战与核心原理》学习笔记Day7

《RPC实战与核心原理》学习笔记Day7

时间:2023-01-24 09:33:05浏览次数:38  
标签:服务 Day7 ZooKeeper 笔记 RPC 集群 消息 注册 节点

08 | 服务发现:到底是要CP还是AP?

我们为什么需要“服务发现”?

从高可用的角度出发,在生产环境中,服务提供方通常会以集群的方式对外提供服务,集群中的IP地址随时可能发生变化,因此我们需要一本“通讯录”来及时获取对应的服务节点信息,维护“通讯录”以及或者节点信息的过程,我们称之为“服务发现”。

服务发现包括2个核心模块:

  • 服务注册:在服务提供方启动的时候,将对外暴露的接口注册到注册中心中,注册中心将这个服务节点的IP和接口保存下来。
  • 服务订阅:在服务调用方启动的时候,去注册中心查找并订阅服务提供方的IP,然后缓存到本地,并用于后续远程调用。

我们为什么不采用基于DNS的服务发现机制?

我们来看一下DNS查询流程。

它存在的两个主要问题:

  1. 如果服务节点的IP端口下线了,服务调用者能否及时摘除服务节点?
  2. 如果之前已经上线了一部分服务节点,这时突然对这个服务进行扩容,那么新上线的服务节点能否及时接收到流程呢?

为什么VIP方案也不能用于服务发现?

VIP方案如下所示。

它主要有以下几个问题:

  1. 搭建负载均衡设备或者TCP/IP四层代理,需要额外成本。
  2. 请求流程都经过负载均衡设备,多经过一次网络传输,会额外浪费性能。
  3. 负载均衡添加节点和摘除节点,一般都需要手动添加,当大批量扩容和下线时,会有大量的人工操作和生效延迟。
  4. 不能支持更灵活的负载均衡策略。

基于ZooKeeper的服务发现机制的工作流程是怎样的?

基于ZooKeeper的服务发现结构图如下。

它的工作流程如下:

  1. 服务平台管理端现在ZooKeeper中创建一个服务根路径,在这个路径下面再创建服务提供方目录和服务调用方目录。
  2. 当服务提供方发起注册时,会在服务提供方目录中创建一个临时节点,节点中存储该服务提供方的注册信息。
  3. 当服务调用方发起注册时,会在服务提供方目录中创建一个临时节点,节点中存储该服务提供方的注册信息。
  4. 当服务提供方目录下有节点数据发生变更时,ZooKeeper就会通知给发起订阅的服务调用方。

基于ZooKeeper的服务发现有什么问题?

当有超大批量的服务节点在同时发起注册操作,ZooKeeper集群的CPU使用率会飙升,导致ZooKeeper集群无法工作。

这本身就是ZooKeeper的性能问题,当连接到ZooKeeper的节点数量特别多,对ZooKeeper的读写操作会特别频繁,而且当ZooKeeper存储的目录达到一定数量时,ZooKeeper就会变得不稳定,CPU使用率持续升高,直到宕机。

ZooKeeper的一大特点就是强一致性,集群中的每个节点的数据每次发生变更操作时,都会通知其他节点同时执行跟新,这样它就要求每个节点的数据能够实时的完全一致,从而导致了ZooKeeper集群性能的下降。

基于消息总线的服务发现机制的工作流程是怎样的?

基于消息总线的服务发现流程图如下:

它的工作流程如下:

  1. 当有服务上线,注册中心节点收到注册请求,服务列表数据发生变化,会生成一个消息,推送给消息总线,每个消息都有一个整体递增版本。
  2. 消息总线会主动推送消息到各个注册中心,同时注册中心也会定期拉取消息。对于获取到消息的在消息回放模块里面回放只接受大于本地版本号的消息,小于本地版本号的消息直接丢弃,从而实现最终一致性。
  3. 消费者定于可以从注册中心内存拿到指定接口的全部服务实例,并缓存到消费者的内存中。
  4. 采取推拉模式,消费者可以及时地拿到服务实例增量变化情况,并和内存中的混存数据进行合并。

通过消息总线的方式,我们就可以完成注册中心集群间数据变更的通知,保证数据的最终一致性,并能及时地触发注册中心的服务下发操作。

服务发现的特性是允许我们在设计超大规模集群服务发现系统的时候,舍弃一致性,更多的考虑系统的健壮性,因此,在实际工作中,最终一致性是更为常用的策略。

标签:服务,Day7,ZooKeeper,笔记,RPC,集群,消息,注册,节点
From: https://www.cnblogs.com/wing011203/p/17065822.html

相关文章

  • [ 7--MQ学习 | 青训营笔记]
    这是我参与「第五届青训营」伴学笔记创作活动的第7天概述消息队列(MessageQueue,简称MQ),指保存消息的一个容器,本质是个队列。消息(Message)是指在应用之间传送的数据,消息......
  • JavaScript学习笔记—高阶函数
    如果一个函数的参数或返回值是函数,则这个函数就成为高阶函数将函数作为参数,意味着可以对另一个函数动态的传递代码classPerson{constructor(name,age){thi......
  • 《RPC实战与核心原理》学习笔记Day6
    07|架构设计:设计一个灵活的RPC框架RPC就是把拦截到的方法参数,转成可以在网络中传输的二进制,并保证在服务提供方能正确地还原出语义,最终实现像调用本地一样地调用远程的......
  • ABB 800XA学习笔记46:工程组态界面5
    这篇血洗闭集我在新浪博客发表过,地址是ABB800XA学习笔记46:工程组态界面5_来自金沙江的小鱼_新浪博客(sina.com.cn)再则、在这里我也记录一遍,以免丢失继续学习4.4.4库......
  • ABB 800XA学习笔记44:工程组态界面3
    这一片学习笔记我在新浪博客记录过,地址是ABB800XA学习笔记44:工程组态界面3_来自金沙江的小鱼_新浪博客(sina.com.cn)在这里也记录一遍,以免丢失继续学习。4.3 工程工作......
  • ABB 800XA学习笔记45:工程组态界面4
    这一篇博客我在新浪博客记录过,地址是ABB800XA学习笔记45:工程组态界面4_来自金沙江的小鱼_新浪博客(sina.com.cn)在这里也记录一遍,以免丢失接着学习。4.4 用于应用工程......
  • [概率论与数理统计]笔记:4.2 统计量
    4.2统计量统计量的定义样本的任一不含总体分布未知参数的函数为该样本的统计量。常用的统计量样本均值即样本的算术平均值:\[\overline{X}=\frac{1}{n}(X_1,X_2,\cd......
  • ABB 800XA学习笔记42:工程组态界面1
    这一片学习笔记我在新浪博客发表过,地址是ABB800XA学习笔记42:工程组态界面1_来自金沙江的小鱼_新浪博客(sina.com.cn)在这里也记录一遍,以免丢失开始第四章学习。又是英文......
  • ABB 800XA学习笔记43:工程组态界面2
    这一片学习笔记我在新浪博客记录过,地址是ABB800XA学习笔记43:工程组态界面2_来自金沙江的小鱼_新浪博客(sina.com.cn)在这里也记录一遍,以免丢失继续学习。新浪博客访问量......
  • ABB 800XA学习笔记40:S800 IO产品指南那5
    这一篇学习笔记我在新浪博客记录过,地址是ABB800XAxuexibiji40:S800IO产品指南5_来自金沙江的小鱼_新浪博客(sina.com.cn)我在这里也记录一次,以免丢失AC800F/M带有冗余I/......