不允许在许多系统中重复重复,例如某些业务结算平台(例如物流平台,银行结算平台等)
为了解决重复的重复和重复序列的问题,Kafka提供了生产者的权力和交易特征的力量,以防止消息的重复。这两种方法适用于不同的应用程序方案,其中:
由于网络故障,该消息写入服务器日志后,适用于消息,生产者未及时接收来自服务器的消息。制片人错误地认为,新闻并没有持续到达服务器,这导致生产者重复该消息,从而导致重复新闻。现象和力量是解决问题。
生产者事务有两个典型用途。一种是将多条消息的操作作为原子操作提交,或者所有提交都成功或所有提交的失败。另一个场景是防止消费 - >处理器 - >生成现场重复的问题,即,在消耗后以及处理处理器后消耗了消息A,然后通过生产者将处理消息发送给主题B仅通过依靠权力和其他性行为来为主题,只能确保主题A不会重复该信息,但不能保证该消息是在处理器之后并发送到主题B。如果当前的处理器降低,则主题A的消费尚未提交主题A,然后在该处理器再次启动之前,该消息被处理器反复消耗并再次处理,这导致主题B重复该消息。,因为消费者位移未在及时提交主题,因此将在重新启动后再次拉消息,并重复上述过程。Kafka的事务是解决重复的问题这个场景引起的主题新闻。
“力量”一词最初是数学领域的概念。它是指某些可以执行多次执行的操作或功能,但是每次获得的结果都没有变化。让我给我一些简单的示例以解释。例如,在乘法操作中,让数字乘以1是一个电源和其他操作,因为无论您执行多少操作,结果都是相同的。在另一个例子中,采用整个功能(地板和天花板)是电源等功能,因此请运行地板(3.4)和100楼(3.4)一次,结果是相同的,相反,让数字加1不是电源,因为执行和执行的结果必须不同。
在计算机字段中,诸如电源之类的功率的含义略有不同:
1.在命令-Type编程语言(例如C)中,如果子例程是一种力量,则不得修改系统状态。无论运行该子例程多少次,与子例程相关的系统状态保持不变。
2.在功能编程语言(例如Scala或Haskell)中,许多纯函数自然而然地提供了动力,并且它们没有执行任何副作用。
有很多好处,例如权力和其他性质。最大的优势是我们可以安全地重试任何性行为,并且无论如何它们都不会破坏我们的系统状态。如果是无权和其他性行为,我们还需要担心多次某些操作的影响,但是对于诸如权力之类的性行为,我们不必为此担心。
消息功率是防止生产者及时重复消息以重复该消息并在队列中导致消息重复。注意,这里的ACK不是TCP协议的ACK,而是应用程序的ACK完成消息的耐用性后,发送给生产商的层表示已收到消息并完成了同步。它已正确交付,并且不能保证Kafka已将消息持久持久到日志上。以下ACK表示应用层的ACK。
为了解决上述问题,KAFKA提供了一种机制,例如权力。简而言之,接口的多个调用产生的结果与调用一致。
在卡夫卡(Kafka)中,生产者不是默认的能力,但是我们可以创建诸如此类的幂。它实际上是版本0.11.0.0.的新功能。消息可能会多次发送,导致重复新闻。0.11后,指定propucer功率的方法非常简单。它只需要设置一个参数,即resase.put.put('enable.idempotence”,ture)或armose.put.put(productConfig.enable_idempotence_config,true)。
enable.IDEMETENCE设置为True,产品会自动升级到诸如(即Acks自动变为-1,max.in.flicht.requests.pers.per.per.connection)之类的幂。<=5),其他所有的代码逻辑都不需要改变。Kafka 自动帮你做消息的重复去重。底层具体的原理很简单,就是经典的用空间去换时间的优化思路,即在 Broker 端多保存一些字段。当 Producer 发送了具有相同字段值的消息后,Broker 能够自动知晓这些消息已经重复了,于是可以在后台默默地把它们“丢弃”掉。
精确一次(Exactly Once) = 幂等性 + 至少一次( ack=-1 + 分区副本数>= 2 + ISR最小副本编号> = 2)。
为了实现生产者的力量,Kafka引入了生产者ID(IE PID)和序列编号。
初始化时,PID。每个新产品将被分配为唯一的PID。此PID是用户看不见的。
序列Numbler。(对于每个PID,产品都会发送每个PID的数据
构造时每个Kafkaproducer分配一个生产者ID,每个分区都有一个序列号。从0开始,生产者将向分区发送一条消息,[生产者ID,分区ID](分区ID]将对与分区号相对应的序列号的值BETHE值,并且服务器维护序列号。
经纪人侧为[生产者ID,分区ID]保持一个序列号。当经纪人终端从生产者那里接收消息时,只有当消息的序列号大于当前值的当前值时,它将在接收1的接收值1之前接收1,并且在接收到1接收1的值1的值1。如果差异小于1,则表示消息是反复发送的,并且将丢弃消息。如果差异大于1,则表示表示差异。中间有一条消息。目前,生产者将抛出OutorderSequenceException异常。
重复的数据判断标准:在提交“ PID,分区,seqnumber”的相同主要键时,经纪人只会持续很长时间。在它们中,PID每次重新启动时都是新的;分区指示分区编号;序列编号是自我提示的。
因此,功率的性质只能确保在单个分区和单个会话中不会重复。
例子
示例1(无与伦比的机制和其他机制):Kafka在引入性别和其他性行为之前向经纪人发送信息以下内容:
上图中的实施过程是一个以理想状态发送情况的消息,但是在实际情况下,将发生各种不确定因素,例如当生产者发送到经纪人时,网络异常发生。例如,以下异常情况:
在上面的这种情况下,当产品第一次向经纪人发送消息时,经纪人将消息(x2,y2)添加到消息流中,但在将ACK信号返回到产品时失败(例如网络异常)。这次,产品触发了重新测试机制,并将消息(X2,Y2)发送给经纪人。收到消息后,再次将消息添加到消息流中,然后返回到ACK信号到该产品。这样,在这种方式上,新闻流被反复添加两个相同的(x2,y2)新闻。
示例2(引入机制和其他机制):面对此类问题,Kafka引入了权力和其他性别。那么,权力和其他性别如何解决此类重复消息的问题?让我们首先看一下流程图:
同样,这是一个理想的发送过程。实际上,将ACK信号发送给生产商时会有很多不确定的因素,例如导致网络异常,导致发送失败。以下:
当产品向经纪人发送消息(X2,Y2)时,经纪人会收到消息并将其添加到消息流中。这次,当经纪人将ACK信号返回给生产者时,异常使生产者接收了ACK信号故障。对于生产者,将触发重试机制,并再次发送消息(X2,Y2)。但是,由于引入了力量和其他性别,PID(ProducerID)和SequenceNumber都附在每个消息上。相同的PID和Sequeencenumber发送给经纪人,并且在经纪人之前发送了同一消息,然后只有一个,然后只有一个(x2,y2)在新闻流中,不会有重复的发送。
似乎功率的功能很酷,并且使用非常简单。可以确保不会仅以参数重复该消息,但实际上,我们必须了解权力力量作用的范围。
首先,它只能确保单个分区上的权力力量,即,诸如权力之类的权力可以确保在某个主题的分区上没有重复的信息,并且无法意识到它的力量第二,它只能实现诸如单个会话之类的权力,并且无法实现交叉效力。丢失的。
然后,您可能会问,如果我想实现多区域和多障碍的新闻,该怎么办?答案是交易或依赖项。这也是权力和交易产品的力量之间的最大区别!
实际上,可以通过这种方式简化交易:生产者的事务可以确保仅存储信息在Kafka的某个分区中,并且不会出现在多个分区中。此外,它可以确保将多个消息原子发送到多个division.division。换句话说,它只能保证从制作人到经纪人的消息不会丢失或重复。偏移和消息处理的顺序,可能仍有重复的消耗或消息消耗丢失。如果您想一次实现准确的消费者消费,则需要实现消费者方面的其他机制来实现消费者。
如上所述,交易的典型用法方案是消费 - >处理器 - > froce。在此模型中,消费和生产共存,消费者可能在提交消费位移并引起重复消费消息的过程中存在问题。在这种情况下,使用以下三个步骤可以将以下三个步骤合并为原子操作:
在主题A的分区消息X处理主题A的消息A的消息X之后,获得了消息Y,并将消息Y提交给主题B的分区,以提交主题A的消费者位置以移动上述三个操作。以上三个操作都是成功的。
注意:要打开交易,您必须打开权力和其他性别。权力的力量为默认值。
交易型生产商保证该新闻是多个分区的。新闻都是成功的,要么都是失败的。此外,交易产品不惧怕该过程的重新启动。在产品重新启动后,Kafka仍然保证,Kafka仍然保证该产品的重新启动。他们发送消息的精确处理。
设置交易型产品的方法也非常简单。满足两个要求:
1.像电源的力量一样,打开enable.idempotence = true。
2.设置产品参数Transactional.ID.T,最好为其设置有意义的名称。
Kafkaproducer提供了与交易有关的5种方法:
void Initransactions():初始化的交易需要在结构期间配置事务ID,否则您将丢弃IllegalStateException void begintraction():打开事务void sendoffsetStototransactions(地图)
请注意,初始化时,您需要将其设置为自动提交消费者位移。
交易-Type产品代码可以确保消息将消息作为交易提交给Kafka,或者全部已成功提交或全部失败。可以说,消费者仍然会看到这些消息。因此,在消费者上,交易产品发送的消息需要一些更改。修改也很简单,设置了隔离的值。级别参数。交易隔离,当前参数有两个值:
1. READ_UNCOMMITTENT:这是默认值,表明消费者可以阅读Kafka写的任何新闻。无论交易产品提交交易或交易终止,都可以读取书面消息。明显地,如果您使用交易产品,则相应的消费者不应使用此值。
2. read_commited:这表明消费者仅读取交易生产商成功地提交交易写作的信息。当然,它还可以看到非交易生产者写的所有新闻。
3.无论是生产商还是交易生产商,它都可能发送重复的新闻,并且有一组机制可以依靠经纪人终端的SEQ编号机制。这不是经纪人制作的
4.权力和平等的俯卧物和交易产品是卡夫卡社区提供的工具,可为Kafka提供精确的一个时间处理语义,但是它们的角色范围是不同的。
5. Proncer只能确保单个分区的性力和单个会话的信息;交易可以确保横截面和交叉探索的力量。从传递语义的视角中,它自然是交易产品。
6.与功率的功率相比,交易产品的性能更糟。在实际使用过程中,我们需要仔细评估交易交易的费用。
7.对于消费者方面,由于提交了偏移和消息处理顺序,它仍可能导致反复消耗或消息消耗丢失。实现偏移提交和消息消耗交易处理
8. Kafka的交易不仅支持交叉聊天,还支持横向交叉,即支持同时编写多个主题
两者之间的关系
诸如权力之类的生产者是卡夫卡事务的必要条件,也就是说:
为了打开诸如权力之类的权力,不必开始交易;
开始Kafka交易,您必须打开权力和其他生产商;
原始:https://juejin.cn/post/7102415178322411556