【问题标题】:Kafka Producer design - multiple topicsKafka Producer 设计 - 多个主题
【发布时间】:2021-09-19 18:35:03
【问题描述】:

我正在尝试实现 Kafka 生产者/消费者模型,并且正在考虑是否为每个主题创建单独的发布者线程优于让单个发布者处理多个主题。任何帮助将不胜感激

PS:我是 Kafka 的新手

【问题讨论】:

    标签: apache-kafka


    【解决方案1】:

    单独的发布者线程,我认为你的意思是单独的生产者对象。如果是这样..

    由于消息在 Kafka 中存储为键值对,因此不同的主题可以具有不同的键值类型。 因此,如果您的 Kafka 主题具有不同的键值类型,例如......

    Topic1 - key:String, value:Student
    Topic2 - key:Long, value:Teacher
    

    等等,那么你应该使用多个生产者。这是因为 KafkaProducer 类在构造对象时要求您提供键和值序列化程序。

    Properties props=new Properties();
    props.put("key.serializer",StringSerializer.class);
    props.put("value.serializer",LongSerializer.class);
    KafkaProducer<String,Long> producer=new KafkaProducer<>(props);
    

    不过,您也可以为所有类型编写通用序列化程序! 但是,最好事先了解我们对生产者的操作。

    【讨论】:

      【解决方案2】:

      出于显而易见的原因,我更喜欢 Keep It Stupid Simple (KISS) 方法 - 一个制作人/多个制作人 - 一个主题。

      来自维基百科,

      KISS 原则指出,大多数系统如果保持简单而不是复杂化,则效果最好;因此,简单性应该是设计的关键目标,应该避免不必要的复杂性。

      谈论一个制作人支持多个主题的可能性,这也远非事实。

      【讨论】:

        【解决方案3】:

        从 2.5 版开始,您可以使用 RoutingKafkaTemplate 在运行时根据目标主题名称选择生产者。 https://docs.spring.io/spring-kafka/reference/html/#routing-template 单个 Publisher 可以处理多个 Topics,您可以根据 Topic 需求自定义 Producer Config

        【讨论】:

          【解决方案4】:

          我认为最好为每个主题设置一个单独的线程,因为由于某些原因,如果特定生产者关闭,那么受尊重的主题将受到影响,并且所有主题都将顺利运行而不会出现任何问题。

          如果我们为所有主题创建一个发布者,那么如果发布者由于某些原因关闭,那么所有主题都会受到影响。

          【讨论】:

            猜你喜欢
            • 2019-04-23
            • 2017-04-03
            • 1970-01-01
            • 2020-01-10
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-10-27
            • 2019-10-04
            相关资源
            最近更新 更多