其实造成这两个问题的原因很类似,所以解决方式也比较类似,下面我们来看看这两个问题。
重复消费
- 造成原因
commit的方式不合理。当我们从broker读取消费先处理在commit offset时,如果在commit前发生问题(如网络中断等),那么consumer无法知道这条消息是否已经消费。
- 解决方案
其实解决方案也比较简单,我们只要把offset和输出数据绑定在一起即可,要么一起成功,要么一起失败。
数据丢失
这个问题在producer和consumer组件中都有可能会发生。
producer
- 造成原因
producer发送数据给broker后,遇到网络问题通信中断,producer无法判断该条消息是否commit
- 解决方案
producer生成一个类似主键的东西,发生故障时幕等的重试即可
consumer
- 造成原因
这个问题的原因也是因为commit的方式不合理导致的,不过和重复消费正好相反。这个问题主要因为comsumer先提交offset再读取消费,但是在读取消息的时候发生了网络问题等造成数据还没有处理,而在comsumer看来这个数据已经处理了。
- 解决方案
与重复消费的处理方案一样,只要把offset和输出结果绑定在一起即可。