消息队列

 

 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

几个重要的概念:

  1. Producer(生产者) : 产生消息的一方。
  2. Consumer(消费者) : 消费消息的一方。
  3. 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.消费者组详细消费流程

 

posted @ 2022-06-13 22:46  面向机器编程  阅读(17)  评论(0编辑  收藏  举报