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

27.8 把target做一致性哈希进行分发

本节重点介绍 :

  • 编写分发任务
    • 执行这个对应的获取target函数
    • 对target的地址 在哈希环中寻找节点
    • 然后根据node塞入map中
    • 然后写json文件

编写分发任务

  • 位置 service/shard_service.go
func (this *ShardService) Dispatch() {// 执行这个对应的获取target函数targets := this.TargetGetFunc()if len(targets) == 0 {level.Warn(this.logger).Log("msg", "Dispatch.empty.targets")return}// 先初始化一个map ,key是 节点,value是分配给这个节点的targets nodeMap := make(map[string][]target.ScrapeTarget)// 遍历target,for _, t := range targets {t := tif len(t.Targets) != 1 {continue}// 对target的地址 在哈希环中寻找节点// 要求每个target的地址都是1个// 然后根据node塞入map中node := this.GetNode(t.Targets[0])preTs, loaded := nodeMap[node]if !loaded {preTs = make([]target.ScrapeTarget, 0)}preTs = append(preTs, t)nodeMap[node] = preTs}index := 1allNum := len(nodeMap)for node, ts := range nodeMap {// 拼接一个json文件的名字// 服务名_节点ip_索引_分片总数_target总数.jsonjsonFileName := fmt.Sprintf("%s_%s_%d_%d_%d.json",this.SrvName,node,index,allNum,len(ts),)// 写json文件writeJsonFile(jsonFileName, ts)extraVars := make(map[string]interface{})extraVars["src_sd_file_name"] = jsonFileNameextraVars["dest_sd_file_name"] = this.DestSdFileNameextraVars["service_port"] = this.Portlevel.Info(this.logger).Log("msg", "goansiblerun.run","this.SrvName", this.SrvName,"jsonFileName", jsonFileName,"node", node,"index", index,"all", allNum,"targetNum", len(ts),)go goansiblerun.AnsiRunPlay(this.logger, this.SrvName, node, extraVars, this.YamlPath)index++}}

流程说明

  • 先初始化一个map ,key是 节点,value是分配给这个节点的targetsnodeMap := make(map[string][]target.ScrapeTarget)
  • 执行这个对应的获取target函数targets := this.TargetGetFunc()
  • 遍历target,
    • 对target的地址 在哈希环中寻找节点
    • 要求每个target的地址都是1个
    • 然后根据node塞入map中
  • 代码如下
	// 遍历target,for _, t := range targets {t := tif len(t.Targets) != 1 {continue}node := this.GetNode(t.Targets[0])preTs, loaded := nodeMap[node]if !loaded {preTs = make([]target.ScrapeTarget, 0)}preTs = append(preTs, t)nodeMap[node] = preTs}
  • 然后遍历结果map,拼接json文件名,写json文件即可
  • getNode
  • func (this *ShardService) GetNode(key string) string {return this.ring.Get(key)}
    

外层ticker周期性的调用这个分发服务

  • 每隔1分钟调用1次
  • 这样能保证变更的target 最晚1分钟可以在监控中体现
func (this *ShardService) RunDispatch() error {level.Info(this.logger).Log("msg", "RunDispatch.start", "name", this.SrvName)ticker := time.NewTicker(1 * time.Minute)this.Dispatch()defer ticker.Stop()for {select {case <-this.ctx.Done():level.Info(this.logger).Log("msg", "receive_quit_signal_and_quit")return nilcase <-ticker.C://level.Info(logger).Log("msg", "doIndexSync_run")this.Dispatch()}}
}

main中在遍历创建shardService对象时,启动这份分发的周期任务

for _, i := range sConfig.ShardService {....go shardService.RunDispatch()
}

本节重点总结 :

  • 两个均分任务的截图

  • image.png

  • 仅有1个存活节点的截图

  • image.png

  • 编写分发任务

    • 执行这个对应的获取target函数
    • 对target的地址 在哈希环中寻找节点
    • 然后根据node塞入map中
    • 然后写json文件

http://www.mrgr.cn/news/58277.html

相关文章:

  • 2024源鲁杯CTF网络安全技能大赛题解-Round1
  • 桥接模式,外界与主机通,与虚拟机不通
  • 成都睿明智科技有限公司解锁抖音电商新蓝海
  • 苍穹外卖05
  • 复数和四元数
  • Flutter Column组件实战案例
  • 双十一电容笔选哪个好?!西圣、益博思、吉玛仕电容笔实测对比!
  • 区块链行业低迷的原因及未来发展展望
  • 【贪心算法】(第十四篇)
  • 落实安全左移迫在眉睫 | 伊朗APT34组织针对阿联酋及海湾关键基础设施发动攻击
  • uniapp:sqlite最详细教程,小白可直接粘贴复制
  • Linux 学习笔记(十七)—— 文件系统
  • MultipartFile文件与传递body并存问题
  • RK3568 android11 usb接口TP与电磁笔触点上报优先级问题
  • 【运维心得】U盘启动安装Dell服务器踩坑指南
  • 【JavaScript】JavaScript 进阶-2-构造函数数据常用函数(更新中)
  • Python:背景知识及环境安装
  • Linux内核常见的网络丢包场景分析,零基础入门到精通,收藏这一篇就够了
  • 强推!清华大佬强力打造,绝对是2024年人工智能入门天花板教程!
  • 智慧农业大数据平台:智汇田园,数驭未来
  • 220V降12V0.5A500mA恒压WT5105
  • 【话题】创智时代:人工智能重塑生活与工作
  • 空间转录组 | ​Stereo-seq在疾病中的应用研究
  • C++ 设计模式 - 每日持续更新中
  • httpd服务
  • 怎么区分主谓宾I love you与主系表I am fine? 去掉宾语看句子完整性 主系表结构则侧重于描述主语的状态、特征或性质