3. 企业消息中枢需求分析
建设企业消息中枢,最容易犯的错误是先选产品、先搭集群,再回头问“业务到底要什么”。Kafka 的吞吐可以很高,延迟可以很低,可靠性可以做到不丢,但这些能力都要用资源、成本和复杂度去换。需求分析的任务,就是把业务语言翻译成可度量、可验证的技术指标,并明确哪些指标是硬约束、哪些可以折中。
一、从业务场景提取五类需求
消息中枢的需求可以归纳为五个维度:吞吐、延迟、可靠性、顺序性、多租户。它们并非彼此独立,而是相互牵制。例如提高可靠性通常意味着增加副本与确认等待,从而抬高延迟;追求全局顺序会牺牲分区并行度,进而压低吞吐。因此需求分析的核心不是把五项都拉满,而是找到业务真正在意的组合。
识别方法是从场景出发提问。以订单、支付、日志、埋点、IoT 采集五类典型场景为例:订单与支付关心不丢和分区内顺序;日志与埋点关心高吞吐、可容忍少量丢失;IoT 采集关心突发流量与设备级顺序。把每个业务系统按“生产者—主题—消费者”列出,再逐条标注五项指标,就能得到一张需求矩阵。
二、吞吐:先算峰值,再留余量
吞吐需求不能只写“高”,要落到数字。计算方法是:单条消息平均大小 × 峰值 TPS = 峰值字节吞吐。例如某订单系统日均 2000 万条,消息平均 1.2 KB,日峰值集中在 2 小时,则峰值 TPS ≈ 2000万 ÷ 7200 ≈ 2778 条/s,峰值吞吐 ≈ 2778 × 1.2 KB ≈ 3.3 MB/s。若考虑大促放大 5 倍,则需按约 16.7 MB/s 规划。
得到数字后要留余量。Kafka 单分区写入能力通常在数 MB/s 量级,但受磁盘、网络、副本同步影响。工程上建议按峰值再乘 1.5~2 倍冗余,并据此反推分区数。分区数不是越多越好:分区过多会增加元数据、控制器负担和端到端延迟。经验上单 broker 承载 2000~4000 个分区较为稳妥,具体需结合硬件实测。
三、延迟:区分端到端与处理延迟
延迟要区分两个口径:生产者发送到 broker 落盘的写入延迟,以及消息产生到被消费者处理完成的端到端延迟。业务常说的“实时”通常指后者。端到端延迟 = 生产端攒批等待 + 网络传输 + broker 落盘 + 消费者拉取间隔 + 业务处理时间。
其中生产端 linger.ms 与消费者 fetch.min.bytes、fetch.max.wait.ms 是主要可调项。若业务要求 P99 端到端小于 200 ms,则 linger.ms 不宜超过 5~10 ms,消费者拉取等待也应压到 10 ms 级。反之,日志场景可把 linger.ms 设为 50~100 ms 换取更大批次和更高吞吐。延迟指标必须写清分位数,只写平均值会掩盖长尾问题。
四、可靠性:明确“不丢”的边界
可靠性需求要回答三个问题:允许丢吗?允许重复吗?允许乱序吗?金融交易通常要求不丢且不重复,日志场景可接受少量丢失。Kafka 侧对应配置为:生产者 acks=all、enable.idempotence=true、retries 足够大;broker 侧 replication.factor=3、min.insync.replicas=2、unclean.leader.election.enable=false;消费者侧关闭自动提交,处理成功后手动提交位点。
需要提醒的是,acks=all 只保证写入不丢,不保证消费不丢。消费端若先提交位点再处理业务,进程崩溃就会丢消息。因此“至少一次”是常见基线,配合业务幂等实现“恰好一次”效果。可靠性等级应逐主题标注,而非全局一刀切,否则会为低价值日志付出过高成本。
五、顺序性:按 key 分区是主要手段
Kafka 只保证单分区内有序。若业务要求同一订单的事件有序,应使用订单号作为消息 key,使同一订单的消息落入同一分区。这样既保证顺序,又保留跨订单的并行能力。若要求全局有序,只能使用单分区,吞吐将受限于单分区能力,通常仅在极低频场景可接受。
还需注意生产者重试可能造成乱序。开启幂等(enable.idempotence=true)后,Kafka 会为每个生产者分配 PID 和序列号,broker 据此去重并保序,可将 max.in.flight.requests.per.connection 提到 5 而不乱序。这是兼顾吞吐与顺序的关键配置。
六、多租户:隔离与配额
企业消息中枢通常服务多个业务线,多租户需求体现在三方面:资源隔离、配额限制、权限与计费。Kafka 提供 user 和 client-id 两个维度的配额,可限制生产/消费字节速率与请求速率,防止单一业务打满集群。命名规范上建议采用 业务域.系统.主题 的层级,配合 ACL 控制读写权限。
隔离强度需与成本权衡。物理集群隔离最彻底但成本最高;逻辑隔离(共享集群 + 配额 + ACL)成本低但存在噪声邻居风险。折中方案是按重要级别划分 2~3 个集群,核心交易独立集群,一般业务共享集群并施加严格配额。
| 业务场景 | 峰值吞吐 | P99 延迟 | 可靠性 | 顺序性 | 租户级别 |
|---|---|---|---|---|---|
| 订单支付 | 17 MB/s | < 200 ms | 不丢不重 | 订单号分区有序 | 独立集群 |
| 日志埋点 | 80 MB/s | < 5 s | 可容忍少量丢失 | 无要求 | 共享+配额 |
| IoT 采集 | 突发 30 MB/s | < 1 s | 至少一次 | 设备号有序 | 共享+配额 |
| CDC 同步 | 10 MB/s | < 2 s | 不丢 | 表主键有序 | 独立集群 |