事件驱动架构 101:使用 Kafka 构建简单应用 - 作者 Gopi Gugan

发布: (2026年1月16日 GMT+8 00:02)
4 min read
原文: Dev.to

Source: Dev.to

什么是 Kafka(通俗易懂)?

Apache Kafka 是一个分布式 事件流平台,用于:

  • 发布事件(生产者)
  • 持久存储事件(主题)
  • 消费事件(消费者)

与服务直接相互调用不同,它们将事件发送到 Kafka。其他服务在准备好时 异步 地响应这些事件。

可以把 Kafka 看作是一个 高度可靠、可扩展的事件日志

何时应该使用 Kafka?

Kafka 是一个强有力的选择,当你需要:

  • 服务之间的异步通信
  • 高吞吐量的数据管道
  • 实时处理
  • 解耦的微服务

如果出现以下情况,你可能 不需要 Kafka

  • 你只有一个服务
  • 你依赖简单的请求/响应 API
  • 你的规模小且可预测

Kafka 功能强大——但不必要的复杂性仍然是复杂性。

高层架构

在高层次上,Kafka 的工作方式如下:

  1. 生产者将事件发送到主题。
  2. Kafka 持久存储该事件。
  3. 一个或多个消费者以自己的节奏读取该事件。

这消除了紧耦合,并防止了服务之间的级联故障。

第一步:使用 Docker 本地运行 Kafka

最快的入门方式是 Docker。

# docker-compose.yml
version: "3"
services:
  zookeeper:
    image: confluentinc/cp-zookeeper
    environment:
      ZOOKEEPER_CLIENT_PORT: 2181

  kafka:
    image: confluentinc/cp-kafka
    ports:
      - "9092:9092"
    environment:
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://localhost:9092
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1

启动 Kafka:

docker compose up -d

现在您已经在本地拥有一个可工作的 Kafka broker。

步骤 2:创建生产者(Node.js)

生产者唯一的职责是发出事件

import { Kafka } from "kafkajs";

const kafka = new Kafka({
  brokers: ["localhost:9092"],
});

const producer = kafka.producer();

async function sendEvent() {
  await producer.connect();

  await producer.send({
    topic: "orders",
    messages: [
      {
        value: JSON.stringify({
          orderId: 123,
          total: 49.99,
        }),
      },
    ],
  });

  await producer.disconnect();
}

sendEvent();

关键要点:生产者不知道谁会消费该事件。

第三步:创建消费者

消费者独立地响应事件。

import { Kafka } from "kafkajs";

const kafka = new Kafka({
  brokers: ["localhost:9092"],
});

const consumer = kafka.consumer({ groupId: "billing-service" });

async function run() {
  await consumer.connect();
  await consumer.subscribe({ topic: "orders" });

  await consumer.run({
    eachMessage: async ({ message }) => {
      const event = JSON.parse(message.value.toString());
      console.log("Processing order:", event.orderId);
    },
  });
}

run();

您现在可以添加额外的服务(运输、分析、通知)而无需更改生产者

为什么事件驱动架构可扩展

传统架构事件驱动架构
紧耦合松耦合
同步调用异步事件
难以扩展横向可扩展
脆弱的故障弹性系统

Kafka 在服务之间充当 shock absorber

常见的 Kafka 错误需避免

  • 把 Kafka 当作队列使用(它是日志)
  • 创建过多细小的主题
  • 忽视模式演进
  • 在可以使用数据库和定时任务更简单的情况下使用 Kafka

Kafka 应该降低复杂性——而不是增加复杂性。

当 Kafka 成为超级力量

Kafka 在与以下组合时真正闪光:

  • Schema Registry(Avro 或 Protobuf)
  • 流处理(Kafka Streams 或 Flink)
  • 实时分析管道
  • 事件驱动的通知

此时,Kafka 成为你系统的 中枢神经系统

Kafka 并不可怕 —— 它只是 一个带规则的持久事件日志。如果你了解:

  • Topics(主题)
  • Producers(生产者)
  • Consumers(消费者)
  • Consumer groups(消费者组)

你已经了解了 大部分 Kafka

Back to Blog

相关文章

阅读更多 »