fananchong2
这个作者很懒,什么都没留下…
展开
-
EmmyLuaDebugger介绍与源代码分析
/ 略if (!return 1;可以从以上代码中,学习到如何编写一个 Lua 自定义的模块。原创 2024-04-06 22:23:53 · 572 阅读 · 0 评论 -
Gossip - hashicorp/memberlist 介绍(一):基本定义
根据配置 BindAddrs 字段,同时在这些地址上监听 TCP UDP 端口。本系列介绍 hashicorp/memberlist 相关实现。是 Gossip 协议的一个 Golang 语言实现版本。集群,平时节点间,不会有 socket 连接。先从一些基本定义开始。原创 2023-07-30 21:29:14 · 540 阅读 · 0 评论 -
Nats 消息总线相关介绍(五):发送消息相关
函数内,通过 Sublist.match 获取 SublistResult;进而遍历 psubs 或随机 qsubs ,使用 client 发送。在 INFO 命令、 SUB 命令、 RS+ 命令,处理过程种,对应填充了不同连接对象。Nats 节点均有所有订阅信息,存在 Sublist 中。原创 2023-07-10 22:36:16 · 447 阅读 · 0 评论 -
Nats 消息总线相关介绍(四):Topic 相关
通过 INFO 命令,一个节点加入 Nats 集群后,订阅信息会集群内全量同步。原创 2023-07-10 22:34:57 · 474 阅读 · 0 评论 -
Nats 消息总线相关介绍(三):协议相关
Nats 为了高效解析字符串协议,因此用了字典树解析的方式,依次遍历字符,进到具体协议的分支里。Nats 使用的是字符串协议,有协议头、协议体、协议结尾符, 3 部分字符串组成。协议定义在 parser.go:54 - parser.go:132。协议解析在 client.parse(parser.go:134)协议与协议解析相关,均在 parser.go 文件里。原创 2023-07-10 22:33:24 · 386 阅读 · 0 评论 -
Nats 消息总线相关介绍(二): 拓扑相关
普通节点,连接初始路由节点,函数 Server.connectToRoute 内,会发送 INFO 消息给初始路由节点。INFO 消息处理,会把该 INFO 消息进一步广播给所有其他节点。Nats 启动时,启动参数 routes 指定了初始路由节点。每个节点,都会去连接所有 routes 指定的路由节点。如果有连接到这个监听端口,则会下发 INFO 协议。即最终,Nats 集群内,都是路由节点,网状互连。其他节点进而把它作为路由节点进行连接。用于路由节点的监听端口。原创 2023-07-10 22:31:27 · 198 阅读 · 0 评论 -
Nats 消息总线相关介绍
即,所有 Nats 节点,均知晓所有 Topic 的订阅信息。Topic 在 Nats 内部起路由转发规则作用。Topic 订阅信息,由路由节点维护。Nats 内部节点有不少类型。原创 2023-07-10 22:26:57 · 421 阅读 · 0 评论 -
Ectd Raft 模块介绍(二):目录文件介绍
Etcd Raft 模块代码位于 Etcd 源代码库的 raft 目录下.├── log.go├── quorum├── raftpb。原创 2022-09-12 21:49:48 · 403 阅读 · 0 评论 -
Ectd Raft 模块介绍(一)
是学习 Raft 的最佳教程,同时也是网络性能优化、磁盘读写性能优化非常好的参考材料。笔者在看 Etcd Raft 模块前,看过 hashicorp/raft 的实现。Etcd Raft 模块实现了 Raft 协议的全部功能。相比之下, Etcd Raft 模块的。均远高于 hashicorp/raft。原创 2022-08-21 21:09:26 · 325 阅读 · 0 评论 -
etcd-io/gofail 介绍与源代码分析(二)
目录介绍$ tree.├── code│ ├── binding.go│ ├── failpoint.go│ ├── rewrite.go│ └── rewrite_test.go├── code-of-conduct.md├── DCO├── examples│ ├── cmd│ │ └── cmd.go│ └── examples.go├── gofail.go├── LICENSE├── Makefile├── NOTICE├── R原创 2022-03-20 16:57:34 · 952 阅读 · 0 评论 -
etcd-io/gofail 介绍与源代码分析(一)
gofailFreeBSD failpoints 的 Golang 版本实现通过代码或者环境变量,其允许程序在特定的地方动态地注入错误或者其他行为Github 地址: https://github.com/etcd-io/gofailgofail 工作原理在具体的代码点加入// gofail:特殊格式的注释(插桩)使用 gofail 工具,把这些桩动态替换为其他代码从而编译出具备一定错误行为的可执行文件,来考察这些错误行为下,程序是否正确处理使用方法通过// gofail:注释块,动原创 2022-03-20 16:10:01 · 790 阅读 · 0 评论 -
hashicorp/raft 介绍与源代码分析(四):日志复制
前言日志相关内容,在介绍领导人选举时,为了便于理解领导人选举过程,穿插着,介绍了不少本章,主要汇总、查漏补缺下日志复制内容日志类型Raft 把一些控制命令、配置等,都使用日志的方式,使用同一个协议来与其他节点交互有以下日志类型:// LogType describes various types of log entries.type LogType uint8const ( // LogCommand is applied to a user FSM. LogCommand LogT原创 2022-02-20 23:14:55 · 361 阅读 · 0 评论 -
hashicorp/raft 介绍与源代码分析(三): 集群节点恢复介绍
集群节点恢复各种情况下,重新选主成功后,落后的 follower 需要赶上 leader 的状态:follower 已经落地的 log ,需要校对。与 leader 不一致的,直接丢弃follower 从头,或从最近的本地镜像中恢复,并追赶应用 log 到状态机我们分析几种异常情况下,集群是如何自动恢复正常的:1 个 follower 重启了,该 follower 如何最终使自己的状态机赶上 leaderleader 重启了,且变为 follower,如何最终使自己的状态机赶上 leade原创 2022-02-13 20:45:02 · 1244 阅读 · 0 评论 -
hashicorp/raft 介绍与源代码分析(二): 领导人选举(二)
回顾上章提到,基于节点的 keyCurrentTerm 、LastLogTerm 、 LastLogIndex 3 个持久化数据,在选举时,可以确定领导者选择领导者的依据是哪个节点 log 最全,选谁但是有附加条件的,该节点 log 最全,并且其他节点已经应用到状态机的 log ,该节点必须有因此,不是所有情况下选举一定能成功的最坏的情况下,找不到符合条件的 log 落地日志拥有者时,必须牺牲可用性(即拒绝服务),来保证整个集群状态被破坏因为,如果有 log 已经应用到状态机, raft 协议没原创 2022-01-23 23:28:09 · 1689 阅读 · 0 评论 -
hashicorp raft 介绍与源代码分析(二): 领导人选举(一)
Raft 节点状态Raft 节点启动后,会在 Follower 、 Candidate 、 Leader 3 个状态间转换,直到关闭 Shutdown// RaftState captures the state of a Raft node: Follower, Candidate, Leader,// or Shutdown.type RaftState uint32const ( // Follower is the initial state of a Raft node. Foll原创 2022-01-16 23:52:00 · 1417 阅读 · 0 评论 -
hashicorp/raft 介绍与源代码分析(一): Raft 介绍
Raft 协议Raft 是一种为了管理复制日志的一致性算法由斯坦福的两位教授 Diego Ongaro 和 John Ousterhout 发表的一篇论文提出来的中英文论文地址,可以参考网友的链接: https://github.com/maemual/raft-zh_cn论文中主要阐述了,在节点失效是常态化的环境下,一种便于理解的、不失性能的,使所有节点日志数据一致的方法是分布式算法、一致性算法非常好的入门教材目前 golang 的比较有名的实作有:hashicorp/raftCons原创 2022-01-09 21:04:54 · 1083 阅读 · 0 评论 -
goc 介绍与源代码分析
gocgoc 是专为 Go 语言打造的一个综合覆盖率收集系统,尤其适合复杂的测试场景,比如系统测试时的代码覆盖率收集以及精准测试GitHub 地址: https://github.com/qiniu/goc通过官方 Readme 基本能了解如何使用 goc另外还有 2 篇官方相关文档:https://mp.weixin.qq.com/s/DzXEXwepaouSuD2dPVloOghttps://mp.weixin.qq.com/s/SQHzsfV5T_B8fmt9NzGA7Qgoc 运行原创 2021-12-05 22:30:17 · 3185 阅读 · 0 评论 -
BoltDB 介绍与源代码分析(八):MVCC 多版本并发控制
MVCC我们在内存中,经常会使用互斥锁的方式,来处理共享资源并原则上,会最小粒度的只锁共享资源的算术运算。因此非常快对于数据库则不太一样,数据库操作可能伴随磁盘 IO要保持一定的读写效率,又能兼顾事务的 ACID 四要素中的 I (隔离性),常见的解决方案就是 MVCC 机制MVCC 的核心想法就是:并发读写时,都基于当前数据的快照,写时不修改当前快照;又通过技巧,新写数据与旧快照数据重新构建出一个新版本。这样就可以互不干扰关于 MVCC 的经典案例,笔者认为 Linux 的写时拷贝(Copy-原创 2021-11-28 22:42:35 · 961 阅读 · 0 评论 -
BoltDB 介绍与源代码分析(七):freelist 页介绍(一)
freelist 页介绍需要空闲页列表,并加以管理。是因为:在增删改过程中,数据库文件会出现镂空避免镂空有不少方式:及时重整数据库文件。这样会严重损耗性能对镂空的页加以管理,下次分配页时,优先使用这些空闲的页。也就是 BoltDB 所采用的本文介绍, BoltDB 对空闲页的实现细节数据库文件中的空闲页列表组织形式两种形式之一:page 头字段 count 小于 0xFFFF,则 1 页足够存储 count 个 pageidpage 头字段 count 等于 0xFFFF,则:p原创 2021-11-15 00:06:55 · 737 阅读 · 0 评论 -
BoltDB 介绍与源代码分析(六): meta 页介绍
meta 页介绍meta 页相关代码,均在db.go中定义如下:type meta struct { magic uint32 version uint32 pageSize uint32 flags uint32 root bucket freelist pgid pgid pgid txid txid checksum uint64}字段值说明magic0xED0CDAED无实际意义,用来标识粗略识别该文件是否原创 2021-11-07 15:47:50 · 181 阅读 · 0 评论 -
BoltDB 介绍与源代码分析(五):数据库文件页类型介绍
数据库文件中的页介绍前面文章已经介绍,数据库文件按页划分组织:0 1 2 3 4┌───────────────┬───────────────┬───────────────┬───────────────┬────────────────────────────────────┐│ mate1 │ mate2 │ freelist │原创 2021-11-07 14:08:16 · 294 阅读 · 0 评论 -
BoltDB 介绍与源代码分析(四):BoltDB 数据库文件读写交互
BlotDB 进程与 BlotDB 数据库文件读写交互模式通常,处理文件,都会遇到这些问题:文件在磁盘上,而进程要处理的数据在内存里文件会很大,常态是远大于内存总量磁盘IO耗时 10+ ms ,如何组织文件中的格式,减少磁盘IO本文介绍下 BlotDB 如何处理这些问题mmap 内存映射文件mmap 是一种把文件内容全部(或部分)映射到进程内存空间,然后进程就可以像访问普通内存的方式,访问文件内容mmap 是一个系统调用,它与虚拟内存地址、缺页中断等词汇经常一起出现,是现代操作系统一个非原创 2021-10-23 23:47:50 · 365 阅读 · 0 评论 -
BoltDB 介绍与源代码分析(三): BoltDB 数据库文件
BlotDB 数据库文件执行:import bolt "go.etcd.io/bbolt"db, err := bolt.Open("/tmp/a.db", 0666, nil)if err != nil { return err}defer db.Close()会生成或打开/tmp/a.db BlotDB 数据库文件BlotDB 数据库文件具有以下特点:数据库文件内容按页分布增删数据会导致数据库文件存在空闲页数据库文件单进程读写独占;或多进程读共享PS. 页大小默认是操原创 2021-10-23 14:15:54 · 403 阅读 · 0 评论 -
BoltDB 介绍与源代码分析(二):目录文件说明
BlotDB 使用介绍本系列主要介绍 BlotDB 源代码相关,如何使用 BlotDB ,官方 Readme 中有详细的介绍传送门: https://github.com/boltdb/boltBlotDB 目录文件介绍目录文件说明bolt_*.go各操作系统移植代码,如各操作系统对 flock 、 mmap 等函数的实现细节*_test.go单元测试代码bucket.go用于组织同类性质的 KV 集合。比如账号数据,类似于 MySQL 中表compact原创 2021-10-17 13:02:19 · 346 阅读 · 0 评论 -
BoltDB 介绍与源代码分析(一):BoltDB 概述
BlotDB 介绍BlotDB 是一个使用 Golang 语言编写的嵌入式 KV 数据库GitHub 地址: https://github.com/boltdb/boltEtcd 就是使用了 BlotDB 作为数据存储BlotDB 作者表示:BlotDB 初衷是提供一个简单的纯 Go 键/值存储,并且不会使用无关的功能使代码膨胀自己不再有时间或精力继续这项工作Bolt 处于稳定状态,并有多个成功的项目在使用因此,该开源项目,作者目前已经 ArchiveEtcd fork 了分支: ht原创 2021-10-16 23:34:36 · 2588 阅读 · 0 评论 -
思考(八十三):gRPC-go、net.Conn、syscall.Syscall与性能优化
性能最近对程序做性能优化,发现syscall.Syscall的占比前 Top2从syscall.Syscall出发,经过一系列分析优化,程序性能提升了 3 倍下面来还原下整个过程syscall.Syscall通过go tool pprof工具分析,查看 Top5Top1 是 runtime.futex ,互斥量消耗Top2 是 syscall.Sycall,系统调用,会引起协程切换(这里直接导致线程切换)。协程切换也会引起互斥量消耗。因此优先排查syscall.Sycall利用go too原创 2021-07-11 19:02:32 · 1410 阅读 · 0 评论 -
grpc-go 代码阅读笔记(七):服务配置
服务配置本系列后面将要介绍的负载平衡器在介绍它之前,我们需要先了解下服务配置、以及如何扩展服务配置gRPC 服务配置,是一种把服务节点信息同步给客户端的信息同步机制目前主要用于以下功能:用于 LB 负载均衡用于 LB 健康心跳检查用于服务方法发现RPC 失败重试阈值在 gRPC 中服务配置的核心是用于 LB 负载均衡(服务发现)中此外也可以利用该机制,发布服务端配置到客户端运作机制如图:名称解析器根据自身实现获取服务节点信息(可以从 etcd/consul/zookeepe原创 2020-12-20 20:57:20 · 252 阅读 · 0 评论 -
grpc-go 代码阅读笔记(六):名称解析(三)
本章继续名称解析胶水代码实现部分相关代码,都在 https://github.com/grpc/grpc-go内容说明clientconn.gogrpc.ClientConn 的实现代码,里面会去用名称解析功能resolver_conn_wrapper.goresolver.ClientConn 的具体实现。是 grpc.ClientConn 与名称解析具体实现代码的胶水代码工作流程如图:图中涉及 3 个类,它们在 Dial 时的互动关系。说明如下:原创 2020-12-13 21:47:35 · 195 阅读 · 0 评论 -
grpc-go 代码阅读笔记(六):名称解析(二)
本章继续名称解析内置各种名称解析实现部分相关代码,都在 https://github.com/grpc/grpc-go/tree/master/internal/resolver内容说明dns/dns_resolver.go基于 DNS 域名解析,做的名称解析实现dns/go113.gogolang 1.13 版本编译会包含该文件。版本兼容问题passthrough/passthrough.go不做任何处理,按使用者传递的字面意思。即直接对 IP4 / IP6 方原创 2020-12-13 17:31:16 · 240 阅读 · 0 评论 -
grpc-go 代码阅读笔记(六):名称解析(一)
名称解析( Resolver )名称解析是 gRPC-go 提供的服务发现机制gRPC-go 内置了几种名称解析方式同时提供接口,使用者可以扩展自己的名称解析方式内置名称解析见代码, clientconn.go 49 - 51 行:package grpcimport ( // 其他代码略 _ "google.golang.org/grpc/internal/resolver/dns" // To register dns resolver. _ "google.gol原创 2020-12-06 17:38:39 · 296 阅读 · 0 评论 -
grpc-go 代码阅读笔记(五):连接管理
虚连接(gRPC Connectivity Semantics)虚连接,grpc 官方称之为gRPC Connectivity Semantics它是 grpc.ClientConn 的正式名称;本人称之为虚连接grpc.ClientConn 通常调用 grpc.Dial 函数生成,比如下面的代码:func main() { // Set up a connection to the server. conn, err := grpc.Dial(address, grpc.WithI原创 2020-11-23 20:22:56 · 573 阅读 · 0 评论 -
grpc-go 代码阅读笔记(四):网络传输层代码介绍
网络传输层代码介绍本系列一到三章均为网络传输层代码一些主要模块功能介绍本章做下查漏补缺,总体介绍下网络传输层代码,以及一些值得借鉴的代码编写技巧后续章节,将介绍 gRPC-go 网络传输层代码以上的代码功能相关文件网络传输层代码均在 https://github.com/grpc/grpc-go/tree/master/internal/transport 目录下具体有:文件说明bdp_estimator.go自适应增长流控窗口算法controlbuf.go处理出原创 2020-11-21 16:41:25 · 302 阅读 · 0 评论 -
grpc-go 代码阅读笔记(三):流与多路复用
流与多路复用gRPC-go 可以在 TCP 链路上,管理多个流。它们之间互不干扰本系列开篇已经提到流与多路复用,本文着重源代码介绍与实际应用相关代码介绍相关代码都在 https://github.com/grpc/grpc-go/tree/master/internal/transport 下文件说明http2_client.go基于 http/2 协议的 1 个 TCP 连接的 client 端http2_server.go基于 http/2 协议的 1 个 TCP原创 2020-11-16 00:39:31 · 831 阅读 · 0 评论 -
grpc-go 代码阅读笔记(二):流量控制
流量控制( Flow Control )流量控制,是为了能更好更有效率的利用网络带宽因为现实需求的复杂性,导致每个网络库根据自身侧重要解决的问题,都会有独特的流量控制算法比如 TCP 有用于流量控制的 RTT 算法、滑动窗口、拥塞窗口以及相关配套的重传机制而 KCP 为了让数据包更快的到达对端,相关处理与 TCP 就不尽相同它是允许滑动窗口中有镂空的(用于快速重传);并允许关闭拥塞窗口; RTT 算法也不一样;重传算法也更丰富还有不少网络库,如谷歌的 QUIC ,BBR 算法等,都是为了解决 T原创 2020-11-08 14:23:19 · 1001 阅读 · 0 评论 -
grpc-go 代码阅读笔记(一):HTTP/2
grpc-go 介绍grpc-go 是一个通用开源的 rpc 代码框架。github 地址: https://github.com/grpc/grpc-go不管是造轮子开发自己的网络库,还是想用好 grpc-go ,都非常有必要阅读 grpc-go 源码如果是不了解 grpc-go 的同学,可以从 helloworld 开始;进一步, features 目录下是 grpc-go 当前所有特性,需要全部过一遍在此基础上,便是项目工程中使用 grpc-go 与 阅读 grpc-go 源码了本系列文原创 2020-10-28 00:19:28 · 476 阅读 · 0 评论 -
libfixmath 介绍与源代码分析
libfixmathlibfixmath 是一个将浮点数用整数表示的开源库github: https://github.com/PetteriAimonen/libfixmath.git使用整数表示浮点数,并提供了常见算术函数:函数说明fix16_abs求绝对值fix16_floor下取整fix16_ceil上取整fix16_min求最小值...原创 2020-04-14 17:41:26 · 1545 阅读 · 0 评论 -
KCP 介绍与源代码分析(一)
ARQ 协议TCP 、 KCP 都是基于 ARQ 协议原理实现的,达成在不可靠的网络服务基础上,实现可靠传输ARQ 协议包括 2 种形式:形式工作方式特点停止等待 ARQ发送数据包,等待 ACK 包;超时重复发送数据包网络带宽利用率低;实现简单连续 ARQ连续发送 N 组数据包,等待 ACK 包,超时重复发送数据包网络带宽利用率高;实现复杂需要考虑是否会造...原创 2020-04-08 15:57:49 · 1249 阅读 · 0 评论 -
protoc-gen-go 介绍与源代码分析
protoc-gen-gogithub 地址: https://github.com/golang/protobuf/tree/master/protoc-gen-go它是 protoc 的一个插件,通过它, golang/protobuf 使 proto 定义文件,生成 golang 版本协议代码protoc-gen-go 具有良好的代码结构,可以简单在 protoc-gen-go 代...原创 2019-08-22 18:34:22 · 6532 阅读 · 0 评论 -
net/rpc 介绍与源代码分析
net/rpc 库net/rpc 库是 golang 官方内置的 rpc 库其源代码就位于: $GOROOT/src/net/rpc ,比如 /usr/local/go/src/net/rpc/net/rpc 具有良好的代码结构,众多开源库网络层实现,均采用相同的编程模式,比如 gRPC 、 go-micro因此不免有点小激动,记录一二背景看过不少 rpc 库都是使用 golang ...原创 2019-08-01 18:54:27 · 1507 阅读 · 0 评论 -
hashicorp/mdns 介绍与源代码分析
mDNSmDNS 即组播 DNS (multicast DNS)主要实现了在没有传统DNS服务器的情况下使局域网内的主机实现相互发现和通信苹果的 Bonjour 就是一个基于 mDNS 的产品hashicorp/mdnsgolang 版一个基于组播 DNS 信息,来实现服务发现的一个开源库github 地址: https://github.com/hashicorp/mdns实现思路...原创 2019-07-27 21:29:47 · 3468 阅读 · 0 评论