php响应式网站,商丘互联网公司,东莞宣布优化防疫措施,雄安网站建设400多少钱目录
1、什么是 rabbitmq
2、为什么要使用 rabbitmq
3、使用 rabbitmq 的场景
4、如何确保消息正确地发送至 RabbitMQ#xff1f; 如何确保消息接收方消费了消息#xff1f;
5、如何避免消息重复投递或重复消费#xff1f;
6、消息基于什么传输#xff1f;
7、消息如…
目录
1、什么是 rabbitmq
2、为什么要使用 rabbitmq
3、使用 rabbitmq 的场景
4、如何确保消息正确地发送至 RabbitMQ 如何确保消息接收方消费了消息
5、如何避免消息重复投递或重复消费
6、消息基于什么传输
7、消息如何分发
8、消息怎么路由
9、如何确保消息不丢失
10、使用 RabbitMQ 有什么好处
11、RabbitMQ 的集群
12、mq 的缺点 1、什么是 rabbitmq 采用 AMQP 高级消息队列协议的一种消息队列技术,最大的特点就是消费并不需要确保提供方存在,实现了服务之间的高度解耦 2、为什么要使用 rabbitmq
1、在分布式系统下具备异步,削峰,负载均衡等一系列高级功能;
2、拥有持久化的机制进程消息队列中的信息也可以保存下来。
3、实现消费者和生产者之间的解耦。
4、对于高并发场景下利用消息队列可以使得同步访问变为串行访问达到一定量的限流利于数据库的操作。
5、可以使用消息队列达到异步下单的效果排队中后台进行逻辑下单。 3、使用 rabbitmq 的场景
1、服务间异步通信
2、顺序消费
3、定时任务
4、请求削峰 4、如何确保消息正确地发送至 RabbitMQ 如何确保消息接收方消费了消息
发送方确认模式 将信道设置成 confirm 模式发送方确认模式则所有在信道上发布的消息都会被指派一个唯一的 ID。 一旦消息被投递到目的队列后或者消息被写入磁盘后可持久化的消息信道会发送一个确认给生产者包含消息唯一 ID。 如果 RabbitMQ 发生内部错误从而导致消息丢失会发送一条 nacknotacknowledged未确认消息。 发送方确认模式是异步的生产者应用程序在等待确认的同时可以继续发送消息。当确认消息到达生产者应用程序生产者应用程序的回调方法就会被触发来处理确认消息。
接收方确认机制 消费者接收每一条消息后都必须进行确认消息接收和消息确认是两个不同操作。只有消费者确认了消息RabbitMQ 才能安全地把消息从队列中删除。这里并没有用到超时机制RabbitMQ 仅通过 Consumer 的连接中断来确认是否需要重新发送消息。也就是说只要连接不中断RabbitMQ 给了 Consumer 足够长的时间来处理消息。保证数据的最终一致性
下面罗列几种特殊情况 如果消费者接收到消息在确认之前断开了连接或取消订阅RabbitMQ 会认为消息没有被分发然后重新分发给下一个订阅的消费者。可能存在消息重复消费的隐患需要去重 如果消费者接收到消息却没有确认消息连接也未断开则 RabbitMQ 认为该消费者繁忙将不会给该消费者分发更多的消息。 5、如何避免消息重复投递或重复消费 在消息生产时MQ 内部针对每条生产者发送的消息生成一个 inner-msg-id作为去重的依据消息投递失败并重传避免重复的消息进入队列在消息消费时要求消息体中必须要有一个 bizId对于同一业务全局唯一如支付 ID、订单 ID、帖子 ID 等作为去重的依据避免同一条消息被重复消费。 6、消息基于什么传输 由于 TCP 连接的创建和销毁开销较大且并发数受系统资源限制会造成性能瓶颈。RabbitMQ 使用信道的方式来传输数据。信道是建立在真实的 TCP 连接内的虚拟连接且每条 TCP 连接上的信道数量没有限制。 7、消息如何分发 若该队列至少有一个消费者订阅消息将以循环round-robin的方式发送给消费者。每条消息只会分发给一个订阅的消费者前提是消费者能够正常处理消息并进行确认。
通过路由可实现多消费的功能 8、消息怎么路由
消息提供方-路由-一至多个队列 消息发布到交换器时消息将拥有一个路由键routing key在消息创建时设定。 通过队列路由键可以把队列绑定到交换器上。 消息到达交换器后RabbitMQ 会将消息的路由键与队列的路由键进行匹配针对不同的交换器有不同的路由规则
常用的交换器主要分为一下三种
fanout如果交换器收到消息将会广播到所有绑定的队列上
direct如果路由键完全匹配消息就被投递到相应的队列
topic可以使来自不同源头的消息能够到达同一个队列。 使用 topic 交换器时可以使用通配符 9、如何确保消息不丢失
消息持久化当然前提是队列必须持久化 RabbitMQ 确保持久性消息能从服务器重启中恢复的方式是将它们写入磁盘上的一个持久化日志文件当发布一条持久性消息到持久交换器上时Rabbit 会在消息提交到日志文件后才发送响应。 一旦消费者从持久队列中消费了一条持久化消息RabbitMQ 会在持久化日志中把这条消息标记为等待垃圾收集。如果持久化消息在被消费之前 RabbitMQ 重启那么 Rabbit 会自动重建交换器和队列以及绑定并重新发布持久化日志文件中的消息到合适的队列。 10、使用 RabbitMQ 有什么好处
1、服务间高度解耦
2、异步通信性能高
3、流量削峰 11、RabbitMQ 的集群
镜像集群模式 你创建的 queue无论元数据还是 queue 里的消息都会存在于多个实例上然后每次你写消息到 queue 的时候都会自动把消息到多个实例的 queue 里进行消息同步。 好处在于你任何一个机器宕机了没事儿别的机器都可以用。坏处在于第一这个性能开销也太大了吧消息同步所有机器导致网络带宽压力和消耗很重第二这么玩儿就没有扩展性可言了如果某个 queue 负载很重你加机器新增的机器也包含了这个 queue 的所有数据并没有办法线性扩展你的 queue 12、mq 的缺点
系统可用性降低 系统引入的外部依赖越多越容易挂掉本来你就是 A 系统调用 BCD 三个系统的接口就好了人 ABCD 四个系统好好的没啥问题你偏加个 MQ 进来万一MQ 挂了咋整MQ 挂了整套系统崩溃了你不就完了么。
系统复杂性提高 硬生生加个 MQ 进来你怎么保证消息没有重复消费怎么处理消息丢失的情况怎么保证消息传递的顺序性头大头大问题一大堆痛苦不已
一致性问题 A 系统处理完了直接返回成功了人都以为你这个请求就成功了但是问题是要是 BCD 三个系统那里BD 两个系统写库成功了结果 C 系统写库失败了咋整你这数据就不一致了。 所以消息队列实际是一种非常复杂的架构你引入它有很多好处但是也得针对它带来的坏处做各种额外的技术方案和架构来规避掉最好之后你会发现妈呀系统复杂度提升了一个数量级也许是复杂了 10 倍。但是关键时刻用还是得用的 互联网Java工程师面试题·Spring Boot篇·第二弹-CSDN博客 千题千解·Java面试宝典_时光の尘的博客-CSDN博客