消息队列

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



浙公网安备 33010602011771号