phxpaxos 状态机

引用的话:

        状态机这个名词大家都不陌生,一个状态机必然涉及到一个状态转移,而Paxos的每个实例,就是状态转移的输入,由于每台机器的实例编号都是连续有序增长的,而每个实例确定的值是一样的,那么可以保证的是,各台机器的状态机输入是完全一致的。根据状态机的理论,只要初始状态一致,输入一致,那么引出的最终状态也是一致的。而这个状态,是有无限的想象空间,你可以用来实现非常多的东西。

phpaxos状态机实现的类图:


其中包含了五个类:
SMFac:状态机管理类,维护这一个状态机列表,对外提供添加状态机,获取状态机列表,状态机执行等访问接口。
StateMachine:状态机的抽象基类,业务人员可以定制自己的状态机,并且加入到状态机管理类中。
InsideSM:继承了StateMachine,抽象出一个内部状态机的基类。
MasterStateMachine:内部状态机,选举master操作。
SystemVM:内部状态机,处理集群节点变更。


1、SMFac管理类:
由于每个group之间是相对独立的,所以我们一般以每个group的逻辑来分析。每个group维护这一个SMFac,允许存在多个状态机,不同的状态机之间的数据相互隔离,多个状态机在一个group串行的excute,具体的是一次proposer带一个状态机,learn处理完成之后执行状态机的excute函数(不考虑batch proposer的情况),因为他们共享相同的资源:Proposer,learner,accepter。 SMFac做为管理类,除支持添加各种状态机,还对外提供了统一的状态机执行接口。

在learn处理消息完成之后,会进行一些后续状态机的处理等操作:
    if (m_oLearner.IsLearned())
    {
        BP->GetInstanceBP()->OnInstanceLearned();

        SMCtx * poSMCtx = nullptr;
        bool bIsMyCommit = m_oCommitCtx.IsMyCommit(m_oLearner.GetInstanceID(), m_oLearner.GetLearnValue(), poSMCtx);

        if (!bIsMyCommit)
        {
            BP->GetInstanceBP()->OnInstanceLearnedNotMyCommit();
            PLGDebug("this value is not my commit");
        }
        else
        {
            int iUseTimeMs = m_oTimeStat.Point();
            BP->GetInstanceBP()->OnInstanceLearnedIsMyCommit(iUseTimeMs);
            PLGHead("My commit ok, usetime %dms", iUseTimeMs);
        }
        // 执行状态机
        if (!SMExecute(m_oLearner.GetInstanceID(), m_oLearner.GetLearnValue(), bIsMyCommit, poSMCtx))
        {
            BP->GetInstanceBP()->OnInstanceLearnedSMExecuteFail();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值