NodeJS操作Kafka

本文介绍了在Windows环境中配置Java后,如何下载安装Kafka,启动Zookeeper和Kafka服务。接着,通过命令行创建和测试Kafka的生产者和消费者,以及使用Node.js的kafkajs库实现消息的生产和消费。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文将会介绍在windows环境下启动Kafka,并通过nodejs作为客户端,生产并消费消息。

第一步,Kafka需要java运行时,先安装配置java环境。通过在命令行中输入java -version确认java是否成功安装(可能需要查看windows的环境变量中是否有java)。

第二步Kafka官网下载最新版本的压缩包(.tgz格式),并解压。分别在两个命令行里面启动zookeeper、kafka(解压缩路径下)

bin\windows\zookeeper-server-start.bat config\zookeeper.properties

bin\windows\kafka-server-start.bat config\server.properties

说明一下zookeeper和kafka的关系:zookeeper是集群的调度者,kafka才是消息队列。 zookeeper的默认端口:2181,kafka的默认端口:9092
相关配置可以在config文件下的server.properties和zookeeper.properties中找到

消费者客户端需要的group.id可以在config->consumer.properties中找到。

第三步,使用命令行测试生产、消费
//创建一个topic:test
bin\windows\kafka-topics.bat --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test

//查看topic
bin\windows\kafka-topics.bat --list --zookeeper localhost:2181

//创建生产者
bin\windows\kafka-console-producer.bat --broker-list localhost:9092 --topic test

//创建消费者
bin\windows\kafka-console-consumer.bat --bootstrap-server localhost:9092 --topic test --from-beginning

第四步,发送消息
在生产者窗口,随意输入一条消息,可以在消费者窗口看到该消息。

最后,使用nodejs访问kafka
npm init -y
npm install kafkajs

新建demo.js,输入以下代码

const { Kafka } = require('kafkajs')

const kafka = new Kafka({

  clientId: 'my-app',

  brokers: ['localhost:9092']

})

const producer = kafka.producer()

const consumer = kafka.consumer({ groupId: 'test-consumer-group' })

const run = async () => {

  // Producing

  await producer.connect()

  await producer.send({

    topic: 'test-topic',

    messages: [

      { value: 'Hello KafkaJS user!' },

    ],

  })

  // Consuming

  await consumer.connect()

  await consumer.subscribe({ topic: 'test-topic', fromBeginning: true })

  await consumer.run({

    eachMessage: async ({ topic, partition, message }) => {

      console.log({

        partition,

        offset: message.offset,

        value: message.value.toString(),

      })

    },

  })

}

run().catch(console.error)

最后执行命令
node demo.js

原文链接 https://www.cnblogs.com/Andy1982/p/15211652.html

<think>嗯,用户问的是如何在Node.js中开启Kafka的幂等性。我需要先回忆一下Kafka幂等性的基本概念。幂等性主要用来避免生产者重复发送消息,确保即使多次发送相同的消息,Broker也只会持久化一次。这对于数据一致性很重要。 接下来,得考虑在Node.js中使用的客户端库。常见的库有kafka-node、node-rdkafka等。不同的库可能有不同的配置方式。假设用户用的是kafka-node或者node-rdkafka,我需要分别说明或者指出通用的配置方法。 Kafka生产者开启幂等性需要设置几个参数:enable.idempotence要设为true,同时可能需要配合acks=all和max.in.flight.requests.per.connection=1。不过,根据Kafka的文档,当启用幂等性时,实际上max.in.flight.requests可以设置为5以内,因为Broker会正确处理顺序。这点需要确认,避免给出错误的信息。 然后,具体到Node.js代码中,可能需要通过配置对象来设置这些参数。比如,在node-rdkafka中,配置可能是'enable.idempotence': true,同时设置'acks'为'all'。但不同库的参数名称可能略有不同,需要查证。例如,kafka-node是否支持这些配置项呢?可能需要提醒用户查阅具体库的文档,因为不同库的实现可能有差异。 另外,开启幂等性是否需要Broker端的配置?Kafka从0.11版本开始支持幂等性,所以需要确保Broker版本符合要求。同时,生产者的transactional.id是否需要设置?如果用户只是开启幂等性而不使用事务,可能不需要设置transactional.id。但如果是需要事务支持,那可能需要同时配置。 用户可能遇到的问题包括:配置参数是否正确,库是否支持,版本是否兼容等。需要提醒用户检查这些方面。比如,node-rdkafka可能对较新的Kafka特性支持更好,而kafka-node可能更新较慢,可能存在不支持的情况。 此外,代码示例会有帮助。比如,给出一个使用node-rdkafka的示例,展示如何配置生产者参数。同时,指出需要注意的地方,如确保Broker版本、参数的正确性等。 总结步骤应该是:1. 确认Kafka版本;2. 选择支持幂等性的客户端库;3. 配置生产者参数;4. 处理可能的错误和兼容性问题。需要分步骤说明,结构清晰,便于用户跟随操作。</think>在 Node.js 中为 Kafka 生产者开启幂等性,需通过客户端配置实现。以下是技术实现的关键步骤和原理说明: --- ### 一、Kafka 幂等性核心概念 - **作用**:确保生产者发送消息的 **Exactly-Once** 语义(同一消息仅被 Broker 记录一次) - **原理**:通过序列号(Sequence Number)和生产者ID(Producer ID)实现消息去重 - **前置条件**:要求 Kafka Broker 版本 ≥ 0.11,且 Topic 的 `min.insync.replicas` ≥ 1 --- ### 二、Node.js 实现步骤(以常用库 `node-rdkafka` 为例) #### 1. 安装依赖 ```bash npm install node-rdkafka ``` #### 2. 生产者配置示例 ```javascript const Kafka = require('node-rdkafka'); const producer = new Kafka.Producer({ 'metadata.broker.list': 'localhost:9092', 'dr_cb': true, // 启用交付报告回调 'enable.idempotence': true, // 开启幂等性 'acks': 'all', // 必须设置为 all 'max.in.flight.requests': 5 // 必须 ≤ 5(Kafka 协议限制) }); // 连接错误处理 producer.on('event.error', (err) => { console.error('Producer Error:', err); }); // 连接成功 producer.on('ready', () => { producer.produce('test-topic', null, Buffer.from('message'), null, Date.now()); }); producer.connect(); ``` --- ### 三、关键配置说明 | 参数 | 值 | 作用 | |------|----|-----| | `enable.idempotence` | `true` | 强制开启幂等性 | | `acks` | `all` | 确保所有ISR副本确认写入 | | `max.in.flight.requests` | ≤5 | 控制未确认请求数 | | `retries` | 自动设为`MAX_INT` | 自动处理重试逻辑 | --- ### 四、验证与注意事项 1. **Broker 日志检查**:在 Kafka Broker 日志中搜索 `Idempotent producer` 关键字 2. **错误场景测试**: ```javascript // 模拟网络故障后重试 producer.produce(..., (err) => { if (err) { setTimeout(() => retrySend(), 1000); // 观察是否产生重复消息 } }); ``` 3. **限制条件**: - 仅保障单个生产者会话内的幂等性 - 需配合事务(Transactional API)实现跨分区原子性 - 分区数量变更会导致幂等性失效 --- ### 五、常见问题排查 1. **配置冲突错误**: - 现象:`Cannot set max.in.flight.requests to 5 when idempotence is enabled` - 方案:删除显式的 `max.in.flight.requests` 配置(库会自动设置) 2. **版本兼容问题**: - 使用 `kafka-topics.sh --describe` 确认 Broker 版本 - 更新 `node-rdkafka` 到最新版本(建议 ≥ 2.10.1) --- 通过以上配置,Node.js 应用可实现生产级的 Kafka 幂等性保障。建议通过 `kafka-verifiable-producer` 工具进行压力测试验证。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值