如何在 Flink 流中处理来自一个 Kafka 主题的键控事件和批处理事件

问题描述 投票:0回答:1

我正在尝试编写一个 Flink 作业来处理来自单个 Kafka 主题的事件。事件流包含键控事件和批处理事件。键控事件代表事务并具有键 transactionId。这些事件被转换为插入/更新/删除逻辑,但是批处理事件没有事务键,而是由业务条件描述,业务条件转换为与根据条件连接的所有计算事务的最新状态的连接。事件按照主题中的正确顺序出现。

upsert
- 按 transactionid 更新插入
delete
- 通过 transactionid 删除
paid
- 将列表支付状态中代理的所有交易更改为 true
reverse
- 将付款状态列表中代理的所有交易更改为 false
publish
- 更改带有batchid的所有交易是publish true

事件_id 事件类型 event_ts 交易ID batch_id 已发布 付款[(代理人,付款状态)] 代理
1
upsert
2024-01-02 16:14:02 436 1 [(1,假),(2,真)]
2
upsert
2024-01-02 16:14:04 437 1 [(3,假),(4,假)]
3
upsert
2024-01-02 16:14:05 436 1 [(1,真),(2,假)]
4
paid
2024-01-02 16:14:10 [3]
5
reverse
2024-01-02 16:14:15 [3]
6
publish
2024-01-02 16:14:20 1
apache-flink flink-streaming
1个回答
0
投票
  1. 通过带有侧输出的 ProcessFunction 将流拆分为事务事件与批处理事件。
  2. 使用
    .keyBy(transaction id)
    键入交易事件流。
  3. 将批处理事件流变成广播流。
  4. 将广播流连接到键控流。
  5. 创建一个自定义
    KeyedBroadcastProcessFunction
    来实现所需的逻辑,包括在收到发布事件时生成结果以及清除与batchId匹配的事务事件的状态。

有关如何以这种方式使用广播流的详细信息,请参阅 https://nightlies.apache.org/flink/flink-docs-master/docs/dev/datastream/fault-tolerance/broadcast_state/

© www.soinside.com 2019 - 2024. All rights reserved.