kafka

  1. kafka基本概念
  2. 在这里插入图片描述
  3. 1.1 什么是kafka
    1) Apache Kafka 是一个开源的分布式消息队列(生产者消费者模式)
    2) Apache Kafka 目标:构建企业中统一的、高通量的、低延时的消息平台。
    3) 大多的是消息队列(消息中间件)都是基于JMS标准实现的,Apache Kafka 类似于JMS的实现。
    1.2 kafka的特点
    作为缓冲(流量消减),来异构、解耦系统。
    用户注册需要完成多个步骤,每个步骤执行都需要很长时间。代表用户等待时间是所有步骤的累计时间。
    为了减少用户等待的时间,使用并行执行执行,有多少个步骤,就开启多少个线程来执行。代表用户等待时间是所有步骤中耗时最长的那个步骤时间。
    有了新得问题:开启多线程执行每个步骤,如果以一个步骤执行异常,或者严重超时,用户等待的时间就不可控了。
    通过消息队列来保证。
    注册时,立即返回成功。
    发送注册成功的消息到消息平台。
    对注册信息感兴趣的程序,可以消息消息
    在这里插入图片描述
  4. Apache kafka的基本架构
  5. 在这里插入图片描述
  6. Kafka Cluster:由多个服务器组成。每个服务器单独的名字broker(掮客)。
    kafka broker:kafka集群中包含的服务器
    Kafka Producer:消息生产者、发布消息到 kafka 集群的终端或服务。
    Kafka consumer:消息消费者、负责消费数据。
    Kafka Topic: 主题,一类消息的名称。存储数据时将一类数据存放在某个topic下,消费数据也是消费一类数据。
    订单系统:创建一个topic,叫做order。
    用户系统:创建一个topic,叫做user。
    商品系统:创建一个topic,叫做product。
    注意:Kafka的元数据都是存放在zookeeper中。
  7. kafka的基本使用
    kafka其本身就是一个消息队列的中间件, 主要是用来实现系统与系统之间信息传输, 一般有两大角色, 一个是生产者, 一个是消费者.
    故kafka的基本使用, 就是来学习如何使用生产者发送数据, 已经如何进行消费数据, kafka提供了两种方式来进行实现, 一种是采用kafka自带的脚本来操作, 另一种是使用相关的语言的API来进行操作
    4.1 使用脚本操作kafka
    说明: 索引执行的脚本文件都存放在kafka的bin目录中, 需要先进入bin目录才可以执行
    cd /export/servers/kafka/bin
    创建一个topic:
    topic: 指的是话题, 主题的意思, 在消息发送的时候, 我们需要对消息进行分类, 生产者和消费者需要在同一个topic下, 才可以进行发送和接收
    ./kafka-topics.sh --create --zookeeper node01:2181 --replication-factor 1 --partitions 1 --topic order
    使用Kafka自带一个命令行客户端启动一个生产者,生产数据
    ./kafka-console-producer.sh --broker-list node01:9092 --topic order
    使用Kafka自带一个命令行客户端启动一个消费者,消费数据
    ./kafka-console-consumer.sh --bootstrap-server node01:9092 --topic order
    该消费语句,只能获取最新的数据,要想历史数据,需要添加选项–from-beginning
    如:bin/kafka-console-consumer.sh --bootstrap-server node01:9092 --from-beginning --topic order
    查看有哪些topic
    ./kafka-topics.sh --list --zookeeper node01:2181
    在这里插入图片描述
    查看某一个具体的Topic的详细信息
    ./kafka-topics.sh --describe --topic order --zookeeper node01:2181
    在这里插入图片描述
    删除topic
    ./kafka-topics.sh --delete --topic order --zookeeper node01:2181
    只会标识一下, 这个topic已经被删除了
    注意:彻底删除一个topic,需要在server.properties中配置delete.topic.enable=true,否则只是标记删除
    配置完成之后,需要重启kafka服务。
    彻底删除, 描述将元数据信息彻底删除, 不会删除原始数据
    原始数据, 必须手动删除即可
    如果在使用中, 需要删除一个topic: 直接删除zookeeper中对应topic的节点即可,
    如果要删除原始数据, 需要到对应目录下手动删除
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  8. Apache kafka原理
    5.1 分片与副本机制 : topic
    此处的分片指的是对topic中数据进行分片和建立副本, 一个个topic理解为solrCloud中一个个大的索引库
    分片机制:主要解决了单台服务器存储容量有限的问题
    当数据量非常大的时候,一个服务器存放不了,就将数据分成两个或者多个部分,存放在多台服务器上。每个服务器上的数据,叫做一个分片
    在这里插入图片描述
    副本:副本备份机制解决了数据存储的高可用问题
    当数据只保存一份的时候,有丢失的风险。为了更好的容错和容灾,将数据拷贝几份,保存到不同的机器上。
    在这里插入图片描述
    在这里插入图片描述
    5.2 kafka保证数据不丢失机制
    在这里插入图片描述
    1) 消息生产分为同步模式和异步模式
    2) 消息确认分为三个状态
    a) 0:生产者只负责发送数据
    b) 1:某个partition的leader收到数据给出响应
    c) -1(all):某个partition的所有副本都收到数据后给出响应
    3) 在同步模式下 :
    a) 生产者等待10S,如果broker没有给出ack响应,就认为失败。
    b) 生产者重试3次,如果还没有响应,就报错。 props.put(“retries”, 0)
    4) 在异步模式下
    a) 先将数据保存在生产者端的buffer中。Buffer大小是2万条。
    b) 满足数据阈值或者数量(时间)阈值其中的一个条件就可以发送数据。
    props.put(“batch.size”, 16384); 数据阈值
    props.put(“linger.ms”, 1); 时间阈值
    c) 发送一批数据的大小是500条。
    如果broker迟迟不给ack,而buffer又满了。
    开发者可以设置是否直接清空buffer中的数据。
    在这里插入图片描述
    5.2.2 broker端消息不丢失
    broker端的消息不丢失,其实就是用partition副本机制(高可用)来保证。
    Producer ack -1(all). 能够保证所有的副本都同步好了数据。其中一台机器挂了,并不影响数据的完整性。
    5.2.3 消费端消息不丢失
    offset : 偏移量
    记录消费者消费到那个数据上
    通过offset commit 来保证数据的不丢失,kafka自己记录了每次消费的offset数值,下次继续消费的时候,会接着上次的offset进行消费。
    而offset的信息在kafka0.8版本之前保存在zookeeper中,在0.8版本之后保存到topic中,即使消费者在运行过程中挂掉了,再次启动的时候会找到offset的值,找到之前消费消息的位置,接着消费,由于offset的信息写入的时候并不是每条消息消费完成后都写入的,所以这种情况有可能会造成重复消费,但是不会丢失消息。

如何判断某一个消费者的偏移量放置在50个分组中那个组当中: 通过消费者的groupid
(groupid对hashCode()) & 50 得到

kafka会存在重复消费的问题!

5.3 消息存储及查询机制
5.3.1 文件存储机制
在这里插入图片描述
segment段中有两个核心的文件一个是log,一个是index。 当log文件等于1G时,新的会写入到下一个segment中。
通过下图中的数据,可以看到一个segment段差不多会存储70万条数据。
在这里插入图片描述
在这里插入图片描述
5.3.2 文件查询机制 :
需求: 读取 offset=368776 的message消息数据
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
5.4 生产者数据分发策略
kafka在数据生产的时候,有一个数据分发策略。默认的情况使用DefaultPartitioner.class类。
这个类中就定义数据分发的策略。
在这里插入图片描述
数据分发: ProducerRecord对象
参数1: 发往topic的名称 参数2: 表示要发送到那个分片上 参数3: key值 参数4: 数据value
public ProducerRecord(String topic, Integer partition, K key, V value) {
this(topic, partition, (Long)null, key, value, (Iterable)null);
}
1) 执行要往那个分片上发送数据, 如果指定了分片, 那么就不会使用系统默认的分发策略
1) 如果是用户制定了partition,生产就不会调用DefaultPartitioner.partition()方法
数据分发策略的时候,可以指定数据发往哪个partition。
当ProducerRecord 的构造参数中有partition的时候,就可以发送到对应partition上
/**

  • Creates a record to be sent to a specified topic and partition
  • @param topic The topic the record will be appended to
  • @param partition The partition to which the record should be sent
  • @param key The key that will be included in the record
  • @param value The record contents
    /
    public ProducerRecord(String topic, Integer partition, K key, V value) {
    this(topic, partition, null, key, value, null);
    }
    2) 当用户指定key,使用hash算法。如果key一直不变,同一个key算出来的hash值是个固定值。如果是固定值,这种hash取模就没有意义。
    Utils.toPositive(Utils.murmur2(keyBytes)) % numPartitions
    如果生产者没有指定partition,但是发送消息中有key,就key的hash值
    /
    *
  • Create a record to be sent to Kafka
  • @param topic The topic the record will be appended to
  • @param key The key that will be included in the record
  • @param value The record contents
    /
    public ProducerRecord(String topic, K key, V value) {
    this(topic, null, null, key, value, null);
    }
    3) 当用户既没有指定partition也没有key。
    使用轮询的方式发送数据。
    /
    *
  • Create a record with no key
  • @param topic The topic this record should be sent to
  • @param value The record contents
    */
    public ProducerRecord(String topic, V value) {
    this(topic, null, null, null, value, null);
    }
    5.5 消费者负载均衡机制
    在这里插入图片描述
    一个partition可以被一个组中某一个成员消费
    所以如果消费组中有多于partition数量的消费者,那么一定会有消费者无法消费数据。
    在这里插入图片描述
    kafka处理一时的高并发访问问题
    在这里插入图片描述
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值