一、什么是消息队列

消息队列(Message Queue,简称MQ),指保存消息的一个容器,本质是个队列。

消息(Message)是指在应用之间传送的数据,消息可以非常简单,比如只包含文本字符串,也可以更复杂,可能包含嵌入对象。

消息队列(Message Queue)是一种应用间的通信方式,消息发送后可以立即返回,有消息系统来确保信息的可靠专递,消息发布者只管把消息发布到MQ中而不管谁来取,消息使用者只管从MQ中取消息而不管谁发布的,这样发布者和使用者都不用知道对方的存在。

  • Producer:消息生产者,负责产生和发送消息到 Broker;
  • Broker:消息处理中心。负责消息存储、确认、重试等,一般其中会包含多个 queue;
  • Consumer:消息消费者,负责从 Broker 中获取消息,并进行相应处理;

现在常用的MQ组件有ActiveMQ、RabbitMQ、RocketMQ、ZeroMQ,当然近年来火热的Kafka,从某些场景来说,也是MQ,当然kafka的功能更加强大。

虽然不同的MQ都有自己的特点和优势,但是,不管是哪种MQ,都有MQ本身自带的一些特点,下面,咱们谈谈消息队列的的特点、优势、选型、以及应用场景。

二、为什么需要消息队列

在高并发分布式环境下,由于来不及同步处理,通过使用消息队列,可以异步处理请求,从而缓解系统的压力。

举一个订单系统的例子:用户点击下订单,会触发以下业务逻辑流程:

  • 扣减库存
  • 生成相应的订单
  • 发短信通知等等

在业务发展初期这些逻辑可能放在一起同步执行,随着业务订单量增长,需要提升系统服务的性能,这时候可以将一些不需要立即生效的操作拆分出来异步执行,比如发短信通知等,这种场景就可以使用消息队列MQ。

本质还是通过异步来解决同步的系统压力,所以我们在做架构设计的时候有一个原则:能异步的就尽量不要同步。

三、消息队列的优点

1、屏蔽异构平台的细节:发送方、接收方系统之间不需要了解双方,只需认识消息。

2、异步:消息堆积能力;发送方接收方不需同时在线,发送方接收方不需同时扩容(削峰)。

3、解耦:防止引入过多的API给系统的稳定性带来风险;调用方使用不当会给被调用方系统造成压力,被调用方处理不当会降低调用方系统的响应能力。

4、复用:一次发送多次消费。

5、可靠:一次保证消息的传递。如果发送消息时接收者不可用,消息队列会保留消息,直到成功地传递它。

6、提供路由:发送者无需与接收者建立连接,双方通过消息队列保证消息能够从发送者路由到接收者,甚至对于本来网络不易互通的两个服务,也可以提供消息路由。

四、消息队列的特点

1.异步性

将耗时的同步操作,通过以发送消息的方式,进行了异步化处理。减少了同步等待的时间。

2.松耦合

消息队列减少了服务之间的耦合性,不同的服务可以通过消息队列进行通信,而不用关心彼此的实现细节,只要定义好消息的格式就行。

3.分布式

通过对消费者的横向扩展,降低了消息队列阻塞的风险,以及单个消费者产生单点故障的可能性(当然消息队列本身也可以做成分布式集群)。

4.可靠性

消息队列一般会把接收到的消息存储到本地硬盘上(当消息被处理完之后,存储信息根据不同的消息队列实现,有可能将其删除),这样即使应用挂掉或者消息队列本身挂掉,消息也能够重新加载。

五、消息队列的选型

1.ActiveMQ

Apache出品,最早使用的消息队列产品,时间比较长了,最近版本更新比较缓慢。

2.RabbitMQ

RabbitMQ是erlang语言开发,结合erlang语言本身的并发优势,支持很多的协议:AMQP,XMPP, SMTP, STOMP,也正是如此,使的它变的非常重量级,更适合于企业级的开发。性能较好,但是不利于做二次开发和维护。

3.RocketMQ

阿里开源的消息中间件,纯Java开发,具有高吞吐量、高可用性、适合大规模分布式系统应用的特点。

4.ZeroMQ

号称最快的消息队列系统,尤其针对大吞吐量的需求场景。

扩展性好,开发比较灵活,采用C语言实现,实际上只是一个socket库的重新封装,如果做为消息队列使用,需要开发大量的代码。

5.Kafka

Kafka是Apache下的一个子项目,是一个高性能跨语言分布式发布/订阅消息队列系统,而Jafka是在Kafka之上孵化而来的,即Kafka的一个升级版。

6.消息队列的详细比较

7.消息队列总结

消息队列的选型需要根据具体应用需求而定,ZeroMQ小而美,RabbitMQ大而稳,Kakfa和RocketMQ快而强劲。

四、消息队列的应用场景

1.异步处理

消息队列的主要特点是异步处理,主要目的是减少请求响应时间,实现非核心流程异步化,提高系统响应性能。

所以典型的使用场景就是将比较耗时而且不需要即时(同步)返回结果的操作,作为消息放入消息队列。

2.应用解耦

使用了消息队列后,只要保证消息格式不变,消息的发送方和接收方并不需要彼此联系,也不需要受对方的影响,即解耦。

每个成员不必受其他成员影响,可以更独立自主,只通过消息队列MQ来联系。

举一个例子:用户下订单流程,下订单后会发生扣库存这个动作,上游系统订单下游系统扣库存,就可以通过上图的消息队列MQ来联系,扣库存异步化,从而实现订单系统与库存系统的应用解耦。

3.流量削锋

流量削锋也是消息队列中的常用场景,一般在秒杀或团抢活动中使用广泛。

应用场景:秒杀活动,一般会因为流量过大,导致流量暴增,应用挂掉。为解决这个问题,一般需要在应用前端加入消息队列。

4.日志处理

日志处理是指将消息队列用在日志处理中,比如Kafka的应用,解决大量日志传输的问题。

5.消息通讯

消息队列一般都内置了高效的通信机制,因此也可以用于单纯的消息通讯,比如实现点对点消息队列或者聊天室等。

以上,是分布式之消息队列的详解。

如果觉得不错,请点赞支持下。关注优知学院专栏【直通BAT】进阶Java架构师,实战架构技术干货第一时间送达。

----end----

优知学院往期分享的【消息队列系列文章】精选干货,包括MQ的设计思路、核心原理、如何选型、场景应用等,成体系的知识分享,让你深度掌握MQ。

如何从0到1设计一个MQ消息队列

MQ消息队列的12点核心原理总结

RPC远程调用和消息队列MQ的区别

Kafka、RocketMQ、RabbitMQ的优劣势比较

主流消息队列MQ比较,MQ的4类应用场景

消息队列的使用场景_消息队列MQ的特点、选型及应用场景相关推荐

  1. python中队列的应用用场景_消息队列应用场景

    原文http://blog.csdn.net/konglongaa/article/details/52208273 一.消息队列概述 消息队列中间件是分布式系统中重要的组件,主要解决应用解耦,异步消 ...

  2. python中队列的应用用场景_消息队列使用的四种场景介绍

    四.JMS消息服务 讲消息队列就不得不提JMS .JMS(JavaMessage Service,Java消息服务)API是一个消息服务的标准/规范,允许应用程序组件基于JavaEE平台创建.发送.接 ...

  3. 多级队列调度算法可视化界面_多级反馈队列调度算法

    我是一名计算机专业的学生,很荣幸在这里结识各位编程高手.今天第一次写东西,希望大家多多支持,多多留言哦.以下是一个多级反馈队列调度算法,请各位帮忙看看对不对.如果谁能帮写一个更好的那就更感谢了.THA ...

  4. 多级队列调度算法可视化界面_多级反馈队列调度算法、各种调度算法小结等

    下面我们首先介绍,多级反馈队列调度算法 然后对前面介绍的各种调度算法进行比较 之后呢,我们简单讨论一下 在设计多处理器调度算法时所要考虑的几个问题 多级反馈队列调度算法 是 UNIX 的一个分支,BS ...

  5. 队列和通知区别_消息队列,阻塞队列

    DelayQueue--Leader/Followers模式: 来自:小鱼儿_karl 延迟队列DelayQueue take() 源码分析​blog.csdn.net [18]java锁之wait, ...

  6. ios个推透传消息json接收不到_消息通讯——Websocket

    说起即时通讯大家应该都听过,像各种聊天软件用到的即时通讯技术是最多的.另外开发过程中实现消息推送最传统的做法就是轮询,即按照特定时间间隔由浏览器对服务器发送请求,以获取最新消息,这种传统模式带来很明显 ...

  7. java数据结构队列杨辉三角_使用队列实现杨辉三角

    使用队列实现杨辉三角 杨辉三角的特点: 除了第一行,其他行两端都为1: 从第三行开始可以看出,除了两端,其中每个数都是元素本身上面对着的两个数的和: 奇数行有奇数个数,偶数行有偶数个数,都是n个数 每 ...

  8. redis watch使用场景_详解redis中的锁以及使用场景

    分布式锁 什么是分布式锁? 分布式锁是控制分布式系统之间同步访问共享资源的一种方式. 为什么要使用分布式锁? ​ 为了保证共享资源的数据一致性. 什么场景下使用分布式锁? ​ 数据重要且要保证一致性 ...

  9. 边缘计算应用场景_云计算与边缘计算协同九大应用场景(2019年)发布(附PPT解读)...

    为了进一步促进云计算创新发展,建立云计算信任体系,规范云计算行业,促进市场发展,提升产业技术和服务水平.由中国信息通信研究院(以下简称"中国信通院")主办,中国通信标准化协会.中国 ...

最新文章

  1. Camelyon Challenge: 癌症细胞区域检测竞赛
  2. serverless 框架_Malaguv1.4.1支持Serverless的微服务框架
  3. 开源 免费 java CMS - FreeCMS1.5-数据对象-guestbook
  4. 1056 组合数的和 (15 分)—PAT (Basic Level) Practice (中文)
  5. workbench拓扑优化教程_ANSYS经典案例在Workbench中实现 | 基于网格重划分的金属成型仿真分析...
  6. 最新可用双端美化版在线音乐播放器网站源码
  7. Linux查看服务器自动关机,Linux系统自动关机的命令详解
  8. flv.js插件播放flv格式的视频实例(vue)
  9. localstorage在safri下的坑
  10. java mpp转图片,Java使用mpxj导入.mpp格式的Project文件(甘特图)
  11. Excel 通过DDE与INTOUCH通信,数据格式
  12. 远程桌面桌面无法找到计算机,Windows – 远程桌面客户端找不到远程计算机
  13. MATLAB:Radon正变换的理解
  14. 2021年保育员(中级)考试及保育员(中级)考试资料
  15. 机器翻译与编码-解码模型 Machine Translation and Encoder-Decoder Models
  16. python网络安全怎么学_新手如何学习网络安全?
  17. python中模块打补丁
  18. Python 爬虫 批量下载论坛图片
  19. 【转】bit、Byte、bps、Bps、pps、Gbps的单位详细说明及换算
  20. 城市餐饮店铺选址分析

热门文章

  1. linux运行 netcore,linux 下netcore程序开机自动启动服务
  2. l298n电机哪一端为正_一文详解电机倒顺开关接法!
  3. python的in,is和id函数
  4. C语言 memset()函数(内存初始化函数)
  5. 如何重命名磁盘盘符名?
  6. 启动过滤器异常 java.lang.AbstractMethodError: ‘void javax.servlet.Filter.init(javax.servlet.FilterConfig)‘
  7. 尚硅谷最新版JavaWeb全套教程,java web零基础入门完整版(三)
  8. Average and Median(500)dp,二分 AtCoder Beginner Contest 236
  9. php 实验室管理系统,生物信息实验室管理系统-Metalims安装
  10. mysql 对象_查看MySQL中的对象