消息承诺分类
最多一次(at most once):
消息可能会丢失,但绝不会被重复发送。
至少一次(at least once):
消息不会丢失,但有可能被重复发送。
精确一次(exactly once):
消息不会丢失,也不会被重复发送。
选择哪种需要看业务需要。
理论上 exactly once 确实最好,但需要很多的逻辑保障,降低了系统性能。默认情况是不允许数据丢失,重复了可接受,即「至少一次」。但也有实时流数据场景,需要实现精确一次。
如何保障 exactly once
两种机制
1、幂等性
概念:
指的是,一个操作无论执行多少遍都会得到相同的结果。
例,数学中 x1 是幂等,而 +1 不是。 x1 无论执行多少次得到的结果都一样,但执行多次 +1 结果就会不同。
在计算机领域,就是某个命令或函数多次执行后不改变系统的状态。
Kafka 中的应用:
在 Kafka 中可以创建「幂等性 Producer」
幂等性 Producer 只能保证单分区、单会话上的消息幂等性
2、事务
概念:
执行的的操作要么全成功,要么全失败。
Kafka 中的应用:
Kafka 中可以创建「事务型 Producer」