**必须写 Java 代码的典型场景**
**1. 你要“打包票”:要么全成功,要么全失败**
比如你设计一个外卖接单系统,用户下单后需要同时做两件事:
- 往 **订单库** 插入一条新订单
- 往 Kafka 发一条消息通知后厨备餐
这时候如果只插入订单库成功,但通知后厨的消息没发出去,用户付了钱却没饭吃;反过来消息发出去了但订单库没存上,后厨做了饭却找不到订单。
这时候就得用 Java 代码 **显式开启 Kafka 事务**,把这两个操作绑在一起,确保要么都成,要么都回滚。
**2. 你的业务逻辑“奇奇怪怪”**
现成的工具(比如 Kafka Connect、Flink SQL)只能处理标准化的需求。比如:
- 从 Kafka 读到的数据需要先调微信接口查用户实名信息,再发到另一个 Kafka 主题
- 数据要按公司内部加密算法处理后再存储
这种“非主流”操作,就得自己写 Java 代码处理,工具可不会帮你对接微信或者自定义加密。
**3. 要和公司祖传系统打通**
比如公司内部有个用了 10 年的仓储系统,用了一个冷门的二进制协议通信。现在需要把仓储系统的库存变化实时同步到 Kafka。
这种时候现成的 Connector 肯定没有,只能自己用 Java 写个客户端,解析二进制协议再往 Kafka 里丢数据。
**4. 出问题时要“扒到底层”查**
比如线上发现 Kafka 偶尔会丢消息,用现成的客户端工具看不出问题。这时候就得自己写 Java 代码:
- 加详细日志,看是网络超时还是序列化失败
- 调整生产者配置(比如 `retries=5` 多试几次)
- 甚至改 Kafka 客户端的源码(当然这很少见)
**5. 做流处理时要“骚操作”**
虽然 Flink SQL 能处理很多场景,但遇到这些情况还得写代码:
- 统计用户连续登录 7 天的复杂事件(比如用 Flink 的 `ProcessFunction`)
- 对接刷脸支付设备,每识别到一张脸就触发消息发送
- 处理数据时要查 Redis 里的历史记录做比对
**不用写 Java 的场景举例**
**场景 1:单纯搬数据**
把 MySQL 数据同步到 Kafka,或者把 Kafka 数据导到 Elasticsearch。直接用 Kafka Connect 配置几个文件就能搞定,就像搭积木。
**场景 2:简单统计**
统计每分钟的订单量、计算销售额排行榜。用 Flink SQL 写个 `SELECT COUNT(*) FROM orders GROUP BY TUMBLE(rowtime, INTERVAL '1' MINUTE)` 就能解决。
**场景 3:走标准化流程**
比如用户注册后发欢迎邮件,用现成的消息队列模板配置就行,不需要自己造轮子。
**通俗总结**
就像装修房子:
- **买精装房**:直接用 Kafka Connect/Flink SQL,省事但没法改结构
- **自己敲代码**:相当于毛坯房自己设计,能搞智能家居、隐藏式灯光,但累秃头
所以当你要搞“特殊需求”、和“老古董”系统对接、或者出问题要深究时,Java 代码就是那把电钻,不自己上手真不行。