美文网首页
消息队列之三:生产者分区策略

消息队列之三:生产者分区策略

作者: SuperMarry | 来源:发表于2020-06-07 16:37 被阅读0次

本篇主要讲解生产者策略以及实现自定义的分区策略。

在第二篇文章中介绍了kafka模型的基本知识,明确一个topic下可以有多个Partition,上篇文章中说这样做的目的是为了保证消息消费的有序性、可靠性,其实除此之外还有一个更重要的作用:负载均衡,一个主题的多个分区可以放在多个节点上,每个节点单独处理读写请求,可以提高系统(消息队列)的吞吐量。

那当生产者往一个主题发送消息的时候会传递给哪个分区呢?一起来看看kafka客户端的代码是怎么写的。

 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) {//key为空时
            int nextValue = this.nextValue(topic);
            List<PartitionInfo> availablePartitions = cluster.availablePartitionsForTopic(topic);
            if (availablePartitions.size() > 0) {
                int part = Utils.toPositive(nextValue) % availablePartitions.size();
                return ((PartitionInfo)availablePartitions.get(part)).partition();
            } else {
                return Utils.toPositive(nextValue) % numPartitions;
            }
        } else {//key不为空时
            return Utils.toPositive(Utils.murmur2(keyBytes)) % numPartitions;
        }
    }

总结下来就是:

  • 当指定发送分区的时候,发送给指定分区。
  • 当未指定分区且key不为空时,基于key的hash值指定一个分区(上一篇中提及的保证顺序消费的做法)
  • 当未指定分区且key为空时,采用轮询的方式发送到分区。比如现在某一个主题有三个分区,0,1,2,第一次0,第二次1,第三次2,第四次0,循环往复。

那如果系统要实现包含指定字符的key发送到指定的分区呢?显然客户端提供的默认分区实现就不够用了,要实现自定义的分区策略。
我们先来创建一个topic:testMyPartitioner,分区数为三。
在调用自动义分区策略前,我们先来看看包含key时数据分别发送到哪个分区。


1、2.png 3.png

可以看到在指定key为:first、second时分发到了分区1,key为:third时分发到了分区2.

现在我们要实现的是将first分发到分区0,second分发到1,third分发到2.

实现生产者的自定义分区策略,可以实现 Partitioner接口。

package com.eureka.client.kafkaPartitioner;

import org.apache.kafka.clients.producer.Partitioner;
import org.apache.kafka.common.Cluster;

import java.util.Map;

public class ProducerPartitioner implements Partitioner {
    @Override
    public int partition(String s, Object key, byte[] keyBytes, Object o1, byte[] bytes1, Cluster cluster) {
        //将first分发到分区0,second分发到1,third分发到2.
        if("first".equals((String)key)){
            return 0;
        }
        if("second".equals((String)key)){
            return 1;
        }
        if("second".equals((String)key)){
            return 2;
        }

        return 0;
    }

    @Override
    public void close() {

    }

    @Override
    public void configure(Map<String, ?> map) {

    }
}

然后在创建生产者实例中指定自定的分区策略实现类

props.put(ProducerConfig.PARTITIONER_CLASS_CONFIG,"com.eureka.client.kafkaPartitioner.ProducerPartitioner");

image.png image.png

第三张就不发了。另外上边的写的代码只是用来做实验的,不可以照搬使用。

至于消费者分区策略的话留在下一篇再讲吧,因为涉及很多东西,放在这里就太多了(ps:想打游戏了)

相关文章

  • 消息队列之三:生产者分区策略

    本篇主要讲解生产者策略以及实现自定义的分区策略。 在第二篇文章中介绍了kafka模型的基本知识,明确一个topic...

  • Kafka生产者的消息分区策略

    问题:有哪些分区策略/分区算法? 分区策略的定义:决定生产者将消息发送到哪个分区的算法。 1. 轮询策略/顺序分配...

  • 关于消息

    生产者根据消息key以及“路由策略”将消息发往对应topic分区,消息数据在broker服务端按照指定备份策略“持...

  • Kafka入门系列—2. topic、消费者组等重要概念

    消息队列是生产者向消息队列发送消息,消费者从消息队列拉取(pull)消息。 生产者生产者是消息队列的数据源,可以向...

  • 图解Kafka消费者分区分配策略

    1. 分配策略的作用 我们在分析生产者的时候有专门写过文章分析生产者的分区分配策略 Kafka生产者的3种分区策略...

  • Kafka分区策略

    1. 生产者分区选择配策略 生产者在将消息发送到某个Topic ,需要经过拦截器、序列化器和分区器(Partiti...

  • kafka发送消息分区选择策略

    发送kafka:(版本0.10.11) kafka 生产者发送消息分区选择策略 通过跟踪send方法,发现Kafk...

  • MQ消息队列的12点核心原理总结

    1. 消息生产者、消息者、队列 消息生产者Producer:发送消息到消息队列。 消息消费者Consumer:从消...

  • 生产者消费者与发布者订阅者区别

    生产者消费者模式:生产者生产消息放到队列里,多个消费者同时监听队列,谁先抢到消息谁就会从队列中取走消息;即对于每个...

  • php RabbitMQ生产者发布确认

    使用队列时,第一步生产者发送消息到队列中,生产者有责任保证消息正确进度队列.可以通过发布确认实现.流程: 消息Me...

网友评论

      本文标题:消息队列之三:生产者分区策略

      本文链接:https://www.haomeiwen.com/subject/pvsctktx.html