事件驱动架构让微服务之间通过事件进行异步通信,实现松耦合和高度可扩展的系统。每个服务只关心自己领域的事件,不直接依赖其他服务。本文介绍事件驱动架构的核心模式和实战经验。
事件定义与设计
事件是已经发生的事实,命名使用过去时态:OrderCreated、PaymentProcessed、InventoryUpdated。事件包含事件ID、事件类型、事件时间、业务标识符和业务数据。事件数据不应该包含敏感信息。事件版本管理:字段只增不减,新增字段使用optional类型。老版本消费者忽略新字段。事件Schema注册表统一管理所有事件类型的定义。
事件总线实现
事件总线是事件的路由层,负责事件的发布和订阅。实现选型:Kafka适合高吞吐事件流,事件持久化可重放。RabbitMQ适合可靠的消息路由,支持灵活的路由规则。Redis Pub/Sub轻量级但消息不持久。在事件总线之上可以构建事件编排引擎,根据事件触发后续操作流。事件总线的容量规划很重要,需要能应对峰值事件量的写入。
CQRS读写分离
CQRS将命令(写操作)和查询(读操作)分离到不同的服务或数据存储。命令服务处理业务逻辑产生事件,查询服务消费事件构建读模型。读模型可以针对查询需求优化数据结构,如使用Elasticsearch或Redis。CQRS的优势:读写负载分离独立扩展,查询性能优化不受写逻辑制约。代价是最终一致性,写入后立即查询可能查不到最新数据。
Saga事务管理
跨服务的分布式事务用Saga模式实现。事务编排Choreography:每个服务执行本地事务并发布事件,后续服务监听事件执行自己的逻辑。事务编排Orchestration:一个编排器服务协调各个参与者的执行顺序。Saga的补偿机制:任一服务失败时,执行前面服务的补偿操作回滚。补偿操作的实现比正向逻辑复杂,需要保证补偿的幂等性和可靠性。