一. Kafka topic消息根据什么规则推送到到指定区partition?
1) 发布消息时,如果只传了topic没有传key,则会以topic随机计算出一个的区(partition)来存放消息。
优点:消息分布到不同partition上,能并发消费(并发数小于等于分区总数),消费速度快。
缺点:不保证消息顺序性。不适合需要按消息产生顺序性来消费的业务。
2)发布消息时,不仅传了topic,还传了key。则该topic会根据key计算固定的一个区(partition)来存放消息。
优点:能保证消息的顺序性。适合按消息顺序性来消费的业务。
缺点:由于一个分区(partition)只能被一个消息组内的一个consumer消费,而固定一个区意味着单线程按消息顺序性消费,
消费速度慢。
kafka的分区算法如下:
/** * Compute the partition for the given record. * * @param topic The topic name * @param key The key to partition on (or null if no key) * @param keyBytes serialized key to partition on (or null if no key) * @param value The value to partition on or null * @param valueBytes serialized value to partition on or null * @param cluster The current cluster metadata */ public int partition(String topic, Object key, byte[] keyBytes, Object value, byte[] valueBytes, Cluster cluster) { List<PartitionInfo> partitions = cluster.partitionsForTopic(topic); int numPartitions = partitions.size(); if (keyBytes == null) { int nextValue = nextValue(topic); List<PartitionInfo> availablePartitions = cluster.availablePartitionsForTopic(topic); if (availablePartitions.size() > 0) { int part = Utils.toPositive(nextValue) % availablePartitions.size(); return availablePartitions.get(part).partition(); } else { // no partitions are available, give a non-available partition return Utils.toPositive(nextValue) % numPartitions; } } else { // hash the keyBytes to choose a partition return Utils.toPositive(Utils.murmur2(keyBytes)) % numPartitions; } }
二、Kafka同一个区能的消息被多少consumer消费?
1)同一个区只能被一个同一个订阅消费组内一个消费端consumer消费。所以,消费并发小于等于分区数。
2)同一个区的消息可以被不同订阅组进行消费。