1.分区策略:
分区parition:通过分区可以实现负载均衡和提高吞吐量。将消息发送到多个partition中。
1.1 分区策略类型:
-
默认分区策略
- 指定key: 通过计算key的hash值,然后对分区数求模
Utils.toPositive(Utils.murmur2(keyBytes)) % numPartitions;
- 没有指定key:使用轮询(粘性分区策略)
轮询到一个分区后,消息包大小到达默认16k或者达到最大等待时间linger.ms,才开始轮询下一个
- 指定key: 通过计算key的hash值,然后对分区数求模
-
随机分区
-
自定义分区策略
实现Partitioner接口,然后设置分区策略时候,使用自定义的分区策略类
1.2 使用
初始化kafkaproducer时候,配置属性里加上partitioner.class
的配置
例:properties.put(“partitioner.class”, MyPartitioner.class.getName());
2.压缩算法
目的是,用cpu时间去减少磁盘空间和网络I/O传输。
Producer 端压缩、Broker 端保持、Consumer 端解压缩
2.1压缩算法类型:
吞吐量方面:LZ4 > Snappy > zstd 和 GZIP
压缩比方面,zstd > LZ4 > GZIP > Snappy
2.2 使用
producer端指定compression.type
配置项(broker端配置也有该项)
例:props.put(“compression.type”, “gzip”);
2.3 建议项
- 如果broker端也指定了压缩算法,那么producer指定的最好和broker保持一致。否则消息到达broker端会重新解压缩,再按照broker压缩算法压缩。默认情况下,broker使用的是produer配置的算法
- 建议只有在producer cpu资源充裕的情况下,才开启压缩,否则会使机器cpu资源耗尽,反而得不偿失;
- 如果宽带资源比较紧张,建议开启压缩,可以使用zstd,极大的减少网络资源开销