05 2022 档案
摘要:1. Hashicorp Raft实现分析 在raft算法中,典型的领导者选举在本质上是节点状态的变更。具体到raft源码中,领导者选举的入口函数就是run(),在raft.go中以一个单独的协程运行,来实现节点状态的变更 在下面的实现代码中,可以看到Follower、Candidate和Leade
阅读全文
摘要:1. 创建型模式 这些设计模式提供了一种在创建对象的同时隐藏创建逻辑的方式,而不是使用new运算符直接实例化这些对象 这使得程序在判断针对某个给定实例需要创建哪些对象时更加灵活 1.1 工厂模式 在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,而是通过使用一个共同的接口来指向新创建的对象 代
阅读全文
摘要:1. Prometheus简介 Prometheus是一个开源的系统监控和报警系统,在2012年由SoundCloud创建,并于2015年正式发布 2016年,Prometheus项目正式加入CNCF基金会,成为继kubernetes之后第二个在CNCF托管的项目,现在已经广泛用于容器和微服务领域
阅读全文
摘要:1. RabbitMQ介绍 RabbitMQ是采用Erlang编程语言实现的高级消息队列协议AMQP(Advanced Message Queuing Protocol)的开源消息队列中间件 消息队列中间件的作用: 应用解耦 流量削峰 异步处理 缓存存储 消息通信 提高系统扩展性 1.1 Rabbi
阅读全文
摘要:1. runtime.Caller()方法介绍 runtime.Caller()函数的签名如下: func Caller(skip int) (pc uintptr, file string, line int, ok bool) 可以看到其有一个传入参数skip: skip=0:Caller()会
阅读全文
摘要:1. 一致性哈希算法 关于一致性哈希算法的详解,可以参见这篇博客文章 一致性哈希详解 简单来说,一致性哈希通过哈希环和增加虚拟节点来解决节点变更时的大范围数据迁移和冷热不均的问题 一致性哈希的一个开源实现为:stathat.com/c/consistent 1.1 数据迁移 我们首先从数据迁移的角度
阅读全文
摘要:1. 读取整个文件 读取整个文件是效率最高的一种方式,但其只适用于小文件,大文件一次读取会消耗大量内存 1.1 使用文件名直接读取 使用os.ReadFile()方法可以实现直接读取 func fileOne() { content, err := os.ReadFile("test.txt") i
阅读全文
摘要:golang中的原生包endcoding/json提供了序列化和反序列化json数据的功能 我们可以使用encoding/json中的Encoder.Encode()和Marshal()实现json序列化;使用Decoder.Decode()和Unmarshal()实现json反序列化 type M
阅读全文
摘要:转载: https://zhuanlan.zhihu.com/p/457375259 根据CAP原理,分布式系统在可用性、一致性和分区容错性上无法兼得,通常由于分区容错无法避免,所以一致性和可用性难以同时成立。对于缓存系统来说,如何保证其数据一致性是一个在应用缓存的同时不得不解决的问题。 需要明确的
阅读全文
摘要:1. 什么是服务器雪崩 雪崩是由于局部故障被正反馈循环,从而导致的不断放大的连锁故障,雪崩通常是由于整个系统中,一个很小的部分出现故障,进而导致整个系统不可用 雪崩出现的根本原因就是系统过载,如果在系统过载的情况下,不进行任何控制,那么会导致系统雪崩 想要避免雪崩有几种常见的方式,第一种就是快速减少
阅读全文
摘要:1. 什么是gRPC拦截器 我们以etcd一个写请求的流程来看gRPC拦截器做了什么工作 当etcd处理一个写请求,比如 put hello world 时,首先etcd client会使用负载均衡算法选择一个etcd节点,发起gRPC调用; 然后etcd节点收到请求后经过gRPC拦截器、Quota
阅读全文
摘要:环境:macos 1. 安装etcd 克隆etcd源码 v3.5.0 是etcd版本,想要下载指定版本在此指定即可 $ mkdir $GOPATH/src/github.com/etcd-io $ cd $GOPATH/src/github.com/etcd-io $ git clone -b v3
阅读全文