阅读 101

Kafka 核心概念介绍

Kafka 概述

特征

  • 发布订阅基于消息队列

  • 实时的方式对事件进行响应

  • 分布式的系统中存储内存

基于消息队列的编程

  • 传统调用, 在应用之间传统应用基于接口协议(http/rpc)直接调用的方式来进行通讯。

    • 缺点: 强耦合

  • 解耦, 如果我们通过 MQ 来进行通讯,那么可以做到系统之间的,服务之间不进行直接的调用。

  • 缓冲流量,如果请求数量过大的时候 Kafka MQ 可以缓冲流量。做到流量的消峰,保证服务的安全以及临时存储请求。

Kafka API 设计与概念

  • 生产者 API 将消息以流的形式传递给一个消息主题(topic)

  • 消费者 API 应用可以以一个或者多个消费终端来订阅消息主题

  • 流 API 一个或者多个主题中去消费输入流,然后输出一个或多个输出主题上去生成输出流。可以有效地将输入流转换为输出流。

  • 可重用的 API

  • Kafka 是一种跨语言的,高性能的基于TCP的和客户端通讯协议,提供了多种语言的API

主题和分区

  • 一个主题可以被多个 Consumer 订阅

  • 每个主题维护了一个分区(Partition)的日志(Partition)

kafka_log_anatomy.png

  • 进行分区过后,消息就会均匀的分配到分区(Partition)。

  • 分区上消息的顺序是严格的顺序执行。

  • 每个分上的每一条消息都会有一个序列ID(sequential id) 称为偏移量(offset)标识这个消息的唯一标志。

  • 默认情况下消息都有一个默认的保持时间(retention policy)2天。

  • Kafka 性能是一个常量,和数据量无关。

  • 如果进行 offset 指定可进行消息的重复消费或者消费指定消息。每个消费者(Consumer)的 offset 都是独立的,不会影响别的消费者

kafka_log_consumer.png

  • 一个主题可以有多个分区,作为并行单元,每个分区会受限于托管服务的容量,可以通过添加服务器来水平拓展容量。

副本

  • 每个分区都有他的副本, 每个分区都有一个 leader 和多个 follower, 如果 leader 挂掉后会重新选举一个 follower 称为 leader。每一台服务器可以作为一个分区的

laeder 其他分区的 follower。 这样可以保证服务的高可用

生产者

  • 生产者负责去选择哪个消息分配到哪一个分区,进行负载均衡。也可以通过一些其他算法来实现

消费者

  • 消费组会通过消费组(group name)名称标识自身,发现主题的每一个消息,会传递给每个消费组的唯一个消费者实例,消费者实例可以位于不同的进程或不同机器上。

  • (单播)所有消费者实例位于同一个消费者组,那么它会将消息负载均衡给到每个消费者实例。

  • (广播)如果所有的消费者拥有不同的消费者组,那么消息将会被广播到每一个消费者实例。

kafka_consumer_groups.png

  • 失败容错,在Kafka中是采用日志来进行分区的,以便每个实例分区上都是公平的。Kafka 协议会动态处理维护加入的订阅者实例。如果有新实例加入组,它将接管一些分区,

如果实例下线,那么则将这些分区分配给其他的实例。

  • 消费的实现, 通过消息放在日志中。维护分组成员的方式通过Kafka的协议实现。一个新的实例会占据一个分区, 每个分区会保证顺序,跨越分区消息的顺序不是有序的

保证

  • 生产者发生的消息将会按照发送顺序进行追加,如果 M1 和 M2 由同一个发布者发布那么。M1 的 offset 比 M2 小并且日志更靠前面。保证日志严格有序。

  • 消费者看到的消息的顺序,与日志的存储顺序

  • 对于主题会有N个副本,最多容忍 N-1 个副本崩溃,消息是不会丢失的。

Kafka 消息系统

  • 对比传统消息系统,传统消息模型:排队(queuing)和 发布-订阅(publish-subscribe)。队列这种的消息系统中,消费者的池,可以从一个服务中去读取

并且每一个记录都会进入到一个记录中;发布订阅的模型中,广播给所有的消费者。两种模型各有利弊

  • 队列模型,可以在多台 consumers 实例上进行处理进行可伸缩。

  • 发布订阅模型,可以广播给多个订阅者,不能进行可伸缩,因为每个消息都会进入每个实例中。

  • consumers group 对这两种模型进行了泛化,可以在一个进程的集合上进行处理,对于发布订阅模型,可以发布到多个 consumers group。 Kafka 的

优势在于每个 Topic 都有一个

  • Kafka 对比传统队列有一个消息顺序的保证

  • 多个消息进行顺序处理。不过服务器按照顺序进行分发和处理,但是消息会按照异步的方式来传递给不同的consumers,但是消息会异步的发送给消费者,

那么记录的顺序,在并行消费的场景消失。

  • 通常会通过 work around 的方式来解决,采用一种排他的消费者"exclusive consumer"。在分区的主题中,可以在负载均衡的保证。指定分派的的

分区在 Topic 中。

  • 通过分配指定主题(topic)中的分区(partition) 指定给消费者组中的消费组的一个消费者来进行消费。这个样可以保证,consumer 就是唯一的一个

读取者而且按照顺序来读取。

  • 由于很多的分区存在,这个会平衡很多消费者实例来进行负载均衡。消费者组的实例个数不能比分区的个数多。

Kafka 数据存储系统

  • Kafka 允许生产者返回 ack 来保证消息写入成功,且持久化。

  • Kafka 可以作为一种数据存储系统、

Kafka 流式数据处理

  • 数据处理器可以持续的接受数据处理流。

  • 针对复杂的数据转换,Kafka提供了一些 Stream API, 可以进行流的合并和计算。处理一些数据排序,数据修改,数据状态过滤等。

  • Kafka API 对输入、存储,分组提供了高性能的 API

综合处理

  • 流式处理、消息处理内容组合放置到一起。使得 Kafka

  • 存储历史数据更加便利,以存储未来的数据来进行组合,Kafka 作为流式数据平台和管道来说非常的成功

  • 单个数据可以处理历史数据也可以处理,未来的数据,实时订阅的方案能够成为消息队列。周期性的数据加载,

  • 流式数据处理能够进行一个数据的实时转换

Kafka 安装与生产者消费者创建

-- 解压 tar -zxvf kafka_2.12-2.4.0.tgz -- 启动zk  ./zookeeper-server-start.sh ../config/zookeeper.properties  -- 启动kafka ./kafka-server-start.sh ../config/server.properties -- 创建一个主题 ./kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic myTopic -- 向主题中发送消息 ./bin/kafka-console-producer.sh --broker-list localhost:9092 --topic myTopic  -- 创建消费者 ./bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic myTopic 复制代码

Zookeeper 说明

  • 提供分布式注册发现,分布式协调

  • zookeeper 抽象分布式信息


作者:老郑_
链接:https://juejin.cn/post/7022141517561069575


文章分类
后端
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐