当前位置: 首页 > news >正文

Zookeeper服务注册及心跳机制详解

ZooKeeper提供了一种类似于文件目录的结构来保存key值,其提供了四种key类型,分别是持久节点,临时节点,持久有序节点,临时有序节点。其中临时节点的特性是当创建此节点的会话断开时,节点也会被删除。这一特性非常适合服务注册,可以通过维护一个长期的会话保证临时节点存活,当服务下线时,会话也会关闭,此时节点也会被删除。

了解更多Zookeeper的相关知识可以看下面这篇文章,可以让你快速掌握Zookeeper常用知识。

Zookeeper使用快速入门:基础命令,wacth监控,权限控制icon-default.png?t=N7T8https://blog.csdn.net/dxh9231028/article/details/141105185?spm=1001.2014.3001.5501

服务注册

不同于Nacos,Zookeeper没有提供完全封装好的服务注册方法,而是提供了一种方便于服务注册的数据存储方式,相比Nacos,其自由度更高,更自由,但是用起来也更加繁琐。在使用时我们可以选择第三方驱动,不选择Zookeeper官方驱动,或对官方驱动进行封装都可以。

Zookeeper实现服务注册可以通过在Java代码中创建一个目录/path,然后再其目录下创建当前服务的所有ip和端口(如果是集群的话)对应的节点,/path/obj1,/path/obj2,/path/obj3,然后给这些节点赋值服务的ip和端口。当其他服务想要调用这个服务时,则可以通过轮询或随机算法在Zookeeper中获取/path下的子节点,获取服务的ip和端口。

当服务以外下线时,由于其创建的是临时节点,其对应的节点也会被删除,这样其他服务在访问此服务时便不会访问到已经下线的服务,这样可以保证不会因为服务意外下线而导致其他服务访问此服务时,偶尔会找不到ip端口的问题。

假设一个系统值有一个用户服务集群和一个订单服务集群,他们使用zookeeper注册服务并相互调用,那么他们的结构如下图

心跳机制

临时节点的存活需要会话一直存在,那么如何让会话一直存活呢?

在了解这个问题之前,我们需要了解什么是会话。会话是ZooKeeper在应用程序内部维护的逻辑关系,用来管理与客户端的交互。会话并不是网络层面的东西,虽然它依赖于TCP连接进行通信,但即使TCP连接暂时断开,只要会话未到期或未被删除,它仍然可以在重新连接后继续存在。

那么Zookeeper是如何处理会话的删除操作的呢?

当客户端连接ZooKeeper时,需要指定一个会话超时时间。如果未指定,则会使用ZooKeeper的默认超时时间。客户端需要在此超时时间内与ZooKeeper进行交互,否则ZooKeeper将认为客户端已经失效,并关闭会话,同时主动关闭TCP连接。因此,为了让会话持续存在,客户端必须定期向ZooKeeper发送信号。

这一需求的实现就是心跳机制。通过心跳机制,客户端可以在大部分时间处于休眠状态,仅在需要发送信号,维持会话存活时被唤醒以发送心跳信号,从而有效地节省系统资源。这种周期性的心跳机制确保了会话在长时间内保持活跃状态,使临时节点得以继续存在。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【操作系统】什么是进程?什么是线程?两者有什么区别(面试常考!!!)
  • 设计模式---构建者模式(Builder Pattern)
  • 详解线索分层的目的、维度与创新实践
  • 【Java】了解线程 Thread 类的使用,如何创建、终止、等待一个线程,一文读懂不迷路
  • 【论文学习与撰写】快捷搜索指令filetype:pdf,搜索引擎关键词搜索pdf格式文件或者word格式文件。文献搜索方法大全。
  • 26 slave写入数据解决与GTIDS主从复制搭建
  • 白骑士的C#教学实战项目篇 4.4 游戏开发
  • 《向量数据库指南》——解决方案:采用安全、高性能的Milvus Cloud向量数据库,赋能Dopple AI的创新与发展
  • 速盾:博客主机租用怎么提高访问速度呢?
  • “LOCAL_LISTENER”参数导致业务无法连接数据库,文末附Oracle连接故障检查监听的排查流程
  • 如何高效的利用低代码技术进行数据建模
  • Temu全托管和半托管的区别:一文说清temu全托和半托的差异
  • 项目启动报错:liquibase.lockservice:? - Waiting for changelog lock....
  • 智能监控,无忧仓储:EasyCVR视频汇聚+AI智能分享技术为药品仓库安全保驾护航
  • PyQt5创建多个子窗口并监控其状态
  • 2019年如何成为全栈工程师?
  • Android路由框架AnnoRouter:使用Java接口来定义路由跳转
  • input的行数自动增减
  • JS数组方法汇总
  • React 快速上手 - 07 前端路由 react-router
  • Spark学习笔记之相关记录
  • 纯 javascript 半自动式下滑一定高度,导航栏固定
  • 缓存与缓冲
  • 计算机在识别图像时“看到”了什么?
  • 蓝海存储开关机注意事项总结
  • 在GitHub多个账号上使用不同的SSH的配置方法
  • Unity3D - 异步加载游戏场景与异步加载游戏资源进度条 ...
  • 我们雇佣了一只大猴子...
  • #include<初见C语言之指针(5)>
  • #单片机(TB6600驱动42步进电机)
  • $LayoutParams cannot be cast to android.widget.RelativeLayout$LayoutParams
  • (1)安装hadoop之虚拟机准备(配置IP与主机名)
  • (13)[Xamarin.Android] 不同分辨率下的图片使用概论
  • (145)光线追踪距离场柔和阴影
  • (2021|NIPS,扩散,无条件分数估计,条件分数估计)无分类器引导扩散
  • (附源码)ssm失物招领系统 毕业设计 182317
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理 第13章 项目资源管理(七)
  • (三)终结任务
  • (四) Graphivz 颜色选择
  • ***linux下安装xampp,XAMPP目录结构(阿里云安装xampp)
  • .NET 将混合了多个不同平台(Windows Mac Linux)的文件 目录的路径格式化成同一个平台下的路径
  • .net 受管制代码
  • .netcore 如何获取系统中所有session_如何把百度推广中获取的线索(基木鱼,电话,百度商桥等)同步到企业微信或者企业CRM等企业营销系统中...
  • .NET程序集编辑器/调试器 dnSpy 使用介绍
  • .NET连接MongoDB数据库实例教程
  • .net企业级架构实战之7——Spring.net整合Asp.net mvc
  • .net通过类组装数据转换为json并且传递给对方接口
  • .net网站发布-允许更新此预编译站点
  • .NET项目中存在多个web.config文件时的加载顺序
  • @vue-office/excel 解决移动端预览excel文件触发软键盘
  • [ vulhub漏洞复现篇 ] AppWeb认证绕过漏洞(CVE-2018-8715)
  • [.net] 如何在mail的加入正文显示图片
  • [AI 大模型] 百度 文心一言
  • [BJDCTF2020]The mystery of ip
  • [C/C++入门][ifelse]20、闰年判断