事件驱动架构实战:构建高可用分布式系统
事件驱动架构(EDA)通过事件进行服务间通信。本文讲解 EDA 核心概念和实战模式。
🚀 核心概念
- 事件(Event):系统中发生的有意义的事情
- 事件生产者(Producer):发布事件的服务
- 事件消费者(Consumer):订阅事件的服务
- 事件总线(Event Bus):事件传输通道
📊 常见模式
1. 事件通知(Event Notification)
// 订单服务发布事件
eventBus.publish('order.created', {
orderId: 123,
userId: 456,
total: 99.99
})
// 库存服务订阅事件
eventBus.subscribe('order.created', (event) => {
reduceInventory(event.orderId)
})
2. 事件溯源(Event Sourcing)
存储事件而非状态,通过重放事件恢复状态。
3. CQRS(命令查询职责分离)
写模型和读模型分离,提高性能和可扩展性。
🛠️ 技术选型
| 消息队列 | 特点 | 适用场景 |
|---|---|---|
| Kafka | 高吞吐、持久化 | 大数据、日志 |
| RabbitMQ | 灵活路由 | 复杂路由 |
| Redis Streams | 轻量 | 简单场景 |
| AWS SQS | 托管服务 | 云原生 |
⚡ Kafka 实战
const { Kafka } = require('kafkajs')
const kafka = new Kafka({ brokers: ['localhost:9092'] })
const producer = kafka.producer()
const consumer = kafka.consumer({ groupId: 'test-group' })
// 生产消息
await producer.send({
topic: 'orders',
messages: [{ value: JSON.stringify({ id: 123, status: 'created' }) }]
})
// 消费消息
await consumer.subscribe({ topic: 'orders' })
await consumer.run({
eachMessage: async ({ message }) => {
console.log(JSON.parse(message.value))
}
})
✅ 最佳实践
- 事件幂等性(避免重复处理)
- 事件顺序保证(相同 key 路由到同一分区)
- 死信队列(处理失败消息)
- 事件版本控制(向后兼容)
- 监控和告警(消费延迟、错误率)
总结:事件驱动架构适合松耦合、高可用的分布式系统。掌握核心模式和最佳实践,能构建出弹性可扩展的系统。
本文整理自事件驱动架构设计模式和 Kafka 实战指南