Closed
Description
I ran a test sending and receiving 1000 messages individually (no batching) using the KafkaJS library, and then ran the same test using the Confluent library (following the migration instructions).
KafkaJS: 455ms
Confluent: 501951ms
That's not a typo. In this case, the Confluent test took 1000x time to complete.
I'm presuming there is some tuning that can be done via configuration; but this was an "out of the box" conversion, and my attempts at "tuning" the configuration did not yield any noticeable differences.
Notes
- Topic already exists and is empty at start of test.
- Run on an M3 Mac, with local docker-hosted Kafka (confluentinc/cp-kafka:7.6.0)
KafkaJS
import {Kafka} from "kafkajs";
const topic = "test-kafkajs-topic";
const total = 1000;
const start = Date.now();
let sentCount = 0;
let receivedCount = 0;
const kafka = new Kafka({brokers: ["localhost:9092"]});
const consumer = kafka.consumer({groupId: `${topic}-group`});
await consumer.connect();
await consumer.subscribe({topic});
await consumer.run({
eachMessage: async ({message}) => {
receivedCount++;
if (receivedCount % 100 === 0) {
log.info(`Rec'd ${String(receivedCount).padStart(4, " ")} : ${Date.now() - start}ms`);
}
}
});
const producer = kafka.producer();
await producer.connect();
for (let i = 0; i < total; i++) {
await producer.send({
topic,
messages: [{value: "one"}]
});
if (++sentCount % 100 === 0) {
log.info(`Sent ${String(sentCount).padStart(4, " ")} : ${Date.now() - start}ms`);
}
}
await until(async () => receivedCount == total, {timeout: 5000});
await producer.disconnect();
await consumer.disconnect();
Sent 100 : 133ms
Rec'd 100 : 133ms
Sent 200 : 163ms
Rec'd 200 : 163ms
Sent 300 : 193ms
Rec'd 300 : 193ms
Sent 400 : 229ms
Rec'd 400 : 229ms
Sent 500 : 271ms
Rec'd 500 : 271ms
Sent 600 : 331ms
Rec'd 600 : 332ms
Sent 700 : 371ms
Rec'd 700 : 371ms
Sent 800 : 398ms
Rec'd 800 : 399ms
Sent 900 : 427ms
Rec'd 900 : 428ms
Sent 1000 : 454ms
Rec'd 1000 : 455ms
Confluent
import {KafkaJS as Confluent} from "@confluentinc/kafka-javascript";
const topic = "test-confluent-topic";
const total = 1000;
const start = Date.now();
let sentCount = 0;
let receivedCount = 0;
const kafka = new Confluent.Kafka({kafkaJS: {brokers: ["localhost:9092"]}});
const consumer = kafka.consumer({kafkaJS: {groupId: `${topic}-group`}});
await consumer.connect();
await consumer.subscribe({topic});
await consumer.run({
eachMessage: async ({message}) => {
receivedCount++;
if (receivedCount % 100 === 0) {
log.info(`Rec'd ${String(receivedCount).padStart(4, " ")} : ${Date.now() - start}ms`);
}
}
});
const producer = kafka.producer();
await producer.connect();
for (let i = 0; i < total; i++) {
await producer.send({
topic,
messages: [{value: "one"}]
});
if (++sentCount % 100 === 0) {
log.info(`Sent ${String(sentCount).padStart(4, " ")} : ${Date.now() - start}ms`);
}
}
await until(async () => receivedCount == total, {timeout: 5000});
await producer.disconnect();
await consumer.disconnect();
Sent 100 : 50630ms
Rec'd 100 : 63159ms
Sent 200 : 100720ms
Rec'd 200 : 127273ms
Sent 300 : 150805ms
Rec'd 300 : 191382ms
Sent 400 : 200890ms
Sent 500 : 250985ms
Rec'd 400 : 255503ms
Rec'd 500 : 255504ms
Sent 600 : 301079ms
Sent 700 : 351164ms
Rec'd 600 : 383739ms
Rec'd 700 : 383740ms
Sent 800 : 401253ms
Sent 900 : 451346ms
Sent 1000 : 501434ms
Rec'd 800 : 501949ms
Rec'd 900 : 501950ms
Rec'd 1000 : 501951ms