对于这个问题我们先来看一下一个笑话:
可以这样的实现
kafka设计思想:
Kafka 0.11.0 版本之前并不能保证Exactly-once的语义,只能保证 at-least-once or at-most-once。实际运用中我们并不希望数据丢失,当网络出现问题的时候,我们都会选择重试,所以一般会保证at-least-once。
下面从三个点来讲解:
idempotent Producer 设计
Transactional Messaging in Kafka 设计
Message format 改变
1.Idempotent Producer
我们要保证 Producer 发送数据幂等性,可以给每条数据分配一个UUID,Server 端存储所有的id。接收到数据的时候进行检测,如果重复就拒绝。这样的设计有一个问题就是算法复杂度的问题,我们需要匹配所有的消息的UUID。所以我们需要一个对空间资源要求低且查询速度快的设计思路。
我们可以给 Producer 分配一个PID,message分配一个自增的sequence n