端到端一致性: exactly-once
传输过程要保证exactly-once, 需要内部能够实现状态保存, 当下游保存失败时, 能够更加保存的历史状态再次提交数据.
而下游接受数据, 需要具备去重能力. 去重有两种方式:幂等写入, 事务写入
内部: 支持checkpoint或者状态保存
下一级: 数据不会被重复写入
- 幂等写入
- 根据key去重, 比如k-v数据库: hbase, redis
- 事务写入
- 能够在失败后回滚提交
kafka
在0.11版本之后,Kafka Producer引入了幂等性机制(idempotent),配合acks = -1时的at least once语义,实现了producer到broker的exactly once语义。
producer需要能过保存当前发送数据的状态, 以及在出现失败时, 能够重复向broker提交数据.
而相对与producer的下一级broker(cluster端)需要具备幂等性(去重), 重复插入同一条数据, 只保留一条.
每个生产者线程生成的每条数据,添加以下的标识符: (producerid,partition,SequenceId),通过标识符对数据进行去重!