Kafka Consumer架构设计:java plugin or external client
Kafka Consumer architecture design: java plugin or external client
我正在为 kafka 集群的数据消费者编写一个解决方案(使用 docker for kafka),但我仍然必须决定如何编写它:
- Kafka 是用母语开发的:java,其中官方网站和git repo 提供了示例,https://github.com/apache/kafka/tree/trunk/examples/src/main/java/kafka/examples
- 在以另一种语言提供的另一个客户端中,https://cwiki.apache.org/confluence/display/KAFKA/Clients,例如Node.js
关键是我知道如何用两种语言编写解决方案,但我必须决定必须考虑哪一种:
- 真正的性能消耗 kafka 消息而不会造成瓶颈。 (我的第一印象是,使用 Kafka 构建的相同核心语言编写所有内容将减少过载),但我对此不太确定。
- 在解决方案的设计方面(保持语言、代码风格的一致性和可扩展性)。整个 Web 界面、其余服务以及数据持久性在 Node.js 中开发,客户端在 javascript / HTML5.
中
这是一个 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 的插件
我正在为 kafka 集群的数据消费者编写一个解决方案(使用 docker for kafka),但我仍然必须决定如何编写它:
- Kafka 是用母语开发的:java,其中官方网站和git repo 提供了示例,https://github.com/apache/kafka/tree/trunk/examples/src/main/java/kafka/examples
- 在以另一种语言提供的另一个客户端中,https://cwiki.apache.org/confluence/display/KAFKA/Clients,例如Node.js
关键是我知道如何用两种语言编写解决方案,但我必须决定必须考虑哪一种:
- 真正的性能消耗 kafka 消息而不会造成瓶颈。 (我的第一印象是,使用 Kafka 构建的相同核心语言编写所有内容将减少过载),但我对此不太确定。
- 在解决方案的设计方面(保持语言、代码风格的一致性和可扩展性)。整个 Web 界面、其余服务以及数据持久性在 Node.js 中开发,客户端在 javascript / HTML5. 中
这是一个 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 的插件