Kafka的消息安全机制

序言

       关于JMS有一些共性的问题,每个框架给出的解决方案各不相同.这里仅针对Kafka.

 

生产者消息可靠性

生产者提供了如下的几个模式来弄处理生产消息的可靠性.

  1. 发送并忘记(不关心消息是否正常到达,对返回结果不做任何判断处理):发送并忘记的方式本质上也是一种异步的方式,只是它不会获取消息发送的返回结果,这种方式的吞吐量是最高的,但是无法保证消息的可靠性

  2. 同步发送(通过get方法等待Kafka的响应,判断消息是否发送成功):以同步的方式发送消息时,一条一条的发送,对每条消息返回的结果判断, 可以明确地知道每条消息的发送情况,但是由于同步的方式会阻塞,只有当消息通过get返回future对象时,才会继续下一条消息的发送
  3. 异步发送+回调函数(消息以异步的方式发送,通过回调函数返回消息发送成功/失败):在调用send方法发送消息的同时,指定一个回调函数,服务器在返回响应时会调用该回调函数,通过回调函数能够对异常情况进行处理,当调用了回调函数时,只有回调函数执行完毕生产者才会结束,否则一直会阻塞

 

对应配置文件的内容如下:当producer向leader发送数据时,可以通过request.required.acks参数来设置数据可靠性的级别:

   1(默认):这意味着producer在ISR中的leader已成功收到的数据并得到确认后发送下一条message。如果leader宕机了,则会丢失数据。

   0:这意味着producer无需等待来自broker的确认而继续发送下一批消息。这种情况下数据传输效率最高,但是数据可靠性确是最低的。

   -1:producer需要等待ISR中的所有follower都确认接收到数据后才算一次发送完成,可靠性最高。但是这样也不能保证数据不丢失,比如当ISR中只有leader时,这样就变成了acks=1的情况。

 

消费者的消息可靠性

      唯一可能导致消费者弄丢数据的情况,就是说,你消费到了这个消息,然后消费者那边自动提交了 offset,让 Kafka 以为你已经消费好了这个消息,但其实你才刚准备处理这个消息,你还没处理,你自己就挂了,此时这条消息就丢咯。但是此时确实还是可能会有重复消费,比如你刚处理完,还没提交 offset,结果自己挂了,此时肯定会重复消费一次,自己保证幂等性就好了

 

关于消息的顺序

这个可以从逻辑上进行控制,也可以在队列上进行处理,比如只有一个消费者.没消费完一次才能消费下一个消息.

 

关于重复消费

这个可以从逻辑上进行判断,但是这是万不得以的情况.另后面想到了问题在补充,欢迎骚扰:[email protected]

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章