MST

星途 面试题库

面试题:消息队列Kafka在实时竞价广告系统面临高流量冲击时的调优策略

假设实时竞价广告系统突然面临高流量冲击,导致Kafka出现性能瓶颈。请详细说明从Kafka的架构层面(如生产者、消费者、Broker等),以及与系统其他组件配合方面,你会采取哪些调优策略来确保系统稳定运行,并保证广告竞价的实时性和准确性。
36.9万 热度难度
后端开发消息队列

知识考点

AI 面试

面试题答案

一键面试

Kafka架构层面

  1. 生产者
    • 批量发送:增大 batch.size 参数值,例如从默认的16KB适当调大,如32KB ,这样可以将多条消息批量发送,减少网络请求次数,提高发送效率。同时要合理设置 linger.ms ,比如设置为5 - 10ms ,使得生产者等待一段时间,以积累更多消息形成批次再发送。
    • 异步发送:采用异步发送方式,使用 Future 或回调函数来处理发送结果。这样生产者线程不会阻塞等待消息发送完成,能继续处理后续消息,提高整体吞吐量。
  2. 消费者
    • 增加消费者实例:根据系统资源和负载情况,增加消费者实例数量。比如原本一个消费者组只有1个消费者实例,可以增加到3 - 5个实例,这些实例共同消费Kafka主题中的消息,提高消费速度。
    • 调整拉取参数:适当增大 fetch.min.bytes ,例如从默认的1字节调整为10KB ,这样消费者每次拉取会获取更多数据,减少拉取频率。同时合理设置 fetch.max.wait.ms ,避免消费者等待时间过长,如设置为500ms 。
  3. Broker
    • 增加Broker节点:根据实际情况增加Kafka Broker节点数量,以分担负载。例如原本3个Broker节点,可以增加到5 - 7个节点,从而提高Kafka集群的整体处理能力。
    • 调整存储参数:优化磁盘I/O性能,使用高性能磁盘(如SSD),并合理配置 log.retention.hourslog.segment.bytes 等参数。比如缩短 log.retention.hours ,减少数据保留时间,降低磁盘占用;适当增大 log.segment.bytes ,减少日志段切换频率。
    • 优化网络配置:调整Broker的网络参数,如 socket.send.buffer.bytessocket.receive.buffer.bytes ,适当增大这些参数值,例如设置为128KB ,以提高网络传输效率。

与系统其他组件配合方面

  1. 上游组件
    • 流量控制:在上游数据产生端(如广告请求接入层)增加流量控制机制,如令牌桶算法或漏桶算法。当流量过高时,限制请求的发送速率,避免Kafka被过多数据冲击。
    • 缓存机制:在上游组件设置缓存,如使用Redis。对于一些频繁请求且不经常变化的数据(如广告主基本信息等),可以先从缓存中获取,减少对Kafka的请求压力。
  2. 下游组件
    • 优化处理逻辑:在广告竞价处理组件中,优化算法逻辑,减少不必要的计算和I/O操作。例如对广告出价计算逻辑进行优化,提高计算效率,确保能快速处理从Kafka接收的广告竞价消息。
    • 增加处理能力:根据需要增加下游广告竞价处理组件的实例数量,如通过水平扩展容器化部署的方式,提高整体处理能力,及时处理Kafka发送过来的消息,保证广告竞价的实时性和准确性。