go语言 分布式一致

flowchart TDStart([接收 key]) --> CheckCache{检查是否被缓存}CheckCache -->|是| ReturnCache1[返回缓存值 ⑴]CheckCache -->|否| CheckRemote{是否应当从远程节点获取}CheckRemote -->|是| HashSelect[使用一致性哈希选择节点]HashSelect --> IsRemote{是否是远程节点}IsRemote -->|是| HTTPClient[HTTP 客户端访问远程节点]HTTPClient --> Success{成功?}Success -->|是| ReturnCache2[返回缓存值 ⑵]Success -->|否| FallbackLocal[回退到本地节点处理]IsRemote -->|否| FallbackLocalCheckRemote -->|否| Callback[调用回调函数]Callback --> AddCache[添加到缓存]AddCache --> ReturnCache3[返回缓存值 ⑶]style Start fill:#f9f,stroke:#333,stroke-width:2px
style ReturnCache1,ReturnCache2,ReturnCache3 fill:#9f9,stroke:#333,stroke-width:2px

抽象 PeerPicker

type PeerPicker interface{PickPeer(key string) (peer PeerGetter, ok bool)
}type PeerGetter interface{Get(group string,key string) ([]byte,error)
}
  • 在这里,抽象出 2 个接口,PeerPicker 的 PickPeer() 方法用于根据传入的 key 选择相应节点 PeerGetter。

  • 接口 PeerGetter 的 Get() 方法用于从对应 group 查找缓存值。PeerGetter 就对应于上述流程中的 HTTP 客户端。

节点选择与HTTP客户端

// httpGetter 是一个结构体,包含 baseURL 字段,
// 用作所有 HTTP GET 请求的基础 URL。// Get 是 httpGetter 的一个方法,用于通过特定的 URL 来获取数据,
// URL 由 baseURL、group 和 key 参数组合生成。
func (h *httpGetter) Get(group string, key string) ([]byte, error) {// 构造完整的 URL,将 baseURL 与编码后的 group 和 key 参数拼接起来。// 发送 HTTP GET 请求到构造的 URL。if err != nil {// 如果请求出现错误,则返回错误信息。}// 确保函数退出时关闭响应体。// 检查服务器响应状态是否为 OK(200),如果不是则返回错误。if res.StatusCode != http.StatusOK {}// 读取整个响应体。if err != nil {// 如果读取响应体时出错,则返回错误信息。}// 返回读取到的字节和 nil 错误,表示成功。}// 这行代码确保 httpGetter 实现了 PeerGetter 接口。
// 如果 httpGetter 没有满足 PeerGetter 接口要求,将会引发编译错误。
  • baseURL 表示将要访问的远程节点的地址,例如 http://example.com/_geecache/
  • 使用 http.Get() 方式获取返回值,并转换为 []bytes 类型

第二步,为HTTPPool添加节点选择的功能

const (  defaultBasePath = "/_geecache/"  defaultReplicas = 50  
)  
// HTTPPool implements PeerPicker for a pool of HTTP peers.  
type HTTPPool struct {  // this peer's base URL, e.g. "https://example.net:8000"  self        string  basePath    string  mu          sync.Mutex // guards peers and httpGetters  peers       *consistenthash.Map  httpGetters map[string]*httpGetter // keyed by e.g. "http://10.0.0.2:8008"  
}
  • 新增成员变量 peers,类型是一致性哈希算法的 Map,用来根据具体的 key 选择节点。
  • 新增成员变量 httpGetters,映射远程节点与对应的 httpGetter。每一个远程节点对应一个 httpGetter,因为 httpGetter 与远程节点的地址 baseURL 有关

第三步,实现PeerPicker接口

func (p *HTTPPool) Set(peers ...string){p.mu.Lock()defer p.mu.Unlock()p.peers = consistenthash.New(defaultReplicas,nil)p.peers.Add(peers...)p.httpGetters = make(map[string]*httpGetter, len(peers))for _,peer := range peers{p.httpGetters[peer] = &httpGetter{baseURL: peer + p.basePath}}
}
  • Set() 方法实例化了一致性哈希算法,并且添加了传入的节点。
  • 并为每一个节点创建了一个 HTTP 客户端 httpGetter
  • PickerPeer() 包装了一致性哈希算法的 Get() 方法,根据具体的 key,选择节点,返回节点对应的 HTTP 客户端。

至此,HTTPPool 既具备了提供 HTTP 服务的能力,也具备了根据具体的 key,创建 HTTP 客户端从远程节点获取缓存值的能力。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/60288.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【STL栈和队列】:高效数据结构的应用秘籍

前言: C 标准模板库(STL)为我们提供了多种容器,其中 stack(栈)和 queue(队列)是非常常用的两种容器。 根据之前C语言实现的栈和队列,(如有遗忘,…

Zabbix 7 最新版本安装 Rocky Linux 8

前言 本实验主要在Rocky Linux 中安装Zabbix,其他centos8、Debian、Ubuntu、Alma Linux都可以安装,就是在中间件有点不同。Nginx就要配置一下,官网给的教程也算是很规范的,就是在MySQL上要自己安装,他没有告诉我们&am…

git新手使用教程

git新手使用教程 一、安装和初始化配置2、新建仓库3.工作区域和文件状态4.添加和提交文件5 git reset回退版本6 使用git diff查看差异7 使用git rm删除文件8 .gitignore忽略文件9 注册GitHub账号10 SSH配置和克隆仓库11 关联本地仓库和远程仓库12 Gitee的使用 由B站视频教程整理…

【GPTs】Email Responder Pro:高效生成专业回复邮件

博客主页: [小ᶻZ࿆] 本文专栏: AIGC | GPTs应用实例 文章目录 💯GPTs指令💯前言💯Email Responder Pro主要功能适用场景优点缺点 💯小结 💯GPTs指令 中文翻译: Email Craft 是一款专门用于…

2024下半年软考系统架构师案例分析题试题与答案--ROS机器人操作系统

一、知识点回顾 ROS(Robot Operating System)是一个用于编写机器人软件的框架。它提供了一系列的工具和库,帮助开发者创建复杂的、可以在多种操作系统上运行的机器人应用程序。 ROS的主要特点包括: 分布式计算能力:ROS提供了一种方式让多个计算机或设备协同工作,通过…

探索Copier:Python项目模板的革命者

文章目录 **探索Copier:Python项目模板的革命者**1. 背景介绍:为何Copier成为新宠?2. Copier是什么?3. 如何安装Copier?4. 简单库函数使用方法4.1 创建模板4.2 从Git URL创建项目4.3 使用快捷方式4.4 动态替换文本4.5 …

密码学知识点整理二:常见的加密算法

常用的加密算法包括对称加密算法、非对称加密算法和散列算法。 对称加密算法 AES:高级加密标准,是目前使用最广泛的对称加密算法之一,支持多种密钥长度(128位、192位、256位),安全性高,加密效率…

大模型就业收入高吗?大模型入门到精通,收藏这篇就够了

目前,已经可以说人工智能(AI)是推动社会进步和产业升级的重要力量。 其中,AI大模型作为人工智能领域的核心技术之一,正引领着新一轮的技术革命。 2024年,AI大模型开发工程师无疑成为了IT行业中最炙手可热…

Kubebot:一款Google云平台下的Slackbot安全测试工具

Kubebot 今天给大家介绍的是一款名叫Kubebot的安全测试Slackbot,该工具基于Google 云平台搭建,并且提供了Kubernetes后端。 项目架构 数据流 1.API请求由Slackbot发起,发送至API服务器,API服务器以Kubernetes(K8s)集群中的Docke…

openai Realtime API (实时语音)

https://openai.com/index/introducing-the-realtime-api/ 官方demo https://github.com/openai/openai-realtime-console 官方demo使用到的插件 https://github.com/openai/openai-realtime-api-beta?tabreadme-ov-file 装包配置 修改yarn.lock 这个包是从github下载的 &q…

【IC】DTCO

DTCO本质上是DSE。。。 文章A Novel Framework for DTCO: Fast and Automatic Routability Assessment with Machine Learning for Sub-3nm Technology Options中提到: std cell尺寸缩小不一定会在block模块级获得面积收益。。。得综合考虑,综合了设计…

SpringBoot配置Rabbit中的MessageConverter对象

SpringAMQP默认使用SimpleMessageConverter组件对消息内容进行转换 SimpleMessageConverter: only supports String, byte[] and Serializable payloads仅仅支持String、Byte[]和Serializable对象Jackson2JsonMessageConverter:was expecting (JSON Str…

Python毕业设计选题:基于django+vue的医院挂号系统设计与实现

开发语言:Python框架:djangoPython版本:python3.7.7数据库:mysql 5.7数据库工具:Navicat11开发软件:PyCharm 系统展示 病人管理 科室类型管理 医生管理 公告咨询管理 挂号预约管理 科室信息管理 摘要 医…

arm 汇编技巧

汇编标号:f表示forward, b表示backward: Here is an example: 1: branch 1f 2: branch 1b 1: branch 2f 2: branch 1b Which is the equivalent of: label_1: branch label_3 label_2: branch label_1 label_3: branch label_4 label_4: bra…

Java异步编程CompletableFuture(串行,并行,批量执行)

🍓 简介:java系列技术分享(👉持续更新中…🔥) 🍓 初衷:一起学习、一起进步、坚持不懈 🍓 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正🙏 🍓 希望这篇文章对你有所帮助,欢…

Redis 缓存击穿

目录 缓存击穿 什么是缓存击穿? 有哪些解决办法? 缓存穿透和缓存击穿有什么区别? 缓存雪崩 什么是缓存雪崩? 有哪些解决办法? 缓存预热如何实现? 缓存雪崩和缓存击穿有什么区别? 如何保…

电脑不显示wifi列表怎么办?电脑不显示WiF列表的解决办法

有用户会遇到电脑总是不显示wifi列表的问题,但是不知道要怎么解决。随着无线网络的普及和使用,电脑无法显示WiFi列表的问题有时会让人感到困扰。电脑不显示WiFi列表是很常见的问题,但这并不意味着你无法连接到网络。不用担心,这个…

知识图谱,语义分析,全文检索,neo4j,elaticsearch,知识库平台(java,vue)

一、项目介绍 一款全源码,可二开,可基于云部署、私有部署的企业级知识库云平台,一款让企业知识变为实打实的数字财富的系统,应用在需要进行文档整理、分类、归集、检索、分析的场景。 为什么建立知识库平台? 助力企业…

Java项目实战II基于Spring Boot的问卷调查系统的设计与实现(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发,CSDN平台Java领域新星创作者,专注于大学生项目实战开发、讲解和毕业答疑辅导 一、前言 在当今信息爆炸的时代,问卷调查…

博客摘录「 java三年工作经验面试题整理《精华》」2023年6月12日

JDK 和 JRE 有什么区别?JDK:java 开发工具包,提供了 java 的开发环境和运行环境。JRE:java 运行环境,为 java 的运行提供了所需环境。JDK 其实包含了 JRE,同时还包含了编译 java 源码的编译器 javac&#x…