标签:producer 分区 partition kafka key prop public partitions
消息在经过拦截器、序列化后,就需要确定它发往哪个分区,如果在ProducerRecord中指定了partition字段,那么就不再需要partitioner分区器进行分区了,如果没有指定,那么会根据key来将数据进行分区,如果partitioner和key都没有指定,那么就会采用默认的方式进行数据分区。
有没有指定partition可以从源码中看出:
public ProducerRecord(String topic, Integer partition, K key, V value) {}
如果指定的partition,那就指定了数据发往哪个分区上,如果没有就会根据key来进行数据分区,如果2个都没有,那么会采用默认的分区策略来进行数据分区
Demo:
public class CustomPartitioner { private static final Logger LOG = LoggerFactory.getLogger(CustomPartitioner.class); public static void main(String[] args) { //1.加载配置信息 Properties prop = loadProperties(); //2.创建生产者 KafkaProducer<Integer,String> producer = new KafkaProducer<>(prop); String sendContent = "hello_kafka"; IntStream.range(0, 10).forEach(i ->{ try { ProducerRecord<Integer,String> record = new ProducerRecord<>("test1",i,sendContent+"_"+i); //topic key value Future<RecordMetadata> future = producer.send(record); RecordMetadata recordMetadata = future.get(); LOG.info("发送的数据是 :{},offset:是{},partition是:{}",sendContent,recordMetadata.offset(),recordMetadata.partition()); } catch (Exception e) { e.printStackTrace(); } }); } //配置文件的设置 public static Properties loadProperties() { Properties prop = new Properties(); prop.put("bootstrap.servers", "192.168.100.144:9092,192.168.100.145:9092,192.168.100.146:9092"); prop.put("key.serializer", "org.apache.kafka.common.serialization.IntegerSerializer"); prop.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer"); prop.put("acks", "all"); //发送到所有的ISR队列中 return prop; } }
标签:producer,分区,partition,kafka,key,prop,public,partitions 来源: https://www.cnblogs.com/MrRightZhao/p/11345846.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。