etcd raft是目前使用最广泛的raft库,如果想深入了解raft请直接阅读论文 “In Search of an Understandable Consensus Algorithm”(https://raft.github.io/raft.pdf), etcd raft在etcd, Kubernetes, Docker Swarm, Cloud Foundry Diego, CockroachDB, TiDB, Project Calico, Flannel等分布式系统中都有应用,在生成环境得到了验证。 传统raft库的实现都是单体设计(集成了存储层、消息序列化、网络层等), etcd raft继承了简约的设计理念,只实现了最核心的raft算法, 这样更加的灵活。etcd将网络、日志存储、快照等功能分开,通过独立的模块实现,用户可以在需要时调用。etcd自身实现了自己的一套raft配套库:etcd-wal(用于存储日志),snap(用于存储快照),MemoryStorage(用于存储当前日志、快照、状态等信息以供raft核心程序使用)。 https://raft.github.io/raft.pdf 集群中最核心内容是保证数据一致性,那么如何保证数据一致性?在业界有很多算法、协议,例如:Paxos,Raft。 Raft协议相比之前协议Paxos等,算是年轻协议,而且Raft协议比较简单,容易实现。
https://mp.weixin.qq.com/s/mfjtDrdVQYfLuh4pNaHpZw 命令和查询责任分离(CQRS)是指将数据存储的读取和更新操作分开的一种模式。实施 CQRS 据称可以提高性能、可扩展性和安全性。迁移到 CQRS 模式所创造的灵活性,使系统能够随着时间的推移而更好地发展。不过 CQRS 模式有一些众所周知的陷阱,本文介绍了三种实用的场景。
https://blog.csdn.net/u010853261/article/details/84790392 http://supertech.csail.mit.edu/papers/steal.pdf https://xargin.com/go-scheduler/ http://xiaorui.cc/archives/5251 https://studygolang.com/articles/11865
传统的并发形式:多线程共享内存,这也是Java、C#或者C++等语言中的多线程开发的常规方法,其实golang语言也支持这种传统模式,另外一种是Go语言特有的,也是Go语言推荐的:CSP(communicating sequential processes)并发模型。不同于传统的多线程通过共享内存来通信,CSP讲究的是“以通信的方式来共享内存”。 “不要以共享内存的方式来通信,相反,要通过通信来共享内存。”