消息中间件系列(四):消息队列MQ的特点、选型、及应用场景详解
前面集中谈了分布式缓存Redis系列:
高并发架构系列:分布式锁的由来、特点、及Redis分布式锁的实现详解
高并发架构系列:Redis并发竞争key的解决方案详解
高并发架构系列:Redis缓存和MySQL数据一致性方案详解
Redis的高可用详解:Redis哨兵、复制、集群的设计原理,以及区别
高并发架构系列:Redis为什么是单线程、及高并发快的3大原因详解
如何解决Redis缓存雪崩、缓存穿透、缓存并发等5大难题
今天我们开始分布式之消息队列之旅。
什么是消息队列
消息队列(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.流量削锋
流量削锋也是消息队列中的常用场景,一般在秒杀或团抢活动中使用广泛。
应用场景:秒杀活动,一般会因为流量过大,导致流量暴增,应用挂掉。为解决这个问题,一般需要在应用前端加入消息队列。
具体可以参考:阿里P8架构师谈:双11秒杀系统如何设计?
4日志处理
日志处理是指将消息队列用在日志处理中,比如Kafka的应用,解决大量日志传输的问题。
5消息通讯
消息队列一般都内置了高效的通信机制,因此也可以用于单纯的消息通讯,比如实现点对点消息队列或者聊天室等。
你可能也喜欢:
- 消息中间件系列(九):详解RocketMQ的架构设计、关键特性、与应用场景
- 消息中间件系列(三):主流的消息队列中间件有哪些?
- 消息中间件系列(一):消息中间件介绍、典型使用场景、以及使用原则
- 消息中间件系列(二):Kafka的原理、基础架构、以及使用场景
- 消息中间件系列(五):MQ消息队列的12点核心原理总结
- 消息中间件系列(六):什么是流量削峰?如何解决秒杀业务的削峰场景
消息中间件系列(四):消息队列MQ的特点、选型、及应用场景详解相关推荐
- Kafka入门教程其一 消息队列基本概念 及常用Producer Consumer配置详解学习笔记
文章目录 1. 综述 2. 消息队列(Message Queue) 2.1 点对点 2.2 发布/订阅(pub-sub) 3. Kafka基础术语解释 3.1 Broker 3.2 Partition ...
- java队列_RPC远程调用和消息队列MQ的区别
RPC和MQ同样都是用于分布式系统的两个很重要的技术,都有服务提供者.消费者的概念,可在一定程度上对系统进行解耦.但两者之间还是有区别的,本篇简单介绍~ 一.RPC RPC(Remote Proced ...
- 消息队列MQ技术介绍
一. 消息队列概述 消息队列中间件是分布式系统中重要的组件,主要解决应用耦合.异步消息.流量削锋等问题.实现高性能.高可用.可伸缩和最终一致性架构.是大型分布式系统不可缺少的中间件. 目前在生产环境, ...
- 消息队列的使用场景_消息队列MQ的特点、选型及应用场景
一.什么是消息队列 消息队列(Message Queue,简称MQ),指保存消息的一个容器,本质是个队列. 消息(Message)是指在应用之间传送的数据,消息可以非常简单,比如只包含文本字符串,也可 ...
- 后端技术:消息队列MQ/JMS/Kafka相关知识介绍
?今天给大家分享消息队列MQ/JMS/Kafka相关知识介绍 1.消息队列介绍 首先举个收快递的栗子,传统的收快递,快递小哥把我们的快递送到我们的手里.他需要什么条件嗯? 快递小哥有时间送, 我们有时 ...
- 详解RPC远程调用和消息队列MQ的区别
谈到分布式架构,就不得不谈到分布式架构的基石RPC. 什么是RPC RPC(Remote Procedure Call)远程过程调用,主要解决远程通信间的问题,不需要了解底层网络的通信机制. RPC服 ...
- Linux安装消息队列IBM MQ 7.5开发版安装配置详解
消息队列IBM MQ 7.5开发版安装配置详解 文章目录 消息队列IBM MQ 7.5开发版安装配置详解 前言 一.什么是IBM MQ? 二.安装前准备 1.安装前准备 2.安装MQ Server 3 ...
- 阿里云消息队列MQ学习—阿里云大学视频课
在刷ACE题的过程中,感觉对于消息队列部分的理解不是很深刻,这里来学习一下. 例行还是先走一遍阿里云大学的一些视频课程扫扫盲,选择如下课程: 阿里消息队列MQ简介:阿里巴巴中间件技术部自主研发的专业消 ...
- Cris 玩转大数据系列之消息队列神器 Kafka
Cris 玩转大数据系列之消息队列神器 Kafka Author:Cris 文章目录 Cris 玩转大数据系列之消息队列神器 Kafka Author:Cris 1. Kafka 概述 1.1 消息队 ...
最新文章
- 聊一聊我认识的Linux系统
- 给大家介绍一个相当好的播放器 J River Media Center 15
- nginx稳定版本_Nginx简介
- Python3序列解包
- php输出查询mysql中文乱码_解决php mysql查询插入中文乱码问题
- LeetCode 910. Smallest Range II
- PAT乙级 1005继续3n+1猜想
- HTML5 vs. Flash:Adobe面向何方?
- Load balancer does not have available server for client:xxx
- 【c4d学习笔记】对称方向不对的问题
- 上拉/下拉电阻选值怎么定
- 【Day3.3】美攻铁道市场零距离接触行驶中的火车
- 例说STM32F7高速缓存——Cache一致性问题(三)
- 在ODBC 中 应 用DDX 和RFX (转)
- docker 的具名挂载与匿名挂载
- OPA Gatekeeper 策略入门
- How to set the Default Page in ASP.NET?
- java街边熟食店卤菜网上商城系统springboot+vue
- 区块链简单实现之p2p网络多节点同步
- errors were encountered while processing qmail qmail-run
热门文章
- eval()解析JSON
- static关键字 void和void指针 函数指针
- mysql - 内存表使用总结
- 用 Shell 快速写一个嵌入式测试框架
- 你需要知道的Linux 系统下外设时钟管理
- nyoj 586 疯牛(二分+贪心)
- java dao 单元测试_Spring Service、Dao进行Junit单元测试
- 最新车载导航端口检测工具_高德地图这个功能 把微信都没做好的车载社交解决了?...
- 前端为什么有的接口明明是成功回调却执行了.catch失败回调_前端进阶高薪必看-手写源码篇(高频技术点)...
- LeetCode 2139. 得到目标值的最少行动次数(贪心)