| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 大数据 -> 54.整理RabbitMQ -> 正文阅读 |
|
[大数据]54.整理RabbitMQ |
消息队列的优点?解耦:将系统按照不同的业务功能拆分,生产者和消费者都不知道对方的存在,一个只负责发布,一个只负责取 异步:主流程只需要完成业务的核心功能,对于业务的非核心功能,将消息放入到消息之中进行异步处理,减少请求的等待,提高系统的总体性能 削峰/限流:将请求都写到消息队列中,消费服务器按照规定速度处理请求,防止请求并发过高使系统崩溃 消息队列的缺点?系统的可用性降低:系统引用的外部依赖越多,越容易挂掉,如果mq挂了,有可能导致整个系统的崩溃 系统复杂度提高,数据一致性问题等 消息队列的选型?RabbitMQ:中小型公司的选择,erlang语言天生具备高并发特性,管理界面用起来十分方便,社区活跃,微妙级别的延迟,基本不丢消息,吞吐量会稍微低一些,集群动态扩展困难 kafka:大型软件公司的选择,具备足够的资金搭建分布式环境,也具备足够大的数据量,当有大数据领域的实时计算,日志采集功能需求的时候使用kafka,经过参数化的配置,可以做到0丢失,吞吐量很高 RocketMQ:大型公司的选择,经过参数化配置可以做到消息0丢失,分布式扩展方便,性能可靠,但是社区活跃度一般,这个技术以后有可能被丢弃 RabbitMQ的构造?RabbitMQ是AMQP的一个开源实现,所以内部其实也是AMQP的概念:
Exchange交换机类型?direct:一对一,路由键必须完全匹配 fanout:把消息转发到所有绑定交换机的队列,此类型转发消息是最快的 topic:通过模糊匹配的方式对消息进行路由,可以使用*匹配一个单词,也可以使用#匹配0个或者多个单词 生产者生产消息的过程?
消费者接收消息的过程?
如何保证消息不被重复消费?重复消费的场景:由于网络故障,消费者发出的ack并没有即使传递给消息队列,导致消息队列不知道该消息已经被消费了,然后就将消息发送给了其他的消费者,导致了消息被重复消费
如何保证消息不丢失,进行可靠性传输?消息的丢失为三种:生产者丢消息,消息队列丢消息,消费者丢消息 RabbitMQ提供事务机制和确认机制来保证生产者不丢消息:
消息队列丢失数据:一般开启持久化磁盘,其配置如下:
消费者丢失消息一般是因为采用自动确认模式,在该模式下,当消息被消费者接收以后,消费者会通知broker消息已经收到了,这时broker就会将消息删除,这种情况下如果消费者异常而未能处理消息,那么就会丢失该消息,解决方案为手动确认消息
如何保证消息的有序性?方法一:拆分queue,使得一个queue值对应一个消费者,由于mq一般都可以保证内部队列先进先出,所以把需要保持先后顺序的一组消息通过某种算法撇皮到同一个消息队列中,只用一个消费者单线程区消费该队列,这样就可以保证消费者是按照顺序进行消费的了,但是使用多个消费者消费一个队列还是可能会出现顺序错乱的情况 方法二:对于多线程消费同一个队列的情况,可以使用重试机制,比如有一个微博业务场景的操作,发微博,写评论,删除微博,这三个异步操作,如果一个消费者先执行了写评论操作,这是微博都没有发,那么一定是失败的,等待一段时间,等另一个消费者,先执行发微博的操作后,再进行执行就可以成功 如何处理消息堆积的情况?出现该问题的原因?生产者的速度与消费者速度不匹配,消息消费失败反复重试等 解决方案?临时扩容,快速处理积压的消息:
恢复队列汇总丢失的数据:如果使用的是rabbitmq,并且设置了过期时间,消息在queue积压超过了一定时间会被rabbitmq清理掉,导致数据的丢失,这种情况下,队列其实没有积压消息,而是丢失了大量消息,这种情况可以采取"批量重导"的方案来解决,在流量地峰期,写一个程序,手动查询丢失的那部分数据,然后将消息重新发送到mq里,把丢失的数据重新补回来 mq长时间未处理导致mq写满:这种情况是临时扩容方案执行太慢,此时应该使用丢弃+批量重导的方式来解决了,首先临时写个程序,连接到mq里消费数据,消费一个丢弃一个,快速消费掉积压的消息,降低mq压力,然后在流量低峰区手动查询重导丢失的这部分数据 如何保证消息队列高可用?rabbitmq是基于主从做高可用的,有三种模式:单机(一般没人用),普通集群,镜像集群 普通集群模式通过添加节点来线性扩展消息队列的吞吐量,队列的消息只会存放在其中一个broker上,每个实例都同步queue的元数据,消费的时候,如果连接到了另外的实例,那么该实例就会从数据实际所在实例上的queue拉取消息,就是说让集群中多个节点拉以服务某个queue的读写操作 其缺点在于无高可用性,queue所在的节点如果宕机,其他实例就无法从那个实例拉取数据,并且mq内部会产生大量的数据传输 镜像队列集群模式正在的高可用模式,集群中包含一个主节点master和若干个从节点slave,如果master因为某种原因失效,那么按照slave加入的时间排序,资历最老的slave会被提升为新的master 镜像队列下,所有的消息只会向master发送,再由master广播给slave,所以master和slave的状态相同,比如写消息到queue时,master会自动将消息同步到各个slave的queue,如果消费者与slave建立连接并且订阅消费,其实也是从master获取消息,只不过看似是在slave上消费而已,因为消费者与salve建立连接,进行获取消息的请求,这个请求会由slave发送给master,再由master准备好数据返回slave,最后由slave投递给消费者 总结起来就是队列的元数据和消息会存在于多个实例上,也就是说每个rabbitmq节点都有这个queue的完整镜像,任何一个节点宕机,其他机器都包含了这个queue的完整数据,其他消费者都可以到其他节点上去消费数据 缺点在于:
延迟队列?优先级队列?rabbitmq的延迟队列基于死信队列和消息过期时间实现,消费者监听死信交换器绑定的队列,而不监听消息发送到的死信队列 优先级队列使用x-max-priority属性来实现,但是当消费速度大于生成速度的时候,且broker没有堆积的情况下,优先级显得没有意义 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 | -2025/1/16 5:46:46- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |