Kafka Consumer架构设计:java plugin or external client

Kafka Consumer architecture design: java plugin or external client

我正在为 kafka 集群的数据消费者编写一个解决方案(使用 docker for kafka),但我仍然必须决定如何编写它:

  1. Kafka 是用母语开发的:java,其中官方网站和git repo 提供了示例,https://github.com/apache/kafka/tree/trunk/examples/src/main/java/kafka/examples
  2. 在以另一种语言提供的另一个客户端中,https://cwiki.apache.org/confluence/display/KAFKA/Clients,例如Node.js

关键是我知道如何用两种语言编写解决方案,但我必须决定必须考虑哪一种:

这是一个 ubuntu 服务器,在一个完整的 dockerized 环境中,我使用 Node.js 作为 web 服务和连接模块的核心语言。我仍然没有调整 kafka 客户端,而是使用默认选项:

Java(使用 KafkaConsumer)

import org.apache.kafka.clients.consumer.KafkaConsumer;
... 
props = ...
KafkaConsumer consumer = new KafkaConsumer<>(props);

Node.js(使用 kafka-node npm 库)

var kafka = require('kafka-node');
...
client = ....
var consumer = new kafka.Consumer( client, [{ topic: 'topicVehicle' }], { autoCommit: true });

我不得不处理各种语言(java,nodejs...可能python)在各个层维护代码的问题,我想知道哪个更合适解决方案。

我认为您不想将 Kafka 消费者创建为 Kafka 插件,原因如下:

  • 主要原因:创建独立的消费者允许您根据负载根据需要扩展和缩减它,通过为同一消费者组添加或删除消费者实例,让 Kafka 重新分配可用分区以在其中进行处理那些消费者实例

其他原因:

  • 插件通常会扩展您为其编写插件的功能 - 在这种情况下为 Kafka
  • Kafka 作为分布式消息系统的最大优势在于,您可以拥有许多独立的消费者,每个消费者都做自己的事情,根据需要来来去去
  • 这些消费者的创建和部署不应与 Kafka(或其插件)的部署相结合 - 您应该能够 add/remove 消费者而不依赖于 Kafka 本身

现在,如果您正在开发某种新型的连接器或其他真正打算更像 framework/tool 供其他 consumers/producers 使用的消费者 - 这样做是有意义的将其开发为 Kafka 的插件