什么是可靠性
对于消息系统来说,所谓可靠性就是指消息可以从生产者(producer)准确的送达到消费者(consumer)。可靠性保证有三个层次:
At most once 最多一次。消息可能会丢失,但是决不重复。At least once 至少一次。消息决不丢失,但可能会重复。Exactly once 恰好一次。这是最完美的,既不丢失,也不重复。如果要可靠的准确的传达消息,需要生产者程序,消息系统和消费者程序相互合作。
什么是一致性对于消息系统来说,一致性是指,如果一个消费者c1读到消息m1的offset是x,那么之后的任何消费者读到的offset是x的消息一定也是c1。
可以参看偶的一个视频《分布式系统中的强一致性和弱一致性》
Kafka如何保证可靠性和一致性如果要可靠的准确的传达消息,需要生产者程序,消息系统和消费者程序相互合作。
生产者程序 Producer
生产者需要确认消息成功送达kafka的服务区broker,并且得到broker的返回消息,确认消息已经提交(commit)。如果没有成功返回需要重发,直到发送成功。
详细的配置解释,可以参考偶的头条文章《Kafka的可靠性保证 – 生产者的配置》
Kafka服务器集群 Cluster
Kafka的服务器是一个集群,集群中至少需要包含3个以上的节点。通过主从备份可以保证不丢消息。只要提交的消息就保证不丢。
详细的配置解释,可以参考偶的头条文章《Kafka的一致性保证》
消费者程序 Consumer
消费者从Kafka读取消息以后要妥善处理。所谓妥善处理,就是完成自己获取这一条消息的目标,比如生成一条业务数据存入数据库,或者发送消息到其他的系统。
消费者需要准确的维护offset,也就是消费到哪一条消息了。如果维护不好,就会导致丢消息或者重复消费。可以参考偶的头条动画视频《[动画] 如何设计可靠的Kafka的消费者程序 – exactly once》。
详细的配置解释,可以参考偶的头条文章《Kafka的可靠性保证 – 消费者的配置》
本人,@小马过河Vizit,专注于分布式系统原理和实践分享。希望利用动画生动而又准确的演示抽象的原理。欢迎关注。
关于偶的名字。小马过河Vizit,意为凡事像小马过河一样,需要自己亲自尝试,探索才能获得乐趣和新知。Vizit是指Visualize it的缩写。一图胜千言,希望可以利用动画来可视化一些抽象的原理。