【发布时间】:2020-06-03 03:40:17
【问题描述】:
我们计划使用 JMS 源连接器将数据流式传输到我们的 Kafka 集群。 ActiveMQ 的数据是 XML 格式的。 JMS Source Connector 使用内部 messageID (Message.getJMSMessageID()) 作为键。
作为键的字段 - 在连接器流向的 Kafka 主题上 - 需要从 (XML) 有效负载中检索。
要实现这一点,在连接器中需要几个步骤。
- 要将 XML 转换为内部 Kafka Connect 结构,我们使用自定义转换插件 (https://github.com/jcustenborder/kafka-connect-transform-xml)
- 然后 ValueToKey 和 ExtractField 转换器设置作为有效负载一部分的密钥。
- 现在此键值对已准备好发送到我们的 Kafka 主题。
我们正在处理金融交易,需要保证消息的顺序。 我们有很高的吞吐量,据我了解,配置 tasks.max 允许通过在 Kafka Connect Worker 之间分配任务来实现并行性。
第一个问题:并行性如何与单个消息转换器结合使用? '(Source)Connector - Transformer - Converter' 是否形成一个通过设置 tasks.max 一起分布的管道,或者 tasks.max 设置是否仅适用于连接器?
后者似乎有点奇怪,所以假设前者是正确的,我还有一个疑问。
我们的 Kafka 主题键 - 将保证 Kafka 主题的顺序 - 在连接器的任务中确定。选择 tasks.max > 1 传入的消息分布在正在运行的任务中。
分布在多个任务之间,两条(或更多)消息(在有效负载中包含相同的密钥)以特定顺序从 ActiveMQ 到达,并且可以发送到不同的 Kafka Connect 任务。
理论上,当最终流式传输到 Kafka 主题时,顺序可以颠倒(在同一个分区上,因为它们现在具有相同的键)。
我这样推理是否正确,是否有办法规避这种情况?或者仅在此用例中仅使用一项任务才有可能获得订购保证。
【问题讨论】:
标签: apache-kafka apache-kafka-connect