Flink消费binlog消息丢弃过期的消息

这篇博客探讨了在高并发环境下,Flink消费binlog时遇到的数据延迟问题。通过databus或canal订阅binlog并发送到Kafka,然后用Flink消费,由于生产速度超过消费速度,导致ES数据延迟。提高Flink并发数会引入乱序,可能破坏数据一致性。解决方案是在Flink中使用keyby和状态来丢弃已过期的消息,确保数据正确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一般通过订阅mysql的binlog 异构数据到别的存储,如ES。
大概的流程为通过databus或者canal 这样的组件订阅binlog,发送kafka队列,通过flink消费kafka。因为我们这边业务比较特殊,导致mysql数据的变更有尖刺的情况,在业务高峰期数据变更的QPM为60W/分钟,flink最大的消费能力为20W/分钟,在这种消费速度和生产速度不对等的情况,ES的数据有会10分钟以上的延时。 因此需要提升flink的的并发数,但是当flink的并发数大于kafka partition的数据量时,会有乱序的问题影响数据的一致性。

比如:10分01秒修改id=100这条数据的状态为1,10分02秒修改状态为2,flink并发消费时候不能100%的保证先处理01秒的数据,在处理02秒的消息。如果先处理02秒的数据,最后处理01秒的数据,那就会造成mysql和ES数据不一致的问题,mysql状态为2,ES中状态为1。解决方法就是如果如果先处理的02秒的消息,再收到01秒的消息时直接丢弃即可。

在flink中可以很轻易的实现过期消息的过滤,通过flink keyby方法+ status 即可,代码如下:

package com.ikuboo.learn.flink.datastream;

import org.apache.flink.api.common.functions.RichFilterFunction;
import org.apache.flink.api.common.state.StateTtlConfig;
import org.apache.flink.api.common.state.ValueState;
import org.apache.flink.api.common.state.ValueStateDescriptor;
import org.apache.flink.api.common.time.Time;
import org.apache.flink.api.java.tuple.Tuple;
import org.apache.flink.api.java.tuple.Tuple2;
import org.apache.flink.configuration.Configuration;
import org.apache.flink.streaming.api.datastream
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值