3. 企业消息中枢需求分析

建设企业消息中枢,最容易犯的错误是先选产品、先搭集群,再回头问“业务到底要什么”。Kafka 的吞吐可以很高,延迟可以很低,可靠性可以做到不丢,但这些能力都要用资源、成本和复杂度去换。需求分析的任务,就是把业务语言翻译成可度量、可验证的技术指标,并明确哪些指标是硬约束、哪些可以折中。

一、从业务场景提取五类需求

消息中枢的需求可以归纳为五个维度:吞吐、延迟、可靠性、顺序性、多租户。它们并非彼此独立,而是相互牵制。例如提高可靠性通常意味着增加副本与确认等待,从而抬高延迟;追求全局顺序会牺牲分区并行度,进而压低吞吐。因此需求分析的核心不是把五项都拉满,而是找到业务真正在意的组合。

识别方法是从场景出发提问。以订单、支付、日志、埋点、IoT 采集五类典型场景为例:订单与支付关心不丢和分区内顺序;日志与埋点关心高吞吐、可容忍少量丢失;IoT 采集关心突发流量与设备级顺序。把每个业务系统按“生产者—主题—消费者”列出,再逐条标注五项指标,就能得到一张需求矩阵。

业务场景 → 消息中枢五维需求映射 订单 / 支付 日志 / 埋点 IoT 设备采集 风控 / 反欺诈 数据同步 CDC 吞吐 Throughput MB/s · 万条/s 延迟 Latency P50 / P99 ms 可靠性 Reliability 副本 · acks · 重试 顺序性 Ordering 分区内 / 全局 多租户 Multi-tenancy 配额 · 隔离 · 计费 分区数 · 批量 · 压缩 linger.ms · batch.size 减少跳数 · 就近消费 fetch.min.bytes RF=3 · min.insync acks=all · 幂等 按 key 分区 单分区单消费者 Quota · ACL · 命名空间 user/client-id 限流 五维相互制约:需求分析的本质是取舍 可靠性↑ → 延迟↑ | 全局顺序↑ → 吞吐↓ | 多租户隔离↑ → 资源利用率↓ 先定硬约束(不丢 / 顺序),再优化软指标(延迟 / 成本)

二、吞吐:先算峰值,再留余量

吞吐需求不能只写“高”,要落到数字。计算方法是:单条消息平均大小 × 峰值 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不丢表主键有序独立集群
需求分析完成后,应输出一份可评审的《消息中枢需求规格》,至少包含:业务系统清单、主题命名、峰值吞吐与分区数、延迟分位目标、可靠性等级与对应配置、顺序键选择、租户配额。这份规格是后续容量规划、集群部署与监控告警的直接输入。
常见误区:把“高可用”等同于“不丢消息”。高可用解决的是 broker 故障时的服务连续性,不丢消息还需要生产者确认、副本同步与消费者位点管理的配合。二者必须分别定义、分别验证。