厦门网站seo外包,网站关键词选取,wordpress 开启侧边栏,达人室内设计网站#x1f3af; 导读#xff1a;本文介绍了消息队列#xff08;MQ#xff09;的基本概念及其在分布式系统中的作用#xff0c;包括实现异步通信、削峰限流和应用解耦等方面的优势#xff0c;并对ActiveMQ、RabbitMQ、RocketMQ及Kafka四种MQ产品进行了对比分析#xff0c;涵… 导读本文介绍了消息队列MQ的基本概念及其在分布式系统中的作用包括实现异步通信、削峰限流和应用解耦等方面的优势并对ActiveMQ、RabbitMQ、RocketMQ及Kafka四种MQ产品进行了对比分析涵盖了它们的开发语言、吞吐量、时效性和可用性等特点。此外文章还特别介绍了RocketMQ包括其架构设计、高可用性实现方式以及消费模式等内容突出了RocketMQ在消息顺序消费、拉取模式、扩展性等方面的优势。 文章目录 MQ简介MQ定义MQ作用作用一异步作用二削峰限流作用三解耦 为什么要使用MQMQ使用流程实际业务 不同 MQ 产品对比RocketMQ简介相关重要概念RocketMQ为何高可用Broker内部结构生产和消费理解消费模式 MQ简介
MQ即Message Queue
Message消息消息可以是一句话、一个短信、一份邮件、一份业务数据Queue队列用来存放消息生产者将消息发送到队列中消费者到队列中获取消息进行消费
MQ定义
MQ是一个消息中间件如缓存中间件有redis、memcache数据库中间件有mycat、canal利用高效可靠的消息传递机制进行与平台无关跨平台的数据交流并基于数据通信来进行分布式系统的集成。通过提供消息传递和消息排队模型在分布式环境下提供应用解耦弹性伸缩冗余存储流量削峰异步通信数据同步等
MQ作用
为什么要用消息队列来存储消息生产者为什么不直接发给消费者
作用一异步
生产者发给消费者消费者在忙其他事当前没时间处理咋办生产者等着吗显然不合理。使用异步的方式生产者发完消息之后就去做自己的事情后续消费者有空再去队列中获取数据来执行业务即可
案例假如系统 A 希望发送一个消息给系统 B 去处理但系统 A 不关注系统 B 到底怎么处理或者有没有处理完系统 A 把消息发送给 MQ 就不管这条消息的死活了接着系统 B 从MQ里面消费出来处理即可。至于怎么处理是否处理完毕什么时候处理都是系统 B 的事与系统 A 无关。 这样的一种通信方式就是所谓的“异步”通信方式对于系统A来说只要把消息发给MQ然后系统B就会异步处去进行处理了系统A不需要“同步”的等待系统B处理完。这样的好处是什么呢解耦
作用二削峰限流
消费者的业务执行能力是有限的例如一个业务执行需要花费3秒。假如大量请求同时过来tomcat线程池的线程被占用完了后续的请求会报错503服务不可用。如果请求过来之后直接放到消息队列就返回这样就可以大大降低服务不可用的概率后续消费者再去消息队列里面慢慢获取业务信息去执行即可
作用三解耦
取消应用之间、模块之间的强耦合关系让程序更加健壮、高可用。如果模块都直接耦合在一块一个模块出问题很容易影响到其他模块。通过使用A模块-消息队列-B模块模式将A、B模块解耦
【应用系统解耦的好处】
发送者和接收者不必了解对方只需要确认消息发送者和接收者不必同时在线
为什么要使用MQ
1、做系统解耦当新的模块进来时可以做到代码改动最小; 解耦
2、让后端系统按自身吞吐能力进行消费不被瞬时流量冲垮; 削峰限流
3、通过强弱依赖梳理把非关键调用链路的操作异步化提升整体系统的吞吐能力; 异步处理
MQ使用流程
发送者把消息发给消息服务器消息服务器把消息存放在若干队列/主题中在合适的时候消息服务器会把消息转发给接收者。在这个过程中发送和接受是异步的发送无需等待发送者和接受者的生命周期没有必然关系。在发布pub/订阅sub模式下也可以完成一对多的通信即让一个消息有多个接受者例如微信订阅号 实际业务 不同 MQ 产品对比
MQ主要关注两个性能
吞吐量单位时间内可以处理多少条消息用消息大小来描述更准确因为消息内存越小数量会越大时效性生产者发消息MQ多久才收到消息
【对比】
特性ActiveMQRabbitMQRocket MQkafka开发语言javaerlangjavascala单机吞吐量万级万级10万级10万级时效性ms级us级ms级ms级以内可用性高(主从架构)高(主从架构)非常高(分布式架构)非常高(分布式架构)功能特性成熟的产品在很多公司得到应用有较多的文档各种协议支持较好基于Erlang开发所以并发能力很强性能极其好延时很低;管理界面较丰富MQ功能比较完备扩展性佳只支持主要的MQ功能像一些消息查询消息回溯等功能没有提供毕竟是为大数据准备的在大数据领域应用广。
【总结】
activeMQ使用java实现(jms 协议)性能一般出现早功能单一吞吐量低rabbitmq使用erlang实现(amqp 协议)性能好功能丰富吞吐量一般rocketmq使用java实现性能好功能最丰富吞吐量高kafka使用scala实现吞吐量最大功能单一专注读、写主要用于大数据领域数据又多又大
RocketMQ简介
官网 http://rocketmq.apache.org/ RocketMQ是阿里巴巴2016年MQ中间件使用Java语言开发是一款开源的分布式消息系统可以做集群基于高可用分布式集群技术提供低延时的、高可靠的消息发布与订阅服务。同时广泛应用于多个领域包括异步通信解耦、企业解决方案、金融支付、电信、电子商务、快递物流、广告营销、社交、即时通信、移动应用、手游、视频、物联网、车联网等。
具有以下特点
能够严格保证消息按照顺序消费提供丰富的消息拉取模式高效的订阅者水平扩展能力实时的消息订阅机制亿级消息堆积能力
相关重要概念
Producer生产者消息的发送者举例发件人Consumer消费者消息的接收者举例收件人Broker暂存和传输消息的通道举例快递公司NameServer管理Broker相当于broker的注册中心保留了broker的信息举例各个快递公司的管理机构Queue队列消息真实存放的位置一个Broker中可以有多个队列Topic主题消息的分类虚拟的结构用来区分不同类型的消息ProducerGroup生产者组ConsumerGroup消费者组多个消费者组可以同时消费一个主题的消息
【单机版本结构】 【消息发送流程】
Producer 询问 NameServerNameServer 分配一个 brokerProducer 将消息发给 brokerConsumer 询问 NameServer得到消息所在具体的broker然后消费消息
RocketMQ为何高可用
如何设计高可用消息队列
光是这样设置不是高可用的一旦broker挂了业务就中断 使用broker集群实现写的高可用 使用主从同步实现读的高可用。读可以去主节点读也可以去从节点读负载均衡 Broker内部结构
一个Broker里面可以存放多个Topic一个Topic里面可以存放多个队列 生产和消费理解 消费模式
MQ的消费模式可以大致分为两种
推 Push 服务端【MQ】主动推送消息给客户端优点是**及时性较好**但如果客户端没有做好流控一旦服务端推送大量消息到客户端时就会导致客户端消息堆积甚至崩溃客户端压力大拉 Pull 客户端需要主动到服务端【MQ】拉取数据优点是客户端可以依据自己的消费能力进行消费拉取的频率需要用户自己控制压力可控可以一次性拉取一批数据效率更高拉取频繁容易造成服务端和客户端的网络传输压力拉取间隔长又容易造成消费不及时实时性不强
DefaultMQPushConsumer consumer new DefaultMQPushConsumer(test-consumer-group);
DefaultMQPushConsumer consumer new DefaultMQPullConsumer(test-consumer-group);Push模式也是基于pull模式的不管是push还是pull实际底层都是pull只能客户端内部封装了api每隔一段时间去pull一次
一般场景下上游消息生产量小或者均速的时候选择push模式在特殊场景下例如电商大促抢优惠券等场景可以选择pull模式