为什么分区
分区的作用:实现负载均衡以及高吞吐量的能力,或者实现系统的高伸缩性。
注意:不同的分布式系统对分区的定义有所不同,比如在kafka中叫分区,MongoDB和Elasticsearch叫分片,HBASE中叫Region,在Cassandra叫vnode。
kafka的消息组织方式结构:
kafka的消息组织方式结构: 主题-分区-消息,主题下的每条消息只会保持在某一个分区中,而不会在多个分区中被保持多份。
分区策略
分区策略:决定生产者将消息发送到哪个分区的算法,kafka为我们提供了默认分区策略,同时,也支持你自定义分区策略。
自定义分区策略:显示配置生产者端的参数-partitioner.class
#topic、key、keyBytes、value和valueBytes都属于消息数据,cluster则是集群信息
int partition(String topic, Object key, byte[] keyBytes, Object value, byte[] valueBytes, Cluster cluster);
分区策略:轮询策略、随机策略和按消息键保序策略。还有一种是基于地理位置的分区策略,但这种策略一般只针对那些大规模的kafka集群,特别是跨城市、跨国家甚至是跨大洲的集群。
轮询策略
也成为Round-robin策略,即顺序分配。kafka java生产者API默认提供的分区策略。
随机策略
也成为Randomness策略。所谓随机地将消息放置在任意一个分区上。先计算出主题总的分区数,然后随机地返回一个小于它的正整数。
#随机策略版的partition方法
List<PartitionInfo> partitions = cluster.partitionsForTopic(topic);
return ThreadLocalRandom.current().nextInt(partitions.size());
按消息键保序策略
也称Key-ordering策略。Key:每条消息定义消息键。
List<PartitionInfo> partitions = cluster.partitionsForTopic(topic);
return Math.abs(key.hashCode()) % partitions.size();