(四)数据传输——kafka消息队列

kafka概述

1. 引言

Kafka是由Apache软件基金会开发的一个开源流处理平台,由Scala和Java编写。Kafka是一种高吞吐量分布式发布订阅消息系统,它可以处理消费者在网站中的所有动作流数据。

kafka架构

1. 架构图

kafka

2. 组件及其功能

Broker

每个Kafka Server称之为一个Broker,多个Broker可以组成Kafka Clutser。
一个节点上可以有一个或者多个Broker,多个Broker连接到相同的zookeeper组成了Kafka集群。

Topic

Kafka是一个发布订阅消息系统
Topic就是消息类名,一个Topic中通常存放一类消息,每一个Topic都有一个或者多个订阅者,也就是消费者。
Producer 将消息推送到Topic,有订阅该Topic的Consumer从Topic中拉取消息。

Topic 和 Broker

一个Broker 上可以创建一个或者多个Topic,一个Topic可以分布在同一集群下的多个Broker。

topic和broker

Partition

kafka会为每个Topic维护多个分区(partititon),每个分区会映射到一个逻辑的日志(log)文件,一个Topic可以被划分为多个分区(自定义)

在这里插入图片描述

Partition Distribution

对于同一个partiton,它所在任何一个broker,都有能扮演两种角色:leader、follower。
每个partition的Leader用于处理到该partiton的读写请求。
每个partition的followers是用于异步的从它的leader中复制数据。
Kafka会动态维护一个与Leader保持一致的同步副本(in-sync replicas (ISR))集合,并且会将最新的同步副本(ISR )集合持久化到zookeeper。如果leader出现问题了,就会从该partition的followers中选举一个作为新的leader。

partitions

3. 角色及其功能

Producer

Producer的任务是向Broker发送数据。Kafka提供了两种Producer接口,一种是Low Level接口,使用该接口会向特定的Broker的某个Topic下的某个Partition发送数据,另一种是High Level接口,支持同步/异步发送数据,基于zookeeper的Broker自动识别和进行负载均衡(基于Partitioner)。

Consum

在Kafka中,同样有consumer group的概念,它是逻辑上将一些consumer分组。因为每个kafka consumer是一个进程。所以一个consumer group中的consumers将可能是由分布在不同机器上的不同的进程组成的。Topic中的每一条消息可以被多个consumer group消费,然而每个consumer group内只能有一个consumer来消费该消息。所以,如果想要一条消息被多个consumer消费,那么这些consumer就必须是在不同的consumer group中。所以也可以理解为consumer group才是topic在逻辑上的订阅者。
每个consumer可以订阅多个topic。
每个consumer会保留它读取到某个partition的offset。而consumer 是通过zookeeper来保留offset的

  • 组内均分
  • 组件广播
    consumer group

kafka特点

1. 高效数据传输

2. 无状态Broker

Broker没有副本机制,一旦Broker宕机,该Broker的消息都将不可用。Broker不保存订阅者的状态,由订阅者自己保存。
无状态导致消息的删除成为难题,(可能删除的消息正在被订阅),kafka采用基于时间的SLA(服务水平保证),消息一般保存7天后被删除。
消息订阅者可以Rewind Back到任意位置重新进行消费,当订阅者由故障时,可以选择最小的Offset重新读取消费信息。

3. Consumer Group

4. Zookeeper协调控制

管理Broker与Consumer的动态加入和离开。
触发负载均衡,当Broker或Consumer加入或离开时会触发负载均衡算法,使得一个Consumer Group内的多个Consumer的订阅负载均衡。
维护消费关系和每个Partiton的消费信息。

5. Zookeeper上的细节

6. 消息交付保证

kafka对消息的重复、丢失、错误以及顺序没有严格的要求。
kafka提供At-least-once Delivery,即当Consumer宕机后,有些消息可能会被重复Delivery(交货)。
因为每个Partition只会被Consumer Group内的一个Consemer消费,故kafka保证每个Partiton内的消息会被顺序的订阅。
kafka为每条消息计算CRC校验,用于错误检测,CRC校验不通过的消息会直接被丢弃掉。

kafka安装

1. 环境要求

  • zookeeper正常启动

2. 安装(单机)

  • 解压缩
 tar -zxvf kafka_2.11-0.11.0.0.tgz -C /usr/kafka/
  • 配置 vim config/server.properties
zookeeper.connect=localhost:2181
delete.topic.enable=true
log.dirs=/usr/kafka/kafka_2.11-0.11.0.0/kafka-logs
listeners = PLAINTEXT://SparkOnYarn:9092
  • 启动zookeeper
./bin/zkServer.sh start conf/zk.cfg
  • 启动kafka服务
./bin/kafka-server-start.sh config/server.properties

kafak的使用

创建topic

 ./bin/kafka-topics.sh --create --partitions 10 --replication-factor 1 --topic test --zookeeper localhost:2181
Created topic "test". # 创建成功

创建Producer

 ./bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test

创建Consumer

./bin/kafka-console-consumer.sh --topic test --zookeeper localhost:2181

生产者幂等性和事务问题

生产者幂等性

在真正的生产环境中,往往会因为网络等种种原因,导致生产者会重复生产消息。生产者在重试的时候,往往可能前一个消息已经生产过了,但是仍然生了重复的消息。这样就会导致数据紊乱,比如在使用MongoDB的时候,如果不加控制的话有可能会出现了两个重复的用户。

所以为了应对此等场景,kafka也有其解决办法,那就是kafka的幂等性。

幂等:多次操作最终的影响等价与一次操作称为幂等性操作,所有的读操作一定是幂等的。所有的写操作一定不是幂等的,当生产者和broker默认有acks应答机制,如果当生产者发送完数据给broker之后如果没有在规定的时间内收到应答,生产者可以考虑重发数据,可以通过一下配置参数提升生产者的可靠性。

配置:

acks = all // 0 无需应答  n 应答个数 -1所有都需要
retries = 3 // 表示重试次数
request.timeout.ms = 3000 //等待应答超时时间
enable.idempotence = true //开启幂等性

生产者事务

kafka生产者事务指的是在发送多个数据的时候,保证多个Record记录发送的原子性。如果有一条发送失败就回退,但是需要注意在使用kafka事务的时候需要调整消费者的事务隔离级别设置为read_committed因为kafka默认的事务隔离策略是read_uncommitted

开启事务

transactional.id=transaction-1 //必须保证唯一
enable.idempotence=true //开启kafka的幂等性
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

郭建華

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值