消耗多个Kafka主题

时间:2019-11-24 08:33:14

标签: java apache-kafka apache-kafka-streams

我想编写一个Kafka应用程序,该应用程序从主题中使用并将某些内容保存在数据库中。主题由Debezium Kafka connect基于mysql binlog创建。所以我每桌只有一个主题。 这是我从一个主题中使用的代码:

KStream<GenericRecord,mysql.company.tiers.Envelope>[] tierStream = builder.stream("mysql.alopeyk.tiers",
                Consumed.with(TierSerde.getGenericKeySerde(), TierSerde.getEnvelopeSerde()));

从架构的角度来看,我应该为每个表创建一个KStream并并行运行它们。但是表的数量如此之大,拥有这么多线程可能不是最佳选择。

所有表都有一个称为created_at的列(这是一个laravel应用程序),因此我很好奇是否有一种方法可以为提取此公共列的值提供通用Serde。除了表名之外,这是我唯一感兴趣的列。

1 个答案:

答案 0 :(得分:1)

这一切与产生消息的applicatino如何将您的价值序列化(连接器)有关。 如果DeserializerSerdes)可以从不同类型的消息中提取created_at,则可能。

因此,答案是肯定的,但这取决于您的消息值Deserializer

假设序列化后所有消息的格式如下:

  • create_at; name:position; ...
  • create_at; city,country; ...
  • create_at; product_name; ...

在这种情况下,Deserializer只需要将字符放在第一个;之前并将其强制转换为日期,其余的值都可以删除。

示例代码:

public class CustomDeserializer implements Deserializer<Date> {

    @Override
    public Date deserialize(String topic, byte[] data) {
        String strDate = new String(data);
        return new Date(Long.parseLong(strDate.substring(0, strDate.indexOf(";"))));
    }
}