面试题答案
一键面试1. 分区设计原则
- 按订单ID哈希分区:将订单ID进行哈希运算,根据哈希值分配到不同分区。这样相同订单ID的数据会始终进入同一分区,对于需要保证订单数据一致性处理的场景很有帮助,比如同一订单的支付、发货等操作按顺序处理。同时也能在一定程度上实现数据均衡分布,避免某个分区数据量过大。
- 按业务类型分区:如果订单存在不同业务类型,如普通订单、团购订单、限时抢购订单等,可以按业务类型分区。不同业务类型的处理逻辑和负载可能不同,分开分区可以针对性进行优化。例如限时抢购订单处理可能需要更高的读写性能,单独分区后可以为该分区配置更多资源。
- 按地域分区:若订单系统面向不同地区,按地域分区可减少数据传输延迟。比如将不同省份的订单分到不同分区,本地处理本地订单数据,提升处理效率。同时也有助于数据的本地化管理和容灾。
2. 提升读写性能
- 读性能:
- 消费者组中的消费者数量与分区数匹配,避免消费者过多或过少导致资源浪费或读取效率低下。例如,若有10个分区,可设置10个消费者并行读取,充分利用分区并行性。
- 合理设置消费者的fetch.min.bytes和fetch.max.wait.ms参数。fetch.min.bytes指定每次拉取数据的最小字节数,fetch.max.wait.ms指定拉取数据等待的最长时间,平衡这两个参数可减少网络请求次数,提升读取性能。
- 写性能:
- 生产者采用异步批量发送,通过设置batch.size和linger.ms参数。batch.size指定一批消息的最大字节数,linger.ms指定消息在缓冲区等待的最长时间,达到任一条件即发送,减少网络请求次数。
- 合理配置acks参数,acks=1 表示leader副本收到消息并写入本地日志后即确认成功,性能较高;acks=all 表示所有同步副本都收到消息后才确认成功,可靠性高但性能相对低。根据业务对可靠性和性能的要求选择合适的acks值。
3. 数据均衡性
- 定期监控各分区的数据量和负载情况,若发现某个分区数据量增长过快或负载过高,可使用Kafka的重分区工具进行调整。例如通过Kafka自带的kafka-reassign-partitions.sh脚本,重新分配分区数据,使各分区数据量和负载保持均衡。
- 在创建主题时,预估好业务数据量和增长趋势,合理设置分区数。若分区数过少,随着数据量增加易导致单个分区负载过高;若分区数过多,会增加管理开销和资源浪费。
4. 可靠性
- 采用多副本机制,设置合适的副本因子。例如副本因子为3,每个分区有一个leader副本和两个follower副本。当leader副本故障时,follower副本可自动选举为新的leader,保证数据不丢失,提高系统可靠性。
- 确保ISR(In-Sync Replicas)集合中的副本数量满足业务要求。生产者发送消息时,只有ISR中的副本都成功写入消息才确认成功,防止数据丢失。监控ISR集合的状态,及时处理副本不同步的情况。