前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Kafka生产过程解析

Kafka生产过程解析

作者头像
编程那点事
发布于 2023-02-25 08:05:17
发布于 2023-02-25 08:05:17
15200
代码可运行
举报
文章被收录于专栏:java编程那点事java编程那点事
运行总次数:0
代码可运行
写入方式

producer采用推(push)模式将消息发布到broker,每条消息都被追加(append)到分区(patition)中,属于顺序写磁盘(顺序写磁盘效率比随机写内存要高,保障kafka吞吐率)。

分区(Partition)

消息发送时都被发送到一个topic,其本质就是一个目录,而topic是由一些Partition Logs(分区日志)组成

我们可以看到,每个Partition中的消息都是有序的,生产的消息被不断追加到Partition log上,其中的每一个消息都被赋予了一个唯一的offset值。

1)分区的原因

(1)方便在集群中扩展,每个Partition可以通过调整以适应它所在的机器,而一个topic又可以有多个Partition组成,因此整个集群就可以适应任意大小的数据了;

(2)可以提高并发,因为可以以Partition为单位读写了。

2)分区的原则

(1)指定了patition,则直接使用;

(2)未指定patition但指定key,通过对key的value进行hash出一个patition

(3)patition和key都未指定,使用轮询选出一个patition。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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;
   }
 }
副本(Replication)

同一个partition可能会有多个replication(对应 server.properties 配置中的 default.replication.factor=N)。没有replication的情况下,一旦broker 宕机,其上所有 patition 的数据都不可被消费,同时producer也不能再将数据存于其上的patition。引入replication之后,同一个partition可能会有多个replication,而这时需要在这些replication之间选出一个leader,producer和consumer只与这个leader交互,其它replication作为follower从leader 中复制数据。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-03-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Kafka快速入门系列(6) | Kafka生产过程的分析及分区策略
  producer采用推(push)模式将消息发布到broker,每条消息都被追加(append)到分区(patition)中,属于顺序写磁盘(顺序写磁盘效率比随机写内存要高,保障kafka吞吐率)。
不温卜火
2020/10/28
4900
Kafka快速入门系列(6) | Kafka生产过程的分析及分区策略
Kafka中生产消息时的三种分区分配策略
KafkaProducer在发送消息的时候,需要指定发送到哪个分区, 那么这个分区策略都有哪些呢? 我们今天来看一下
石臻臻的杂货铺[同名公众号]
2022/09/19
1.6K0
Kafka之Producer生产者分区
    如List-1所示,发送消息时,传入到partition方法中,返回的int值就是分区号,即发送到哪个分区,默认的实现是DefaultPartitioner,如下List-2
克虏伯
2020/07/14
4340
聊聊kafka的partition分配
本文主要研究一下kafka的partition分配,主要是key到parition的映射,partition对consumer的分配,以及partition的replica对broker/machine的分配。
code4it
2018/09/17
2.6K0
kafka的生产者分区机制原理(二)
2.随机策略 也称 Randomness 策略。所谓随机就是我们随意地将消息放置到任意一个分区上,如下面这张图所示。
袁新栋-jeff.yuan
2020/08/26
4970
kafka学习笔记:知识点整理
producer 采用 push 模式将消息发布到 broker,每条消息都被 append 到 patition 中,属于顺序写磁盘(顺序写磁盘效率比随机写内存要高,保障 kafka 吞吐率)。
Java架构师必看
2021/08/05
3770
连Producer端的主线程模块运行原理都不清楚,就敢说自己精通Kafka?
在介绍Producer端原理之前,大家先对其整体架构有一个大致的了解,图示如下所示:
爪哇缪斯
2023/09/05
1900
连Producer端的主线程模块运行原理都不清楚,就敢说自己精通Kafka?
kafka 生产者使用详解
是不是觉得很简单?虽然使用起来是很简单,但是要使用好也不是那么容易噢。。。这里请注意以下几点: 1、一定要记得close producer,以免造成资源浪费 2、send() 是异步的,所以上面的代码是有点问题的,producer.close();应该在合适的机会调用,而不是代码末尾 3、如果你想使用同步发送,那么只需要简单的producer.send().get() 使用get()函数就可以了
solve
2019/10/30
2.1K0
kafka 生产者使用详解
Kafka实践与原理
其中Zookeeper是Kafka用来负责元数据的管理、控制器的选举。Producer将消息发送到Broker,Broker负责将消息存储到磁盘中,而Consumer负责从Broker订阅并消费消息。
mikelLam
2022/10/31
3850
Kafka实践与原理
kafka default partitioner java版本和scala版本的不同
scala import kafka.utils._ class DefaultPartitioner(props: VerifiableProperties = null) extends Partitioner { private val random = new java.util.Random def partition(key: Any, numPartitions: Int): Int = { Utils.abs(key.hashCode) % numPartitions
sanmutongzi
2020/03/04
7750
kafka topic消息分配partition规则(Java源码)
我们知道Kafka 的消息通过topic进行分类。topic可以被分为若干个partition来存储消息。消息以追加的方式写入partition,然后以先入先出的顺序读取。
GreizLiao
2019/09/23
1K0
kafka topic消息分配partition规则(Java源码)
kafka中生产者是如何把消息投递到哪个分区的?消费者又是怎么选择分区的?
我们知道,生产者发送消息到主题,消费者订阅主题(以消费者组的名义订阅),而主题下是分区,消息是存储在分区中的,所以事实上生产者发送消息到分区,消费者则从分区读取消息,那么,这里问题来了,生产者将消息投递到哪个分区?消费者组中的消费者实例之间是怎么分配分区的呢?接下来,就围绕着这两个问题一探究竟。
程序猿DD
2023/04/04
1.9K0
kafka中生产者是如何把消息投递到哪个分区的?消费者又是怎么选择分区的?
Kafka
优点: (1)解耦 (2)冗余(备份) (3)扩展性 (4)灵活性、峰值处理能力 (5)可恢复性(冗余) (6)顺序保证(队列) (7)缓冲(冗余) (8)异步通信(宕机)
matt
2022/10/25
4680
Kafka
Kafka - 3.x Kafka 生产者分区技巧全面指北
消息在通过 send()方法发往 broker 的过程中,有可能需要经过拦截器(Interceptor)、序列化器(Serializer)和分区器(Partitioner)的一系列作用之后才能被真正地发往 broker。拦截器一般不是必需的,而序列化器是必需的。消息经过序列化之后就需要确定它发往的分区,如果消息 ProducerRecord 中指定了 partition 字段,那么就不需要分区器的作用,因为 partition 代表的就是所要发往的分区号。
小小工匠
2023/10/28
4260
Kafka - 3.x Kafka 生产者分区技巧全面指北
2021年大数据Kafka(十):kafka生产者数据分发策略
        kafka在数据生产的时候,有一个数据分发策略。默认的情况使用DefaultPartitioner.class类。这个类中就是定义数据分发的策略
Lansonli
2021/10/11
8700
面试官:Kafka中的key有什么用?
我们在使用 Kafka 时,最简单、最常用的方式是只设置 topic(主题)和 value(消息体),如下所示:
磊哥
2024/08/28
4890
整活了!结合API操作Kafka集群,理解producer&consumer&topic&partition
本文通过实操Kafka的API来理解topic、partition等相关概念,我将通过搭建一个Kafka集群来实现它。
行百里er
2021/06/10
7800
整活了!结合API操作Kafka集群,理解producer&consumer&topic&partition
Kafka 原理以及分区分配策略剖析
Apache Kafka 是一个分布式的流处理平台(分布式的基于发布/订阅模式的消息队列【Message Queue】)。
Spark学习技巧
2021/08/24
4110
Kafka学习笔记之分区Partition和副本Replicator的区别
本篇主要介绍kafka的分区和副本,因为这两者是有些关联的,所以就放在一起来讲了,后面顺便会给出一些对应的配置以及具体的实现代码,以供参考~
Jetpropelledsnake21
2020/12/29
1.2K0
kafka消息分区机制原理
比如monogodb, es 里面叫做 shard; hbase叫region, cassdra叫vnode;
星哥玩云
2022/08/08
5360
kafka消息分区机制原理
相关推荐
Kafka快速入门系列(6) | Kafka生产过程的分析及分区策略
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验