IT评测·应用市场-qidao123.com

标题: Kafka怎样保证消息的消耗顺序【全局有序、局部有序】、Kafka怎样保证消息不 [打印本页]

作者: 火影    时间: 2024-7-23 21:04
标题: Kafka怎样保证消息的消耗顺序【全局有序、局部有序】、Kafka怎样保证消息不
目录
Kafka消息生产
一个Topic对应一个Partition
一个Topic对应多个Partition
Kafka消息的顺序性保证(Producer、Consumer)
全局有序
局部有序 
max.in.flight.requests.per.connection参数详解
Kafka的多副本机制
Kafka的follower从leader同步数据的流程
Kafka的follower为什么不能用于消息消耗
Kafka的多分区(partition)以及多副本(Replica)机制的作用
Kafka和Zookeeper的关系
Kafka怎样保证消息不丢失
Kafka消息发送模式
 Kafka保证消息不丢失的措施
Kafka为什么这么快
Kafka怎样保证消息不被重复消耗
生产者消息重复发送
消耗者消息重复消耗
Kafka消息消耗失败

Kafka消息生产

一个Topic对应一个Partition

        生产者生产的全部数据都会发送到此Topic对应的Partition下,从而保证消息的生产顺序。
一个Topic对应多个Partition

   此时Kafka根据机遇情况采取三种消息分发机制:
    Kafka消息的顺序性保证(Producer、Consumer)

   
  全局有序

        全局有序必要保证一个Topic下的全部消息都必要按照生产顺序消耗。此时设置一个Topic下只对应一个Partition即可。而且对应的consumer也要使用单线程或者保证消耗顺序的线程模型。即可保证全局有序。
局部有序 

        要满足局部有序,只必要在发消息的时候指定Partition Key,Kafka对其举行Hash计算,根据计算结果决定放入哪个Partition。这样Partition Key相同的消息会放在同一个Partition。此时,Partition的数量仍然可以设置多个,提升Topic的团体吞吐量。并且为了达到严格的顺序消耗还必要max.in.flight.requests.per.connection = 1。
   不直接指定对应的Partition而是指定Partition Key
  
           在不增长partition数量的情况下想提高消耗速度,可以思量再次hash唯一标识(例如订单orderId)到不同的线程上,多个消耗者线程并发处置惩罚消息(仍旧可以保证局部有序)。

max.in.flight.requests.per.connection参数详解

        消息重试对消耗顺序的影响:对于一个有着先后顺序的消息A、B,正常情况下应该是A先发送完成后再发送B,但是在非常情况下,在A发送失败的情况下,B发送乐成,而A由于重试机制在B发送完成之后重试发送乐成了。这时对于自己顺序为AB的消息顺序酿成了BA。
        针对这种问题,严格的顺序消耗还必要max.in.flight.requests.per.connection参数的支持。该参数指定了生产者在收到服务器响应之前可以发送多少个消息。它的值越高,就会占用越多的内存,同时也会提升吞吐量。把它设为1就可以保证消息是按照发送的顺序写入服务器的。

   保证消息不丢失是一个消息队列中心件的基本保证,那producer在向kafka写入消息的时候,怎么保证消息不丢失呢?实在上面的写入流程图中有描述出来,那就是通过ACK应答机制!在生产者向队列写入数据的时候可以设置参数来确定是否确认kafka接收到数据,这个参数可设置的值为0、1、all
  
  最后要注意的是,如果往不存在的topic写数据,能不能写入乐成呢?kafka会主动创建topic,分区和副本的数量根据默认配置都是1。
          此外,对于某些业务场景,设置max.in.flight.requests.per.connection=1会严重降低吞吐量,如果放弃使用这种同步重试机制,则可以思量在消耗端增长失败标记的记录,然后用定时任务轮询去重试这些失败的消息并做好监控报警。
Kafka的多副本机制

        Kafka为分区(Partition)引入多副本(Replica)机制,分区(Partition)中的多个副本中有一个leader,其余称为leader的follower。我们的消息发送到leader副本,然后follower副本才气从leader副本中拉取消息举行同步。
Kafka的follower从leader同步数据的流程

        整个同步流程是异步的,并且计划得足够高效,以便在Kafka集群中处置惩罚大量的数据和高并发的读写操作。此外,Kafka还通过一系列的优化本领(如批量拉取、压缩传输等)来减少同步过程中的网络开销和延迟。
Kafka的follower为什么不能用于消息消耗


Kafka的多分区(partition)以及多副本(Replica)机制的作用


Kafka和Zookeeper的关系

        Zookeeper主要为Kafka提供元数据的管理的功能。
   
          在Kafka2.8之前Kafka严重依赖于Zookeeper,在Kafka2.8之后引入了基于Raft协议的KRaft模式,从而使得Kafka不再严重依赖于Zookeeper,可以举行独立的摆设,大大简化了Kafka的架构. 
Kafka怎样保证消息不丢失

Kafka消息发送模式

   
   Kafka保证消息不丢失的措施

Kafka为什么这么快

Kafka不基于内存,而是基于磁盘,因此消息堆积能力更强。


Kafka怎样保证消息不被重复消耗

生产者消息重复发送

        生产发送的消息没有收到正确的broke响应,导致producer重试。
        详解:producer发出一条消息,broker落盘以后,因为网络等缘故原由,发送端得到一个发送失败的响应或者网络中断,然后producer收到 一个可规复的Exception重试消息导致消息重复。
        办理:
   enable.idempotence=true   //此时会默认开启acks=all
acks=all
retries>1
          kafka 0.11.0.0版本之后,正式推出了idempotent producer,支持生产者的幂等。每个生产者producer都有一个唯-id,producer每发送一条数据都会带上一个sequence,当消息落盘,sequence就会递增1。只需判断当前消息的sequence是否大于当前最大sequence,大于就代表此条数据没有落盘过,可以正常消耗,不大于就代表落盘过,这个时候重发的消息会被服务端拒掉从而制止消息重复。
  消耗者消息重复消耗

        Kafka默认先消耗消息,再提交offset。如果消耗者在消耗了消息之后,消耗者挂了,还未提交offset,那么Broker后边会重新让消耗者消耗。
        办理:消耗者举行幂等处置惩罚,消耗者举行幂等处置惩罚同样可以处置惩罚生产生重复发送消息的问题。
        如:可以用redis的setnx分布式锁来实现。比如操作订单消息,可以把订单id作为key,在消耗消息时,通过setnx命令设置一下,offset提交完成后,在redis中删除订单id的key。setnx命令保证同样的订单消息,只有一个能被消耗,可有效保证消耗的幂等性!上面提到的两种方式必要结合SETNX使用。
Kafka消息消耗失败

        Kafka默认消息消耗失败后的重试次数为10,并且重试间隔为0s。
        当达到最大消息重试次数后,数据会直接跳过继续向后执行。消耗失败的消息会被加入到死信队列中举行处置惩罚。对于死信队列的处置惩罚,既可以用 @DltHandler 处置惩罚,也可以使用 @KafkaListener 重新消耗。
        死信队列(Dead Letter Queue,简称 DLQ) 是消息中心件中的一种特别队列。它主要用于处置惩罚无法被消耗者正确处置惩罚的消息,通常是因为消息格式错误、处置惩罚失败、消耗超时等情况导致的消息被"丢弃"或"死亡"的情况。当消息进入队列后,消耗者会尝试处置惩罚它。如果处置惩罚失败,或者超过一定的重试次数仍无法被乐成处置惩罚,消息可以发送到死信队列中,而不是被永久性地丢弃。在死信队列中,可以进一步分析、处置惩罚这些无法正常消耗的消息,以便定位问题、修复错误,并采取适当的措施。
一文明白Kafka怎样保证消息顺序性-腾讯云开发者社区-腾讯云 (tencent.com)
 Kafka基本原理详解(超具体!)_kafka工作原理-CSDN博客
怎样保证kafka消耗的顺序性_kafka顺序消耗 怎样控制-CSDN博客
kafka专题:kafka的消息丢失、重复消耗、消息积存等线上问题汇总及优化_java kafk数据积存导致其他队列消息丢失-CSDN博客Kafka消息重复-缘故原由/办理方案 - 自学精灵 (skyofit.com)
Kafka常见问题总结 | JavaGuide


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 IT评测·应用市场-qidao123.com (https://dis.qidao123.com/) Powered by Discuz! X3.4