美文网首页
store模块阅读3:PutMessageStatus与 Put

store模块阅读3:PutMessageStatus与 Put

作者: 赤子心_d709 | 来源:发表于2017-09-27 10:16 被阅读65次

说明

PutMessageStatus 用于描述放置消息到日志时的状态
PutMessageResult 用于描述放置消息到日志的结果,包含有上述状态
部分源码可能要参考commitLog类,HA相关的类,更方便理解,后面再讲

PutMessageStatus

public enum PutMessageStatus {
    PUT_OK,//正常状态
    FLUSH_DISK_TIMEOUT,//同步刷盘 且 需要落盘应答的场景,flush超时
    FLUSH_SLAVE_TIMEOUT,//同步刷盘止之后master需要同步到slave 且 需要落盘应答的场景, slave的flush超时,参考CommitLog.handleHA()
    SLAVE_NOT_AVAILABLE,//同步刷盘止之后master需要同步到slave 且 需要落盘应答的场景, 没有可用的slave,参考CommitLog.handleHA()
    SERVICE_NOT_AVAILABLE,//服务不可用
    CREATE_MAPEDFILE_FAILED,//创建MappedFile失败
    MESSAGE_ILLEGAL,//消息不合法,主要是消息体过大,或者topic长度过长
    PROPERTIES_SIZE_EXCEEDED,//消息的prop大小超过了Short.MAX_VALUE
    OS_PAGECACHE_BUSY,//最近一段时间内写消息操作还没有完成,则为忙
    UNKNOWN_ERROR,//未知错误
}

说明:

存放消息的状态
调用场景可参见commitLog,HAService相关代码

PutMessageResult

描述存放消息的结果
包含状态码以及追加消息的结果
前者不会为空,后者有可能为空(出现在消息预检查,还没有真正追加消息时)

属性

    private PutMessageStatus putMessageStatus;//状态码
    private AppendMessageResult appendMessageResult;//追加日志的结果

方法

注意两个方法即可
构造函数

    public PutMessageResult(PutMessageStatus putMessageStatus, AppendMessageResult appendMessageResult) {
        this.putMessageStatus = putMessageStatus;
        this.appendMessageResult = appendMessageResult;
    }

isOk函数

    public boolean isOk() {
        return this.appendMessageResult != null && this.appendMessageResult.isOk();
    }

思考

PutMessageResult 构造函数,什么时候AppendMessageResult 为空,什么时候不为空

为空的场景:
当放置消息先完成一些预检查时,比如DefaultMessageStore#putMessages中


AppendMessageResult传空

此时还没有进行追加消息的操作就已经确认异常码了.

不为空的场景:
有追加消息的行为的操作,得到了追加消息的结果,比如CommitLog#putMessage中

AppendMessageResult非空

PutMessageResult,status 与之前讲的AppendMessageResult(status)的区别

关系图

PutMessage更上层一点,处理存放消息的操作
AppendMessage底层一点,对应MappedFile操作的结果,状态

吐槽

PutMessage与AppendMessage这种架构样式

同上面的思考,putMessageStatus很多和appendMessageStatus重复,其实个人感觉一层包含关系也足够了。即把上面uml图中,AppendMessageStatus融合到PutMessageStatus里面去就行

refer

https://fdx321.github.io/2017/08/22/%E3%80%90RocketMQ%E6%BA%90%E7%A0%81%E5%AD%A6%E4%B9%A0%E3%80%916-%E6%B6%88%E6%81%AF%E5%AD%98%E5%82%A8/ ha部分

http://www.voidcn.com/article/p-aevitnds-bhg.html ha部分

https://wangkang007.gitbooks.io/java/commitlog.html 同步刷盘部分,不准确但是可以参考

相关文章

网友评论

      本文标题:store模块阅读3:PutMessageStatus与 Put

      本文链接:https://www.haomeiwen.com/subject/nbzsextx.html