前言
如果你写过 Spring Boot 项目,你大概率用过 @EventListener 或消息队列。但"用消息队列"和"事件驱动架构"是两回事。事件驱动架构(Event-Driven Architecture, EDA)是一种架构风格,不只是技术选型。
本文带你从"为什么需要事件驱动"开始,理解三种事件模式、Command vs Event 的本质区别,再到实战落地。
第一部分:什么是事件驱动架构
1.1 一个简单的对比
传统请求-响应模式(你每天都在写的):
如果你写过 Spring Boot 项目,你大概率用过 @EventListener 或消息队列。但"用消息队列"和"事件驱动架构"是两回事。事件驱动架构(Event-Driven Architecture, EDA)是一种架构风格,不只是技术选型。
本文带你从"为什么需要事件驱动"开始,理解三种事件模式、Command vs Event 的本质区别,再到实战落地。
传统请求-响应模式(你每天都在写的):
大多数开发者对 Kafka 的理解停留在"发消息、收消息"的层面。但当你遇到消息丢失、消息重复、消息乱序这些生产问题时,才是真正需要深入理解 Kafka 内部机制的时候。
本文从分区机制、ISR、幂等生产者、事务消息到 exactly-once 语义,带你逐层深入 Kafka 的核心原理。
Kafka Topic 被划分为多个 Partition(分区),每个 Partition 是一个有序的、不可变的消息序列。
"用哪个消息队列?"——这是每个架构师都必须回答的问题。答案是:看场景。Kafka 适合大数据,RocketMQ 适合金融交易,RabbitMQ 适合复杂路由,Pulsar 适合多租户。本文帮你建立选型决策框架。
| 特性 | Kafka | RocketMQ | RabbitMQ | Pulsar |
|---|---|---|---|---|
| 开发语言 | Java/Scala | Java | Erlang | Java |
| 所属 | Apache | Apache(阿里) | VMware | Apache |
| 协议 | 自有协议 | 自有协议 | AMQP 0-9-1 | 自有协议 |
| 吞吐量 | ★★★★★ | ★★★★☆ | ★★★☆☆ | ★★★★★ |
| 低延迟 | ★★★☆☆ | ★★★★☆ | ★★★★★ | ★★★★☆ |
| 消息持久化 | ★★★★★ | ★★★★★ | ★★★☆☆ | ★★★★★ |
| 事务消息 | ★★★★☆ | ★★★★★ | ★★★★☆ | ★★★★★ |
| 顺序消息 | ★★★☆☆ | ★★★★★ | ★★★☆☆ | ★★★★☆ |
| 延迟消息 | ☆ | ★★★★★ | ★★★☆☆ | ★★★★☆ |
| 消息回溯 | ★★★★★ | ★★★★★ | ☆ | ★★★★★ |
| 运维复杂度 | ★★★☆☆ | ★★★☆☆ | ★★☆☆☆ | ★★★★☆ |
同时为发布和订阅提供高吞吐量、消息持久化、分布式功能、支持数据并行加载到Hadoop中
实际:
1、发布系统通知:如评论、点赞、关注这些事件发生后,可以把这些操作放入到kafka消息队列中,如果用户量一大直接操作数据库,服务器压力顶不住。所以把这些通知先存入kafka中,然后一个个消费掉。
2、一些项目数据同步问题也可以用到。
3、监测数据:分布式应用程序生成的统计数据集中聚合。
4、分布式:假设有系统B、C、D都需要系统A的数据
5、事件采集:其中状态的变化根据时间的顺序记录下来,kafka支持这种非常大的存储日志数据的场景。
如:日志收集、消息系统、活动追踪、运营指标、流式处理、热点点赞、评论、关注、发短信。
http://kafka.apache.org/quickstart (linux版)
windows版:
首先cmd到kafka的bin下
其中启动内置的zk用:zookeeper-server-start.bat D:\environment\kafka_2.12-2.3.0\config\zookeeper.properties
启动Kafka用:kafka-server-start.bat D:\environment\kafka_2.12-2.3.0\config\server.properties