左client 客户端 生产者
broker 中转站
右client 客户端 消费者
exchange 交换机(快递员) 和 queue 队列(邮箱) 直接进行绑定
如果有个订单业务,用户下完单后就要发短信,
传统的实现方式都是给mysql,mysql插入数据,之后发短信,再取数据发送,但这里就比较耗时,也耗数据库的性能。
怎么优化呢?做拆分,异步任务
往mysql插入数据成功后,向rabbitMQ 插入数据,
如果发短信的话,rabbitMQ去发短信就好了
RabbitMQ的使用场景? (很多设计思想)
1.解耦 比如微服务中可以不同服务之间的消息通信
2.异步 将消息写入消息队列,非必要的业务逻辑以异步的方式运行。加快响应速度
3.削峰 并发量大的时候,所有请求直接到数据库,造成数据库连接异常
4.广播 基于Pub/Sub实现一对多通信
5.延迟信息处理 比如10分钟之后给下单未付款的用户发送邮件提醒 (TTL和死信队列)
TTL: 对于队列中超过该时间的消息将会被移除
死信队列这篇贼清晰
如何保证RabbitMQ不被重复消费? 幂等性问题
RabbitMQ有种机制,是当mq将信息给消费者,消费者消费完后,会向RabbitMQ回复已经ok(ps这个机制叫confirm机制),请删除这条数据,但是如果某种情况下,消费完后,没有收到回复,此时数据会再发给其他消费者,此时产生重复消费。用幂等性解决。
保证消息的唯一性,就算是多次传输,不要让消息的多次消费带来影响,保证消息幂等性。
mysql唯一键索引,或者主键。
比如 在写入消息队列的数据做唯一标识,消费消息时,根据唯一标识判断是否消费过。
解决幂等性问题!!!
如何保证RabbitMQ的高可用?
采用镜像集群
RabbitMQ如何保证消息的顺序性?
1.生产的消息,必须保证在投递到同一个队列,当消费者只有一个,防止多个消费者乱序
2.并且发送的时候,不要多线程 并发发送,要同步发送,防止多线程乱序发送
3.发送完后要采用confirm确认机制,确认发送成功了,才进行下一条发送。否则程序就执行中断进程,为了防止当前消息发送失败,然后下一条又开始发送并且发送成功。
RabbitMQ如何提高消息的消费速率?
1.增加消费者机器
2.优化代码,带宽等等
RabbitMQ有哪几种路由方式?
RabbitMQ 交换机与队列,队列与消费者的绑定关系是什么样的?多个消费者监听一个队列时,消息会重复消费吗?
RabbitMQ的vhost是什么? 起什么作用?
相当于mysql里面的数据库
RabbitMQ消息基于什么传输?
channel是在TCP之上的,一个TCP可以生成多个channel,channel是信道,TCP可以复用了
RabbitMQ 死信队列和延迟队列的使用?
消息被拒绝,并且requeue参数的值为false
消息过期了,
或者队列达到最长
使用消息队列会有什么缺点?
RabbitMQ多个消费者监听一个队列时,消息如何分发?
每次处理多少条,能力越大,处理的越多
qos
消息什么时候会变成死信?
RabbitMQ如何实现延时队列?
TTL (队列的消息存活时间或者消息存活时间)加上死信交换机
RabbitMQ的集群模式和集群节点类型?
如何自动删除长时间没有消费的消息
RabbitMQ集群怎么避免重启后消失丢失?
把消息持久化磁盘,保证服务器重启消息不丢失,每个集群中至少有一个物理磁盘,保证消息落入磁盘
RabbitMQ对集群节点停止顺序有要求么?
内存关机就会消失,磁盘里面是做持久化用的
RabbitMQ有哪些重要的组件?
消息的持久化是如何实现的?
如何保证消息不丢失
1生产者开启事务或者发送方确认机制 confirm
2设置持久化,
3.消费者开启消费确认机制 ack机制
RabbitMQ中的概念
RabbitMQ消息什么时候需要持久化?
官方介绍在两种情况下会消息写入磁盘
1.消息本身在于publish的时候就要求消息写入磁盘
2.内存紧张,需要将部分内存中的消息转移到磁盘
RabbitMQ消息什么时候会刷到磁盘?
如果让你写一个消息队列,该怎么进行架构设计?说一下你的思路
RabbitMQ是镜像集群,一个挂了,其他里面有同样的数据,而kafka则是有个分区的概念(多副本)
Kafka
消费者这里是4个
分为两个组,A组和B组
如果kafka发来消息,它会给每个组都会收到同一个消息,但是每个组里面有两个消费者,只会有一个会收到消息,不会重复消费一条。
消费者
1生产者往中间键推消息有一个ack机制(相当于RabbitMQ里面的confirm机制) 相当于确认机制
2还有个同步异步机制
同步推
异步推
partition 0 ,partition 1是分区,用来拓展用的
可以在别的服务器加分区,拓展性好,无限制的扩充。
依托磁盘 利用内存进行加速。
leader 分片和follower 副本
leader挂了之后,另一个服务的 副本就可以提升为分片。 一个leader两个follow
topic A 主题 类似rabbitmq的 队列
主题同时位于分区0,分区1上
主题可以存在多个分区。主题可以跨服务器和分区。分布式存储,不是单机存储。
一个主题可以无限扩充。
topic A 分区0 和1 存的数据是不一样的
同一个组的两个消费者,会接到不同服务器的不同分区的信息
zookeeper 保存的三台服务器的信息,以及分组数据,集群相关配置信息。
可以放到其他服务器。zookeeper也有leader和follow
kafka 中是怎么体现消息的顺序性的?
RabbitMQ 可靠 消费有ask 生成有confirm
kafka吞吐量大,生产有ask 消费是批量消费
用在日志收集
kafka 采用zookeeper对集群中的broker,consumer进行管理
rabbitMQ 是镜像模式
kafka可以通过增加分区进行扩展,而不需要通过添加额外的节点而在运行中造成任何停机