我正在尝试实现 Kafka 生产者/消费者模型,并且正在考虑是否为每个主题创建单独的发布者线程优于让单个发布者处理多个主题。任何帮助将不胜感激
PS:我是卡夫卡新手
通过单独的发布者线程,我认为你的意思是单独的生产者对象。如果是的话..
由于消息在 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);
不过,您也可以为所有类型编写一个通用序列化器!但是,最好事先知道我们正在与生产者一起做什么。
出于显而易见的原因,我更喜欢保持愚蠢简单(KISS)方法 - 一个制作人/多个制作人 - 一个主题。
来自维基百科,
KISS 原则指出,大多数系统如果保持简单而不是变得复杂,则效果最佳;因此,简单性应该是设计的关键目标,并且应该避免不必要的复杂性。
谈论一个制作人支持多个主题的可能性,这也远非事实。
从版本 2.5 开始,您可以使用 RoutingKafkaTemplate 根据目标主题名称在运行时选择生产者。 https://docs.spring.io/spring-kafka/reference/html/#routing-template 单个发布者可以处理多个主题,您可以根据主题需求自定义生产者配置
在决定是为每个主题创建单独的发布者线程还是让单个发布者处理 Kafka 中的多个主题时,需要考虑以下几个因素:
吞吐量和性能:
单独的发布者线程:这种方法可能会增加吞吐量,因为每个线程都可以独立处理对其各自主题的发布。如果您的消息速率很高并且需要最大限度地提高性能,这可能会很有帮助。
单个发布者:使用单个发布者管理多个主题可以简化设计并减少资源使用。然而,如果消息速率很高,它可能会成为瓶颈。
资源管理:
单独的发布者线程:更多线程意味着更多资源消耗(CPU、内存)。这可能会导致管理这些资源的复杂性增加。
单一发布者:由于线程较少,因此更容易管理资源。这在资源有限的环境中可以更加有效。
复杂性:
单独的发布者线程:增加应用程序的复杂性。您需要管理多个线程、处理同步并确保线程安全。
单一发布者:设计更简单,更易于维护。您只需要管理一个线程,这可以减少出现错误和同步问题的可能性。
容错性和可靠性:
独立的发布者线程:如果一个线程失败,只会影响它负责的主题。其他主题可以继续发布而不会中断。
单个发布者:如果单个发布者线程失败,可能会影响正在发布的所有主题。这可以通过适当的错误处理和重试机制来缓解。
推荐 对于初学者来说,从处理多个主题的单个发布者开始可能更容易实施和管理。随着您获得更多经验并且遇到性能瓶颈,您可以考虑迁移到每个主题具有单独发布者线程的模型。
我认为每个主题都有一个单独的线程是首选,因为由于某些原因,如果特定的生产者宕机,那么受人尊敬的主题将受到影响,而其余的所有主题将顺利运行,没有任何问题。
如果我们为所有主题创建一个发布者,那么如果发布者由于某种原因关闭,那么所有主题都会受到影响。