Skip to content

由于不可抗力因素导致commitlog和offset不对应,进行consumer再也无法正常消费的异常 #1

@kamikyo

Description

@kamikyo

问题的现象:producer能持续的产生数据,并且producer.offset里的内容在持续更新,但是consumer不能正常消费,且consumer.offset的内容不会更新。

问题原因:服务器突然断电,导致从offset里记录的位置去commitlog里查找对应的内容无法找到Constants.EndMarker,这样consumer就进入了一种认为producer没有产生新消息的无限循环境地(在MappedFileSegment.TryRead一直卡住)。

解决思路:也是一个非常原始和暴力的解决方法,该解决方案需要对齐几个认知:
1。producer和consumer本身的position相差不大
2。在1的基础之上可以接受部分数据的丢失
3。这种况导致offset和commit不一致的极端情发生概率很少

基于上面三个认知,我想的解决方案为,当consumer连续N次(可配置)没有订阅到新的消息时(这个时候也激活了sleep等待的逻辑)去查找producer的offset,如果发现和consumer的不一样则强制将consumer的offset置为producer的offset。

我有相关的实现,看你这里是否有更好的解决思路。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions