在Nodejs中使用kafka(一)安装使用

安装

方法一、使用docker-compose安装

1、创建docker-compose.yml文件。

bash 复制代码
services:
  zookeeper:
    image: docker.io/bitnami/zookeeper:3.9
    ports:
      - "2181:2181"
    volumes:
      - "./data/zookeeper:/bitnami"
    environment:
      - ALLOW_ANONYMOUS_LOGIN=yes
  kafka:
    image: docker.io/bitnami/kafka:3.4
    ports:
      - "9092:9092"
    volumes:
      - "./data/kafka:/bitnami"
    environment:
      - KAFKA_CFG_ZOOKEEPER_CONNECT=zookeeper:2181
      - KAFKA_CFG_LISTENERS=PLAINTEXT://:9092
      - KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://localhost:9092  # 关键配置
      - KAFKA_CFG_AUTO_CREATE_TOPICS_ENABLE=true
    depends_on:
      - zookeeper

volumes:
  zookeeper_data:
    driver: local
  kafka_data:
    driver: local

2、在文件所在位置运行下面命令

bash 复制代码
docker compose up -d

方法二、

直接下载kafka,zookeeper。(注:CentOS环境 )

java安装:yum install java-17-openjdk-devel

kafka下载地址:Apache Kafka

zookeeper下载地址:Apache ZooKeeper

下载好后选择路径直接解压即可。

Kafka 的核心功能

1.消息队列:Kafka 最初被设计为一个高吞吐量、分布式的消息队列系统,用于处理大规模的消息流。

2.持久化:Kafka 不仅仅是一个消息队列,它还提供消息的持久化功能,数据存储在磁盘中,这使得 Kafka 适合用于长期的数据存储和分析。

3.高吞吐量和低延迟:Kafka 设计上非常注重高吞吐量和低延迟,支持每秒钟处理百万级别的消息。

4.分布式系统:Kafka 是一个分布式系统,能够跨多台机器进行水平扩展,支持高可用性和容错。

5.流处理:除了消息传递,Kafka 还提供了流处理 API(例如 Kafka Streams),使得用户能够在消息流中进行实时计算和分析。

Kafka 的核心组件

1.Producer(生产者)

  • Producer 是负责将消息发送到 Kafka 的客户端应用程序。
  • 生产者将消息发布到 Kafka 的特定 Topic(主题)中。
  • 生产者可以选择将消息发布到一个或多个 Kafka 分区中。

2.Consumer(消费者)

  • Consumer 是从 Kafka 中读取消息的客户端应用程序。
  • 消费者订阅一个或多个 Topic,并从中读取消息。
  • Kafka 支持消费者组机制,消费者组中的多个消费者可以共同消费一个主题的消息,达到负载均衡和容错的效果。

3.Broker(代理)

  • Kafka Broker 是 Kafka 集群中的一个节点,负责存储消息并处理生产者和消费者的请求。
  • Kafka 集群通常由多个 Broker 组成,每个 Broker 负责存储特定的分区数据。
  • Kafka 的分布式架构保证了可扩展性和高可用性,所有的消息都会在多个 Broker 之间进行分布和复制。

4.Topic(主题)

  • Topic 是 Kafka 中的消息分类,用来组织消息。
  • 每个 Topic 可以有多个 Partition(分区),消息被写入到分区中,分区内的消息是有序的。
  • Kafka 支持将一个 Topic 的消息分布到多个分区中,允许高并发的生产者和消费者。

5.Partition(分区)

  • Partition 是 Topic 的实际存储单位,一个 Topic 可以有多个 Partition,每个 Partition 作为一个日志文件进行存储。
  • 分区保证了消息的顺序性,即同一个分区内的消息是有序的。
  • 分区的数量可以通过配置来控制,多个分区能够提供水平扩展和并行处理能力。

7. Zookeeper(协调者)(对于传统 Kafka 集群来说)

  • Zookeeper 是 Kafka 中的一个分布式协调组件,用于管理集群的元数据(如 Broker 的信息、Topic 和 Partition 的分配等)。
  • Zookeeper 保证 Kafka 集群中的 Broker 之间的协调和一致性。
  • 从 Kafka 2.8.0 开始,Kafka 引入了 KRaft 模式,它在未来版本中逐步摆脱了对 Zookeeper 的依赖,转而使用内置的 Raft 协议进行集群管理。

kafka基本命令

在解压的kafka根文件夹下运行

1、启动zookeeper

bash 复制代码
nohup bin/zookeeper-server-start.sh config/zookeeper.properties &

2、启动kafka

bash 复制代码
nohup bin/kafka-server-start.sh config/server.properties &

3、 查看kafka,zookeeper启动进程

bash 复制代码
jps

4、 创建topic

bash 复制代码
bin/kafka-topics.sh --create --topic test --bootstrap-server localhost:9092

5、 删除topic

bash 复制代码
bin/kafka-topics.sh --delete --topic test --bootstrap-server localhost:9092

6、查看topic详情

bash 复制代码
bin/kafka-topics.sh --describe --topic test --bootstrap-server localhost:9092

7、查看创建的所有topic

bash 复制代码
bin/kafka-topics.sh --bootstrap-server localhost:9092 --list

8、运行生产者

bash 复制代码
bin/kafka-console-producer.sh --bootstrap-server localhost:9092 --topic test

9、消费者(默认接收实时消息)

bash 复制代码
bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test

10、从最开头开始消费

bash 复制代码
bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --from-beginning

11、指定分区和位置开始消费

bash 复制代码
bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --partition 0 --offset 2

12、创建消费者组,可以指定多个组,多个消费者接收消息

bash 复制代码
bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --group testGroup

13、查看消费者组详情

bash 复制代码
bin/kafka-consumer-groups.sh --bootstrap-server localhost:9092 --describe --group testGroup

示例

kafkajs文档地址:Getting Started · KafkaJS

producer.ts

javascript 复制代码
import { Kafka } from 'kafkajs';


async function run() {
  const kafka = new Kafka({
    clientId: 'test1',
    brokers: ['localhost:9092'],
  });

  const producer = kafka.producer();

  await producer.connect();

  for (let i = 1; i <= 10; ++i) {
    await producer.send({
      topic: 'topic1',
      messages: [
        { value: `hello kafka${i}` },
      ],
    });
  }

  await producer.disconnect();
}

run();

consumer.ts

javascript 复制代码
import { Kafka } from 'kafkajs'


const kafka = new Kafka({
  clientId: 'test1',
  brokers: ['localhost:9092'],
  connectionTimeout: 1000, // 1 秒连接超时
});

const consumer = kafka.consumer({
  groupId: 'group1',
});

await consumer.connect();

await consumer.subscribe({ 
  topic: 'topic1',
  fromBeginning: true, // 从头开始消费
});

await consumer.run({
  eachMessage: async ({ topic, partition, message }) => {
    console.log(message.value?.toString());
  },
});

// consumer.seek({ topic: 'topic1', partition: 0, offset: '2' });
相关推荐
阳仔475几秒前
Mybatis报错
后端
天天摸鱼的java工程师2 分钟前
当我成为面试官,我才知道当年那些面试官其实并不是在难为我,而是在考察我面对问题的拆解能力
前端·后端·面试
编程乐趣4 分钟前
基于.Net5+Vue+iView前后端分离通用权限开源系统,适合初学者
后端
天天摸鱼的java工程师9 分钟前
MyBatis Plus 的实用技巧:从业务场景到代码实现
java·后端·mybatis
满分观察网友z39 分钟前
解锁 Java 的“上帝模式”:我如何用反射和注解,从“测试地狱”走向“一键自动化”
后端
无奈何杨1 小时前
CoolGuard风控节假日完善,QLExpress自定义函数
前端·后端
GDAL1 小时前
Node.js Stream 深入全面讲解
node.js
这里有鱼汤1 小时前
通过AI狂赚苹果26.6%,这套AI金融交易开源Agent彻底火了
后端·agent
寻月隐君1 小时前
【Solana 开发实战】轻松搞定链上 IDL:从上传到获取全解析
后端·web3·github
程序员爱钓鱼1 小时前
Go项目上线部署最佳实践:Docker容器化从入门到进阶
后端·google·go