分布式学习十二:zookeeper实现数据订阅/发布

本文涉及的产品
任务调度 XXL-JOB 版免费试用,400 元额度,开发版规格
注册配置 MSE Nacos/ZooKeeper,182元/月
云原生网关 MSE Higress,422元/月
简介: 分布式学习十二:zookeeper实现数据订阅/发布

数据订阅/发布

在分布式集群中,假设数据库发生了改动,就得修改所有分布式服务的数据库配置

我们可以通过zookeeper来实现数据库配置的订阅发布

我们先初始化数据库配置项环境

在zookeeper配置以下数据

\[zk: localhost:2181(CONNECTED) 51\] get /config-server/app1/database
{"Host":"127.0.0.1:3300","User":"root","Password":"233274","Database":"test"}

go代码环境准备

引入

github.com/go-zookeeper/zk

go.mod内容为:

module zkStudy
go 1.17
require (
   github.com/go-sql-driver/mysql v1.6.0
   github.com/go-zookeeper/zk v1.0.2
   github.com/jmoiron/sqlx v1.3.4
)

发布数据库配置

我们只需要set path,在zk中将自动把数据发布到订阅此目录的客户端中

以下代码,每2秒更改一次数据库数据

func loopChangeDbConfig()  {
   var dbConfig = config.DatabaseConfig{Host: "127.0.0.1:3300",User: "root",Password: "123456",Database: "test"}
   t := time.NewTicker(2 * time.Second)
   for {
      select {
      case <-t.C:
         dbConfig.Password=strconv.Itoa(rand.Intn(999999)+100000)
         jsonByte,_ := json.Marshal(dbConfig)
         _,err := zkConnect.Set(databaseZKPath,jsonByte,-1)
         if err!=nil {
            fmt.Println("zk set dbConfig path err :", err)
            return
         }
      }
   }
}

订阅数据库配置

通过zk.getW方法,获取数据并返回一个event单向通道,通过此通道可监听获取一条事件更改数据:

func getDatabaseConfig() <-chan zk.Event {
   //listen mysql-config path
   jsonStrByte, _, event, err := zkConnect.GetW(databaseZKPath)
   if err != nil {
      panic(err)
   }
   _ = json.Unmarshal(jsonStrByte, &databaseConfig)
   fmt.Printf("%+v 123\\n", databaseConfig)
   return event
}

获取到event之后,新开协程,进行阻塞获取通道,当获取到数据后,重新获取配置并继续获取一个通道监听数据

func listenDBConfigChange(event <-chan zk.Event) {
   var e zk.Event
   for {
      e = <-event
      //if node data change,db reconnect
      if e.Type == zk.EventNodeDataChanged {
         fmt.Printf("node data changed: %s, \\n",e.Path)
         event = getDatabaseConfig()
         err := db.Close()
         if err != nil {
            panic(err)
         }
         connectDb()
         dbTest()
      }
   }
}

运行结果:

image.png

目录
相关文章
|
1月前
|
存储 运维 安全
金融级 ZooKeeper 来袭:性能提升100%,SLA 99.99%,数据防护升级
阿里云微服务引擎 MSE ZooKeeper 企业版正式发布,提供比专业版更高的稳定性与安全能力,SLA 达 99.99%,整体服务性能提升 100%。针对关键业务,企业版通过独享资源池实现更高规格配额,满足大规模需求。此外新增数据备份容灾、容量管理反脆弱限流等功能,提升整体企业级特性,助力企业应对复杂业务挑战。
金融级 ZooKeeper 来袭:性能提升100%,SLA 99.99%,数据防护升级
|
6月前
|
SQL
【YashanDB知识库】手工迁移Doris数据到崖山分布式
【YashanDB知识库】手工迁移Doris数据到崖山分布式
|
6月前
|
存储 分布式计算 负载均衡
数据分布式存储:在海量数据面前,我们如何站稳脚跟?
数据分布式存储:在海量数据面前,我们如何站稳脚跟?
880 1
|
4月前
|
数据采集 存储 NoSQL
基于Scrapy-Redis的分布式景点数据爬取与热力图生成
基于Scrapy-Redis的分布式景点数据爬取与热力图生成
274 67
|
3月前
|
数据采集 机器学习/深度学习 数据可视化
让回归模型不再被异常值"带跑偏",MSE和Cauchy损失函数在噪声数据环境下的实战对比
本文探讨了MSE与Cauchy损失函数在线性回归中的表现,特别是在含噪声数据环境下的差异。研究发现,MSE虽具良好数学性质,但对异常值敏感;而Cauchy通过其对数惩罚机制降低异常值影响,展现出更强稳定性。实验结果表明,Cauchy损失函数在处理含噪声数据时参数估计更接近真实值,为实际应用提供了更鲁棒的选择。
127 1
让回归模型不再被异常值"带跑偏",MSE和Cauchy损失函数在噪声数据环境下的实战对比
|
6月前
|
存储 人工智能 固态存储
DeepSeek开源周第五弹之一!3FS:支撑V3/R1模型数据访问的高性能分布式文件系统
3FS是DeepSeek开源的高性能分布式文件系统,专为AI训练和推理任务设计,提供高达6.6 TiB/s的读取吞吐量,支持强一致性保障和通用文件接口,优化AI工作负载。
978 2
DeepSeek开源周第五弹之一!3FS:支撑V3/R1模型数据访问的高性能分布式文件系统
|
7月前
|
SQL 数据建模 BI
【YashanDB 知识库】用 yasldr 配置 Bulkload 模式作单线程迁移 300G 的业务数据到分布式数据库,迁移任务频繁出错
问题描述 详细版本:YashanDB Server Enterprise Edition Release 23.2.4.100 x86_64 6db1237 影响范围: 离线数据迁移场景,影响业务数据入库。 外场将部分 NewCIS 的报表业务放到分布式数据库,验证 SQL 性能水平。 操作系统环境配置: 125G 内存 32C CPU 2T 的 HDD 磁盘 问题出现的步骤/操作: 1、部署崖山分布式数据库 1mm 1cn 3dn 单线启动 yasldr 数据迁移任务,设置 32 线程的 bulk load 模式 2、观察 yasldr.log 是否出现如下错
|
8月前
|
消息中间件 算法 调度
分布式系统学习10:分布式事务
本文是小卷关于分布式系统架构学习系列的第13篇,重点探讨了分布式事务的相关知识。随着业务增长,单体架构拆分为微服务后,传统的本地事务无法满足需求,因此需要引入分布式事务来保证数据一致性。文中详细介绍了分布式事务的必要性、实现方案及其优缺点,包括刚性事务(如2PC、3PC)和柔性事务(如TCC、Saga、本地消息表、MQ事务、最大努力通知)。同时,还介绍了Seata框架作为开源的分布式事务解决方案,提供了多种事务模式,简化了分布式事务的实现。
332 5