MQ系列(0)——MQ简介
mq简介
mq 就是消息队列(Message Queue)。想必大家对队列的数据结构已经很熟悉了,消息队列可以简单理解为:把要传输的数据放在队列中,mq 就是存放和发送消息的这么一个队列中间件。在消息队列中,把数据放到消息队列的角色叫做 生产者,从消息队列中消费获取数据的叫做 消费者。
那么消息队列有哪些使用场景呢? 六字真言:异步削峰解耦。
MQ的异步
异步概念想必大家都熟悉了,就是 a应用(或程序) 将数据传递给b应用(或程序)后,不等待b的响应结果直接做下一步动作,而b并行执行,提高效率。使用mq,就能完美支持异步:a将数据发送到mq,然后自己该干嘛干嘛,b监听mq的消息,来了消息就消费它。这样就做到程序或者应用间的异步。
mq的削峰
首先我们要知道什么是削峰:削峰的全称应该叫削峰填谷。削峰就是当应用或者程序的请求量过大的时候,将一部分请求延时处理,放到请求量不大时间段去处理它。mq削峰填谷的原理也很简单,mq在应用程序中相当于一个 “蓄水池” 的作用——当 “水流量(请求)” 过大的时候,“蓄水池(mq)” 将 "水" 先存起来。当有能力去消费这些水的时候再去从 “蓄水池” 放水。实际的过程是——请求数据先发到 mq ,应用程序监听mq 并消费消息。当请求量大于消费量的时候,请求积压在mq中存储;当消费量大于请求量的时候,请求就会慢慢被处理完。这听上去就像小学做的游泳池放水排水的数学题。
mq的解耦
mq解耦性是显而易见的,应用程序直接不直接互相耦合,甚至可以不用知道对方的存在。它想要发出什么样的请求,或者拿什么数据,都是去找mq。mq就像个搬运工一样在这些应用之间搬运数据。
mq 协议及产品
mq 协议有两种,jms 和 AMQP 。通常而言提到JMS(Java MessageService)实际上是指 JMS API 。JMS 是由Sun公司早期提出的消息标准,旨在为java应用提供统一的消息操作,包括create、send、receive
等。JMS已经成为 Java Enterprise Edition 的一部分。从使用角度看,JMS和JDBC担任差不多的角色,用户都是根据相应的接口可以和实现了 JMS 的服务进行通信,进行相关的操作。
JMS角色概念:
JMS provider:实现了JMS接口的消息中间件,如ActiveMQ
JMS client:生产或者消费消息的应用
JMS producer/publisher:JMS消息生产者
JMS consumer/subscriber :JMS消息消费者
JMS message:消息,在各个JMS client传输的对象;
JMS queue:Provider存放等待被消费的消息的地方
JMS topic:一种提供多个订阅者消费消息的一种机制;在MQ中常常被提到,topic模式。
AMQP(advanced message queuing protocol) 在2003年时被提出,最早用于解决金融领不同平台之间的消息传递交互问题。AMQP是一种 binary wire-level protocol(链接协议)。AMQP 不从 API 的层面层对使用规范进行限定,而是直接定义网络交换的数据格式。这意味着实现了amqp协议的消息队列中间件支持跨平台。我们可以使用 Java 的 AMQP provider 而 consumer 可以是golang 。
在AMQP中,消息路由(messagerouting)和JMS存在一些差别,在AMQP中增加了 Exchange 和 binding 的角色。producer 将消息发送给 Exchange ,binding 决定 Exchange 的消息应该发送到那个 queue,而consumer直接从queue中消费消息。queue和exchange的bind有consumer来决定。
相对而言,AMQP的消息队列使用的更为广泛。如 rabbitMQ , kafka , rocketMQ 等都是实现AMQP协议的消息队列。接下来我们将会学习 rabbitMQ 和 kafka 的相关知识。
MQ系列(0)——MQ简介的更多相关文章
- 【 D3.js 入门系列 --- 0 】 简介和安装
D3的全称是(Data-Driven Documents),顾名思义可以知道是一个关于数据驱动的文档的javascript类库.如果你不知道什么是javascript,请先学习javascript的相 ...
- 【 D3.js 入门系列 --- 0 】 简介及安装
家是我的个人博客: http://www.ourd3js.com/ ,csdn博客首页为:http://blog.csdn.net/lzhlzz/.转载请注明出处,谢谢. D3的全称是(Data-D ...
- 《吃透MQ系列》之扒开Kafka的神秘面纱
大家好,这是<吃透 MQ 系列>的第二弹,有些珊珊来迟,后台被好几个读者催更了,实属抱歉! 这篇文章拖更了好几周,起初的想法是:围绕每一个具体的消息中间件,不仅要写透,而且要控制好篇幅,写 ...
- 【SpringBoot MQ 系列】RabbitMq 核心知识点小结
[MQ 系列]RabbitMq 核心知识点小结 以下内容,部分取材于官方教程,部分来源网络博主的分享,如有兴趣了解更多详细的知识点,可以在本文最后的文章列表中获取原地址 RabbitMQ 是一个基于 ...
- 【SpringBoot MQ 系列】RabbitListener 消费基本使用姿势介绍
[MQ 系列]RabbitListener 消费基本使用姿势介绍 之前介绍了 rabbitmq 的消息发送姿势,既然有发送,当然就得有消费者,在 SpringBoot 环境下,消费可以说比较简单了,借 ...
- 《吃透MQ系列》核心基础全在这里了
这是<吃透XXX>技术系列的开篇,这个系列的思路是:先找到每个技术栈最本质的东西,然后以此为出发点,逐渐延伸出其他核心知识.所以,整个系列侧重于思考力的训练,不仅仅是讲清楚 What,而是 ...
- MQ系列3:RocketMQ 架构分析
MQ系列1:消息中间件执行原理 MQ系列2:消息中间件的技术选型 1 背景 我们前面两篇对主流消息队列的基本构成和技术选型做了详细的分析.从本篇开始,我们会专注当下主流MQ之一的RocketMQ. 从 ...
- MQ系列4:NameServer 原理解析
MQ系列1:消息中间件执行原理 MQ系列2:消息中间件的技术选型 MQ系列3:RocketMQ 架构分析 1 关于NameServer 上一节的 MQ系列3:RocketMQ 架构分析,我们大致介绍了 ...
- MQ系列5:RocketMQ消息的发送模式
MQ系列1:消息中间件执行原理 MQ系列2:消息中间件的技术选型 MQ系列3:RocketMQ 架构分析 MQ系列4:NameServer 原理解析 在之前的篇章中,我们学习了RocketMQ的原理, ...
随机推荐
- GYM100962A ABBA
题目链接:https://vjudge.net/problem/Gym-100962A 题目大意: 给出一个 \(h \times w\) 的目标矩阵.定义一种 \(h \times w\) 的矩阵, ...
- Golang源码学习:调度逻辑(一)初始化
本文所使用的Golang为1.14,dlv为1.4.0. 源代码 package main import "fmt" func main() { fmt.Println(" ...
- Pyqt5_QlineEdit
QlineEdit 方法 setAlignment() 按固定值方式对齐文本 Qt.AlignLeft:水平方向靠左对齐 Qt.AlignRight:水平方向靠右对齐 Qt.AlignCenter:水 ...
- 0418部分HomeWork案例
/* 月份 输入月份,对应返回该月份的天数 利用switch的穿透性,可将多个case合到一个代码块 */ import java.util.Scanner; class HomeWork5{ pub ...
- 用Linux感觉低效吗?来看看这几个技巧!
Linux已经成为目前最火的操作系统之一,尽管现在的Linux用户很多,但很多使用Linux的同学发现,他们在Linux下的工作效率并不高,那么这是为什么呢?其实使用Linux也可以很舒适,通过一 ...
- 5.List链表类型介绍和操作
数据类型List链表 (1)介绍 list类型其实就是一个双向链表.通过push,pop操作从链表的头部或者尾部添加删除元素.这使得list既可以用作栈,也可以用作队列. 该list链表类型应用场景: ...
- [python爬虫]简单爬虫功能
在我们日常上网浏览网页的时候,经常会看到某个网站中一些好看的图片,它们可能存在在很多页面当中,我们就希望把这些图片保存下载,或者用户用来做桌面壁纸,或者用来做设计的素材. 我们最常规的做法就是通过鼠标 ...
- 数据库原理实验指导(三)使用SQL语言进行简单查询【转载csdn】
--1.查询全体学生的学号和姓名select sno,sname from student --2.查询全体学生的详细记录select * from student --3.查询软件学院的学生姓名,年 ...
- leetcode976之三角形最大周长
题目描述: 给定由一些正数(代表长度)组成的数组 A,返回由其中三个长度组成的.面积不为零的三角形的最大周长. 如果不能形成任何面积不为零的三角形,返回 0. def largePara(A): A. ...
- 北京理工大学复试上机--2001B
1.请输入高度 h,输入一个高为 h,上底边长为 h的等腰梯形(例如 h=4,图形如下). **** ****** ******** ********** #include <ios ...