‘壹’ 7. PhxPaxos源码分析之整体架构
目录
1. PhxPaxos源码分析之关于PhxPaxos
2. PhxPaxos分析之网络基础部件
3. PhxPaxos源码分析之Proposer、Acceptor
4. PhxPaxos源码分析之Learner
5. PhxPaxos源码分析之状态机
6. PhxPaxos源码分析之归档机制
7. PhxPaxos源码分析之整体架构
前面几章我们依次介绍了网络基础部件、paxos三个核心角色(ProposerAcceptorLearner)、状态机、Checkpoint机制。在PhxPaxos中,Instance对象将上述角色组合到差让一起。多节点上Instance互相通信共同构成了一个paxos集群,有序的确定多个值。架构关系图如下:
Instance的实现类大约有900行,主要做了一些和网络数据处理相关的逻辑,这部分并不复杂。这里我想谈的是Instance初始化逻辑。
Instance的初始化在进程启动时,进程有可能时首次启动,也可能是异常退出后的重启。重启要将Instance恢复到启动前的状态,需要把磁盘中的数据恢复到内存中。对于PhxPaxos来说,磁盘中的数据主要集中在Acceptor、CheckpointMgr中。这里先读取Acceptor中的数据丛庆姿,随后读取CheckpointMgr中的数据,并将Acceptor中未体现在CheckpointMgr中的数据进行重演。最终,将paxos的instance恢复到启动前的状态:
随后将当前的instance id标记为Max Chosen Instance ID。
严格讲llNowInstanceID不一定是Max Chosen Instance ID。因为Acceptor落盘的最后一条记录可能是尚未选中(Chosen)的“半成品”,即提案尚未完成。所以,这里将llNowInstanceID做为Max Chosen Instance ID是不准确的。只不过当前Max Chosen Instance ID仅在确定需要保留的paxos log数量时使用,而且最小的paxos log保留数量为300,因此并没有出什么问题。
Instance之上是Group,每个Group包含一个Instance,Group负责Instance初始化:
Group的价值在于概念抽象,不同节点的Instance的运行状态可能不同,即Instance ID不同,但这些Instnace仍旧属于一个Group。另外,PhxPaxos允许同时存在多个Group,每个Group下运行多个Instance(和节点个数相同)。如果不抽象Group概念,本Group内的Instance和Group间的Instance容易产生混淆。
既然允许运行多个Group,我们需要一个Group Manager,在PhxPaxos中这个角色是Node抽象类。Node是整个PhxPaxos库对外提供的服务类,应用通过Node :: RunNode启动本节点的PhxPaxos服务。
至此,PhxPaxos的整体架构已经渗绝浮现:
PhxPaxos中的节点除了做为Paxos协议的参与者,还运行另外一类成为follower的节点。Follower指定一个运行Paxos协议的节点用于数据同步,它节点不参与Paxos协议,也不参与Paxos选主。Follower更像传统意义上的同步备,当Paxos协议节点确定一个值后,将数据同步到Follower节点。但有一点不同的是:Follower节点运行Learner,当某个值缺失时,可以通过Learner主动发起AskForLearn习得。
到这里,PhxPaxos源码分析就结束了。
整体上看,微信开源的PhxPaxos无论从架构设计、编码质量、细节优化上绝对可以配得上“生产级”这个称号(编码质量尤其值得称赞)。
更多PhxPaxos相关文章请参见官方 WIKI 。
‘贰’ [探讨]提高代码质量的方法有哪些
1. 代码风格和规范:
多看看网上的一些代码规范,仔细思考一下制定这些规范的出发点是什么。例如Oracle(前
SUN)公司的代码规范,Google的代码规范 。
2. 学习最佳实践
在编码中遇到的各种大大小小的问题,首先不是自己去“闭门造车”的冥思苦想,多用
Google,搜搜是否已经有现成的解决方案。
3. 阅读优秀的开源代码
网上有很多优秀的开源项目,针对你自己项目中遇到的问题,找找类似的开源项目,学习、
研究,最重要的是变成自己的东西。
4. 学好英语
英语是目前所有编程语言的基础。你的文件名、类名、方法名、变量名都是需要一个好的英
语基础才能够起得合适。任何的业务逻辑,都需要你使用以英语为基础的计算机语言表达出来。
英语不好,你的代码永远看起来不专业。
书籍涵盖的主题从个人责任、职业发展,知道用于使代码保持灵活、并且易于改编和复用的
各种架构技术。
总结起来方法有三:平时多练手,多阅读优秀的源码,阅读优秀的编程技巧类型的书。
‘叁’ C语言代码编译成的是机器码,那么怎么实现可移植性呢
C语言代码编译成的是机器码,通常不能在不同指令系统的机器上运行。
我遇到过同样的机器,同样的机器码,同样的操作系统,也就是原来在本机编好的若干程序,突然运行不了了(出错),必须重新编译后才能运行。因为微软动态链接库里的子程序号码“更新”了。
如果编译成半成品机器码,或者类似obj,到运行的机器上再由附加的解释器解释(或编译器链接),则可以运行。这就是所谓的“跨平台”“移植”“嵌入”。
‘肆’ 手机直播源码开发怎么做
很高兴回答您的问题,我有两种提案:源码二开或者定制开发
首先确定一点,制作手机直播源码,需要程序员,但是,制作手机直播源码的过程是完全由程序员进行源码开发,还是可以略微缩减一下工作量和工作时间,这就要回到我的两点提案了。
2、 定制开发
这种源码开发方式就是让程序员从头到脚完整的打一份手机直播源码出来,优点是细节方面完全契合,不会有任何的限制,缺点是成本高、时间花费长、程序员工作量大等。
以上是我的提案,希望能够获得采纳。