事件驱动架构 101:使用 Kafka 构建简单应用 - 作者 Gopi Gugan
Source: Dev.to
什么是 Kafka(通俗易懂)?
Apache Kafka 是一个分布式 事件流平台,用于:
- 发布事件(生产者)
- 持久存储事件(主题)
- 消费事件(消费者)
与服务直接相互调用不同,它们将事件发送到 Kafka。其他服务在准备好时 异步 地响应这些事件。
可以把 Kafka 看作是一个 高度可靠、可扩展的事件日志。
何时应该使用 Kafka?
Kafka 是一个强有力的选择,当你需要:
- 服务之间的异步通信
- 高吞吐量的数据管道
- 实时处理
- 解耦的微服务
如果出现以下情况,你可能 不需要 Kafka:
- 你只有一个服务
- 你依赖简单的请求/响应 API
- 你的规模小且可预测
Kafka 功能强大——但不必要的复杂性仍然是复杂性。
高层架构
在高层次上,Kafka 的工作方式如下:
- 生产者将事件发送到主题。
- Kafka 持久存储该事件。
- 一个或多个消费者以自己的节奏读取该事件。
这消除了紧耦合,并防止了服务之间的级联故障。
第一步:使用 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。