一. MQ基础知识
1. 常见的MQ
Kafka, ActiveMQ, RabbitMQ, RocketMQ
在大数据场景下,主要使用Kafka,在javaee中主要采用ActiveMQ, RabbitMQ, RocketMQ
2. MQ作用
(1)削峰
(2)解耦
(3)异步
3. 消息队列的模式
(1)点对点模式
(2)发布订阅模式
二. Kafka基础架构
1. 在同一个消费者组中(每条消息只能被该组中的一个消费者消费),每个分区只能由一个固定消费者进行处理,否则后续很难维护;
2. 分区有leader和follower之分,读写只在leader副本上进行,follower副本(HA)只负责数据同步;
3. zk记录集群节点状态,记录副本的leader信息,leader选举。由于zk逐渐成为了kafka的瓶颈,去除zk是后续的方向
三. Kafka开发入门
1. 启动配置
(1)broker.id:集群中每个节点的唯一编号,不能重复
(2)log.dir:日志存储目录
(3)zookeeper.connect:zk连接信息,而且建议创建指定目录存放,否则kafka信息会打散到各个地方
2. 命令行
(1)topic:
1)create: 1个分区,3个副本
bin/kafka-topics.sh --bootstrap-server server01:8081 --topic demo --create --partitions 1 --replication-factor 3
2)list:
bin/kafka-topics.sh --bootstrap-server server01:8081 --list
3)describe:
bin/kafka-topics.sh --bootstrap-server server01:8081 --describe
4)alter: 将分区数改成3,分区数只能增加,因为如果减少的话,合并后的分区无法确定消费者的offset。副本数无法通过命令行进行修改
bin/kafka-topics.sh --bootstrap-server server01:8081 --alter --partition 3
(2)producer:
bin/kafka-console-producer.sh --bootstrap-server server01:8081 --topic demo
(3)consumer:
bin/kafka-console-consumer.sh --bootstrap-server server01:8081 --topic demo --from-beginning
3. Kafka生产者
3.1 原理
涉及两个线程:main线程和sender线程,main线程中创建了一个双端队列RecordAccumulator,main线程将消息发送给RecordAccumulator,RecordAccumulator中的消息达到指定大小或者等待指定时长后,通过sender线程从RecordAccumulator中将消息取出来发送到Kafka broker。
发送后,默认可以最多有5个批次的数据不进行应答,超过后不再向kafka发送数据。
3.2 Kafka异步发送消息
异步发送是指:
外部数据发送到kafka client的RecordAccumulator队列中就算发送完毕,对后续的数据从RecordAccumulator队列发送到Kafka broker不再关心。
同步发送是指:
外部数据发送到kafka broker之后才算完成,才会发送下一批数据。
代码:
1. 依赖
org.apache.kafka:kafka-clients:3.0.0
2. 逻辑代码
(1)普通异步发送代码
(2)带回调方法的异步发送代码
回调方法获取到的返回的元数据信息是从RecordAccumulator中返回的。
3.3 Kafka同步发送消息
3.4 生产者分区
1. 分区好处
2. 分区策略
1)默认分区器:DefaultPartitioner
3. 自定义分区策略
1)编写自定义分区器
2)将自定义分区器注册到properties中
3.5 提高生产者吞吐量
batch.size: 批次大小,默认16K,可以修改为32K;
linger,ms: 等待时间,修改为5-100ms;
compression.type: 压缩,例如snappy;
RecordAccumulator: 缓冲区大小,修改为64M。
注意吞吐量与消息延时的权衡。
3.6 生产者数据可靠性
代码:
3.7 生产者数据重复性
1. 数据传递语义
(1)幂等性原理
开发方法:enable.idempotence,默认为true,关闭时设置为false
(2)生产者事物
代码:
3.8 生产者数据有序性