Skip to content

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

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。

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

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

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