用户使用High Level Consumer过程中,例如用户实例化了两个TalosConsumer的实例A,B;假设A在消费partition数据的时候被杀死了或者机器宕机了,这时候A消费的数据的checkpoint还没有来得及commit,而后B接管了A之前所消费的partition,B就会重复消费那部分A在挂掉之前已经消费但是没有commit的数据,这时候出现more than once;
用户使用High Level Consumer过程中,当多个Consumer出现上下线的时候,Consumer之间会进行Rebalance,即重新分配partition;假设Consumer A原来消费partition [1,2,3],当有其他Consumer上线时,A需要释放partition 1,此时,A会将已经消费的partition 1的数据进行commit,commit发生失败的情况下会出现more than once;commit失败的原因可能是:1) Consumer A已经丢掉了partition 1的锁而无法commit,例如gc或网络原因导致丢锁; 2) Consumer A commit的时候写HBase发生错误导致失败,这种情况的概率比较小,且server端会有重试的逻辑;Commit失败后,其他Consumer接管这个partition就会重复消费A之前已经消费的那部分数据;
简单来讲,Talos返回写入成功的数据,我们承诺不丢;某些场景下,用户还没有写入的数据可能会丢,请知悉
当用户使用Simple Producer(同步接口)时,如返回写成功,承诺不丢;
当用户使用High Level的TalosProducer(异步接口)时,成功执行用户回调的onSuccess时,承诺不丢;
当用户使用用High Level的TalosProducer(异步接口)时,进程挂了或被杀掉,buffer中还未写入的数据会丢;