聊聊Kafka分区、producer、consumer

一. 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)同一个区的消息可以被不同订阅组进行消费。

评论

*
*