说明
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中
PutMessageResult,status 与之前讲的AppendMessageResult(status)的区别
关系图PutMessage更上层一点,处理存放消息的操作
AppendMessage底层一点,对应MappedFile操作的结果,状态
吐槽
PutMessage与AppendMessage这种架构样式
同上面的思考,putMessageStatus很多和appendMessageStatus重复,其实个人感觉一层包含关系也足够了。即把上面uml图中,AppendMessageStatus融合到PutMessageStatus里面去就行
refer
http://www.voidcn.com/article/p-aevitnds-bhg.html ha部分
https://wangkang007.gitbooks.io/java/commitlog.html 同步刷盘部分,不准确但是可以参考
网友评论