消息队列
1.安装RabbitMQ
1.下载镜像
2.安装MQ
docker run -e RABBITMQ_DEFAULT_USER=rzp -e RABBITMQ_DEFAULT_PASS=123 --name mq --hostname mq1 -p 15672:15672 -p 5672:5672 -d rabbitmq:3-management
RABBITMQ_DEFAULT_USER以及RABBITMQ_DEFAULT_PASS为管理平台的账户密码
15672为管理平台的端口,5672为通讯的端口
输入账号密码后即可进入管理平台
channel:操作MQ的工具
exchange:路由消息到队列中
queue:缓存消息
virtual host:虚拟主机,是对queue/exchange等资源的逻辑分组
2.简单队列案例学习
根据导入的demo,首先进行生产者测试
进行调试完成连接、通道、队列的创建,后台均可见
结果显示,说明消费者与队列执行是异步的,当消费者执行后不等待MQ,因此先打印等待接受
同时MQ中的消息也为0了,即刻被消费
3.利用SpringAMQP实现上述基础消息队列功能
1.引入AMQP依赖
2.编写生产者测试方法
测试结果:
3.编写消费者监听方法
依赖已在父工程下定义
方法定义完成后通过springboot运行可以发现接受到了消息
4.利用SpringAMQP实现工作队列功能
1.模拟50个消息发送
2.模拟2个消费者
3.消息预取限制
在消费者中设置,设置预取个数,当完成后再取,从而实现“能者多劳”,避免消息的堆积
5.发布订阅模型
1.Fanout Exchange
Fanout Exchange 会将接收到的消息路由到每一个跟其绑定的queue
1)声明exchange/queue/binding配置
重新运行consumer
2)消费者监听
3)生产者测试
结果显示:一次发送两个消费者均收到了消息
2.DirectExchange
1)声明exchange/queue/binding配置(在消费者定义)
directexchange并没有在配置类下绑定,而是直接在消费者方法中通过配置绑定
绑定显示
2)生产者测试
结果显示仅有指定key的队列收到了
重新更换key测试
由于两个消费者均绑定了key red,因此结果均可收到
所以directexchange可以实现fanoutexchange的功能
3.TopicExchange
1)声明exchange/queue/binding配置(在消费者定义)
2)生产者测试
由于两个消费者绑定的key要求都满足,因此
6.消息转换器
父工程中添加依赖
同样在消费者也需要使用相同的MessageConverter(在消费者和生产者均写下上述代码)
7.Kafka
主要参考了尚硅谷的B站视频:https://www.bilibili.com/video/BV1vr4y1677k?p=32&vd_source=bb2ac23e78d52dd5cfbc35180c451a2d
基础架构
可以利用命令行直接操作
1.生产者
基本流程:主线程中分区器将数据记录在缓存队列(内存)中,当达到默认的/设置的batch.size或linger.ms时,sender线程会拉取数据,其中的selector会将请求发送到kafka集群,若发送成功,会将sender线程及内存中该数据清除,若失败了会重试
1.生产者发送
需要配置连接集群以及序列化类型
添加回调函数可以获取发送信息
如果需要实现同步发送数据,区别在于添加了get方法
2.分区
指定分区,在send方法中的producerecord实例的构造方法直接定义分区则可向指定分区发送数据
若没有指定分区,指定了key,则依照key的hash值与总分区数取模来确定分区
自定义分区器
实现分区器接口重写方法
在属性配置时设置即可
3.提高生产者吞吐量
通过调整缓冲区大小 ,发送间隔时间,发送 批次大小以及压缩进行调整
4.可靠性考量
5.数据重复
涉及到幂等性及kafka事务的知识,参考到很棒的文章:https://zhuanlan.zhihu.com/p/411171789
2.Broker
几个重要的概念:
- Producer(生产者) : 产生消息的一方。
- Consumer(消费者) : 消费消息的一方。
- Broker(代理) : 可以看作是一个独立的 Kafka 实例。多个 Kafka Broker 组成一个 Kafka Cluster。
- Topic(主题) : Producer 将消息发送到特定的主题,Consumer 通过订阅特定的 Topic(主题) 来消费消息。
- Partition(分区) : Partition 属于 Topic 的一部分。一个 Topic 可以有多个 Partition ,并且同一 Topic 下的 Partition 可以分布在不同的 Broker 上,这也就表明一个 Topic 可以横跨多个 Broker 。
1.Follower故障
2.Leader故障
3.消费者consumer
1.总体工作流程
注意一个分区一定只有一个消费者消费
2.消费者初始化流程
注意第7点再平衡机制
3.消费者组详细消费流程
本文来自博客园,作者:面向机器编程,转载请注明原文链接:https://www.cnblogs.com/face-to-machine-program/articles/16372626.html