kafka如何支撑海量消息的集中写入?java
答案就是消息分区。node
核心思想是:负载均衡,采用合适的分区策略把消息写到不一样的broker上的分区中;程序员
其它的产品中有相似的思想。算法
好比monogodb, es 里面叫作 shard; hbase叫region, cassdra叫vnode;apache
以下图:编程
即 topic -> partition -> message ; 负载均衡
topic是逻辑上的消息容器;dom
partition实际承载消息,分布在不一样的kafka的broke上;性能
message即具体的消息。学习
消息按照分区挨个的写。
随机的找一个分区写入,代码以下:
List<PartitionInfo> partitions = cluster.partitionsForTopic(topic); return ThreadLocalRandom.current().nextInt(partitions.size());
相同的key的消息写到固定的分区中
必须完成两步:
1,自定义分区实现类,须要实现org.apache.kafka.clients.producer.Partitioner接口。
主要是实现下面的方法:
int partition(String topic, Object key, byte[] keyBytes, Object value, byte[] valueBytes, Cluster cluster);
好比按照区域分区。
List<PartitionInfo> partitions = cluster.partitionsForTopic(topic); return partitions.stream().filter(p -> isSouth(p.leader().host())) .map(PartitionInfo::partition).findAny().get();
2,显示配置生产者端的参数partitioner.class为具体的类
系统默认:若是消息有key,按照key分区策略,不然按照轮询策略。
kafka的分区实现消息的高吞吐量的主要依托,主要是实现了写的负载均衡。能够指定各类负载均衡算法。
负载均衡算法很是重要,须要极力避免消息分区不均的状况,可能给消费者带来性能瓶颈。
小结以下:
原创不易,点赞关注支持一下吧!转载请注明出处,让咱们互通有无,共同进步,欢迎沟通交流。
我会持续分享Java软件编程知识和程序员发展职业之路,欢迎关注,我整理了这些年编程学习的各类资源,关注公众号‘李福春持续输出’,发送'学习资料'分享给你!
![]()