消息可靠保证
1.消费端的保证消息可靠
唯一可能导致消息丢失的情况,在消费端获取到了消息,自动提交了offset,让borker以为已经消费好了这个消息,实际上才开始准备消费这条消息,可能存在消费过程中消费者挂了,这条消息就会丢掉。这和Rabbit差不多,Kafak会自动提交offset,那么只要关闭自动提交offset,处理完成之后手动提交ack。就可以保证消息不丢失。可能消费完了,提交ack过程发生失败,在消费端做好幂等性处理。
2.Borker弄丢了数据
比较常见的一个场景,某个broker挂了,然后重新选举Partition的leader。此时其他follower刚好有数据没有同步,结果此时leader挂了,然后选举某个follower成为leader之后,这样就导致有些数据丢失了。
要设置4个参数:
1.给Topic设置replication.factor参数:这个值必须大于1,要求每个partition至少有2个副本。
2.在Kafak服务端设置min.insync.replicas参数:这个值必须大于1,这个要求leader至少感知到至少一个follower还跟自己保持联系
3.在producer端设置acks=all:这个要求每条数据,必须写入所有的replicas,才能确认写入成功。
4.在producer端设置retries=MAX,这个要求一旦写入失败,就无限重试。
3.生产者producer保证消息不丢失
按照上述思路设置了acks=all,一定不会消失。要求是消息写入了leader后,所有的follower都同步到了消息才确认。如果不满足这个条件,生产者就会不断的重试。
Kafak如何保证消息的顺序消费
kafak本身不想Rocket一样,提供顺序性的消息。所以提供的方案都是相对有损的。这里的顺序消息,我们更多指的是,单个partition的消息,被顺序消费。
方式一:Consumer,对每个parttion内部单线程消费,单线程吞吐量太低,一般不会用。
方式二:Consumer拉取到message,写到N个内存queue,具有相同key的数据都存到同一个内存queue。然后对于n个线程,每个线程分别消费一个内存queue即可,这样能保证顺序性。