前面集中谈了分布式缓存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消息通讯

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

你可能也喜欢:

  1. 消息中间件系列(九):详解RocketMQ的架构设计、关键特性、与应用场景
  2. 消息中间件系列(三):主流的消息队列中间件有哪些?
  3. 消息中间件系列(一):消息中间件介绍、典型使用场景、以及使用原则
  4. 消息中间件系列(二):Kafka的原理、基础架构、以及使用场景
  5. 消息中间件系列(五):MQ消息队列的12点核心原理总结
  6. 消息中间件系列(六):什么是流量削峰?如何解决秒杀业务的削峰场景

消息中间件系列(四):消息队列MQ的特点、选型、及应用场景详解相关推荐

  1. Kafka入门教程其一 消息队列基本概念 及常用Producer Consumer配置详解学习笔记

    文章目录 1. 综述 2. 消息队列(Message Queue) 2.1 点对点 2.2 发布/订阅(pub-sub) 3. Kafka基础术语解释 3.1 Broker 3.2 Partition ...

  2. java队列_RPC远程调用和消息队列MQ的区别

    RPC和MQ同样都是用于分布式系统的两个很重要的技术,都有服务提供者.消费者的概念,可在一定程度上对系统进行解耦.但两者之间还是有区别的,本篇简单介绍~ 一.RPC RPC(Remote Proced ...

  3. 消息队列MQ技术介绍

    一. 消息队列概述 消息队列中间件是分布式系统中重要的组件,主要解决应用耦合.异步消息.流量削锋等问题.实现高性能.高可用.可伸缩和最终一致性架构.是大型分布式系统不可缺少的中间件. 目前在生产环境, ...

  4. 消息队列的使用场景_消息队列MQ的特点、选型及应用场景

    一.什么是消息队列 消息队列(Message Queue,简称MQ),指保存消息的一个容器,本质是个队列. 消息(Message)是指在应用之间传送的数据,消息可以非常简单,比如只包含文本字符串,也可 ...

  5. 后端技术:消息队列MQ/JMS/Kafka相关知识介绍

    ?今天给大家分享消息队列MQ/JMS/Kafka相关知识介绍 1.消息队列介绍 首先举个收快递的栗子,传统的收快递,快递小哥把我们的快递送到我们的手里.他需要什么条件嗯? 快递小哥有时间送, 我们有时 ...

  6. 详解RPC远程调用和消息队列MQ的区别

    谈到分布式架构,就不得不谈到分布式架构的基石RPC. 什么是RPC RPC(Remote Procedure Call)远程过程调用,主要解决远程通信间的问题,不需要了解底层网络的通信机制. RPC服 ...

  7. Linux安装消息队列IBM MQ 7.5开发版安装配置详解

    消息队列IBM MQ 7.5开发版安装配置详解 文章目录 消息队列IBM MQ 7.5开发版安装配置详解 前言 一.什么是IBM MQ? 二.安装前准备 1.安装前准备 2.安装MQ Server 3 ...

  8. 阿里云消息队列MQ学习—阿里云大学视频课

    在刷ACE题的过程中,感觉对于消息队列部分的理解不是很深刻,这里来学习一下. 例行还是先走一遍阿里云大学的一些视频课程扫扫盲,选择如下课程: 阿里消息队列MQ简介:阿里巴巴中间件技术部自主研发的专业消 ...

  9. Cris 玩转大数据系列之消息队列神器 Kafka

    Cris 玩转大数据系列之消息队列神器 Kafka Author:Cris 文章目录 Cris 玩转大数据系列之消息队列神器 Kafka Author:Cris 1. Kafka 概述 1.1 消息队 ...

最新文章

  1. 聊一聊我认识的Linux系统
  2. 给大家介绍一个相当好的播放器 J River Media Center 15
  3. nginx稳定版本_Nginx简介
  4. Python3序列解包
  5. php输出查询mysql中文乱码_解决php mysql查询插入中文乱码问题
  6. LeetCode 910. Smallest Range II
  7. PAT乙级 1005继续3n+1猜想
  8. HTML5 vs. Flash:Adobe面向何方?
  9. Load balancer does not have available server for client:xxx
  10. 【c4d学习笔记】对称方向不对的问题
  11. 上拉/下拉电阻选值怎么定
  12. 【Day3.3】美攻铁道市场零距离接触行驶中的火车
  13. 例说STM32F7高速缓存——Cache一致性问题(三)
  14. 在ODBC 中 应 用DDX 和RFX (转)
  15. docker 的具名挂载与匿名挂载
  16. OPA Gatekeeper 策略入门
  17. How to set the Default Page in ASP.NET?
  18. java街边熟食店卤菜网上商城系统springboot+vue
  19. 区块链简单实现之p2p网络多节点同步
  20. errors were encountered while processing qmail qmail-run

热门文章

  1. eval()解析JSON
  2. static关键字 void和void指针 函数指针
  3. mysql - 内存表使用总结
  4. 用 Shell 快速写一个嵌入式测试框架
  5. 你需要知道的Linux 系统下外设时钟管理
  6. nyoj 586 疯牛(二分+贪心)
  7. java dao 单元测试_Spring Service、Dao进行Junit单元测试
  8. 最新车载导航端口检测工具_高德地图这个功能 把微信都没做好的车载社交解决了?...
  9. 前端为什么有的接口明明是成功回调却执行了.catch失败回调_前端进阶高薪必看-手写源码篇(高频技术点)...
  10. LeetCode 2139. 得到目标值的最少行动次数(贪心)