RABBITMQ为什么要使用
1、问:为什么要使用rabbitMq呢?
面试官问这个问题,肯定是想知道你们公司有一个什么场景需要使用到这个Mq,这个场景有一个什么技术挑战导致必须要用这个mq,用了这个mq之后有什么好处。mq经典的使用场景有解耦,异步,削锋。
异步通信:当一个系统收到请求,需要在自己系统处理数据,处理完后,还需要把数据发送给其他系统。而每个系统接收请求后处理数据的时间不一致。如果是同步请求的话,需要等待所有请求处理完之后,才能将结果返回。而异步是非阻塞的,可以直接将结果返回,然后再去处理数据。用mq可以把这个同步通信的过程变成异步通信的流程,从而达到一个低延时的特性。
系统耦合:当一个项目中,有多个系统时会发生严重的耦合。当一个系统有一个很重要的基础数据,而其他系统也需要这些数据。如果其他系统挂掉了,还怎么将这些消息发送出去。这个时候我们可以将消息发送到mq上,如果其他系统需要这些基础数据,可以直接去mq里面消费就行,不需要关系系统有没有挂掉,或者超时的情况。这就是mq的一个发布消息订阅模型,可以降低系统的耦合度。
流量削锋:当系统在某一瞬间有五千个请求进来时,而我们系统最多能处理两千条请求。那我们可以从mq中处理系统所承受的最大限度的请求,等高峰期一过,就将在mq中积压的请求全部处理掉。
缺点:不过使用mq,会导致系统可用性降低,复杂度提高。系统本身的外部依赖越多越容易挂掉,如果系统好好地,但是mq划掉的,整个项目就用不了了。还有如果硬生生加进来一个mq,还要考虑怎么保证数据的一致性,如果一个系统处理完数据后结果返回成功了,但是系统其他系统有一个报错了,数据就会不一致。,有没有重复性消费,如果数据丢失了怎么办。
工作模型:
RabbitMQ 交换机类型
1、直连交换机(Direct Exchange):当一个交换机绑定一个队列,再绑定一个routing key ,当发送消息时,指定一个bingding key,这样消息发送到交换机时,会被送到指定的队列里面去。是一种发布/订阅模式。
2、扇形交换机(Fanout Exchange):发所有接收到的消息全部发送的交换机所绑定的队列,不需要思考,速度最快。是一种广播模式。
3、主题交换机(Topic Exchange):routing key根据一定的规则进行匹配,*:表示一个单词;#表示任意数量单词。当一个队列的绑定键为#的时候,这个队列将会无视消息的路由键,接收所有的消息。
4、首部交换机(Header Exchange):忽略了routing key ,通过headers匹配。将一个交换机声明成首部交换机,绑定一个队列的时候,定义一个 Hash 的数据结构,消息发送的时候,会携带一组 hash 数据结构的信息,当 Hash 的内容匹配上的时候,消息就会被写入队列。
绑定交换机和队列的时候,Hash 结构中要求携带一个键 “x-match”,这个键的 Value 可以是 any 或者 all,这代表消息携带的 Hash 是需要全部匹配 (all),还是仅匹配一个键 (any) 就可以了。相比直连交换机,首部交换机的优势是匹配的规则不被限定为字符串 (string)。
匹配规则 x-match 有下列两种类型:
x-match = all :表示所有的键值对都匹配才能接受到消息
x-match = any :表示只要有键值对匹配就能接受到消息
死信:
当消息过期,超时无人消费;要投递的消息满了,无法投递;消费者使用basic.reject或basic.nack声明消费失败,并且消息的request参数设置为false。
2、消息丢失了怎么办
1.生产者弄丢了数据,可以开启rabbitMq的事务同步机制,在发送数据之前开启事务channel.txSelect(),然后再发送消息,如果消息没有被rabbitMq成功接收到,那么生产者就会收到异常消息,此时就能通过channel.txRollback()回滚事务,然后重新发送消息。发送成功后通过channel.txCommit()提交事务。不过事务同步机制比较耗性能,吞吐量会下降。
为了避免数据丢失,还可以采用confirm机制。事务机制是同步的,提交了事务后,线程会一直阻塞在那。confirm机制是异步的,发送完消息后还能立即发送下一条消息,rabbitMq接收到消息后,会异步回调告诉你消息已经收到了。不过这两种模式是不能共存的。
1、普通confirm模式,客户端发送一条消息后,调用waitForConfirms()方法,等待服务端确认,如果返回false,或者一段时间内没有反应,客户端就会重新发送一次消息。
2、批量confirm模式,发送一批消息后,调用waitForConfirms()方法,然后服务端统一处理。
3、异步confirm模式,客户端发送了一条或多条消息后,服务端确认了之后会执行一个回调方法。
2、消费者消息丢失,可以开启rabbitMq持久化,将消息写入磁盘中。如果mq挂了,再次启动时,会重新读取磁盘中的消息。
设置持久化:
1、创建queue队列时,可以将队列设置成持久化;
2、发送消息时,将消息的deliveryMode=2,设置消息持久化,这样就能将把消息写入磁盘中。
如果消息还未来得及写入磁盘中就挂了,也会造成消息丢失。所以必须将持久化和confirm机制配合在一起,这样即使消息还未来得及写入进磁盘中,只要消息还未给生产者ack确认,客户端也能重新发送消息。
3、消费者消息丢失,必须关闭自动ack机制,使用手动ack机制。
3、消息的幂等性、
单独mq不能保证消息重复消费,只能从业务的角度来判断消息是否重复消费。
3、rabbitMq的高可用
1、rabbitMq有三种模式,单机模式,普通集群模式,镜像集群模式。
普通集群,消费者随机从一个实例中获取数据,如果这个队列的实例宕机了,只能等实例恢复后,才能重新消费。
镜像集群,在mq控制管理后台添加镜像集群模式的策略,指定的时候是可以要求数据同步到所有节点的,也可以要求同步到指定数量的节点,再次创建 queue 的时候,应用这个策略,就会自动将数据同步到其他的节点上去了。每个rabbitMq节点都有队列的完整镜像,每次写消息的时候,都会将消息同步到多个实例的queue上。
4、日志追踪
firehose,tracing
5、使用场景
1、不是实时的,并且需要性能;
2、mq是异步的,性能高
rabbitMq遵循了amqp协议
RABBITMQ为什么要使用相关推荐
- RabbitMQ 入门系列(11)— RabbitMQ 常用的工作模式(simple模式、work模式、publish/subscribe模式、routing模式、topic模式)
1. simple 模式 simple 模式是最简单最常用的模式 2. work 模式 work 模式有多个消费者 消息产生者将消息放入队列.生产者系统不需知道哪一个任务执行系统在空闲,直接将任务扔到 ...
- Go 学习笔记(57)— Go 第三方库之 amqp (RabbitMQ 生产者、消费者整个流程)
1. 安装 rabbitmq 的 golang 包 golang 可使用库 github.com/streadway/amqp 操作 rabbitmq .使用下面命令安装 RabbitMQ . go ...
- RabbitMQ 入门系列(4)— RabbitMQ 启动、停止节点和应用程序、用户管理、权限配置
1. 服务器管理 我们使用 "节点" 来指代 RabbitMQ 实例,当我们谈到 RabbitMQ 节点时指的是 RabbitMQ 应用程序和其所在的 Erlang 节点. 1.1 ...
- RabbitMQ 入门系列(3)— 生产者消费者 Python 代码实现
生产者消费者代码示例 上一章节中对消息通信概念做了详细的说明,本章节我们对 RabbitMQ 生产者和消费者代码分别做一示例说明. 1. 生产者代码 #!/usr/bin/env python # c ...
- RabbitMQ 入门系列(2)— 生产者、消费者、信道、代理、队列、交换器、路由键、绑定、交换器
本系列是「RabbitMQ实战:高效部署分布式消息队列」和 「RabbitMQ实战指南」书籍的读书笔记. RabbitMQ 中重要概念 1. 生产者 生产者(producer)创建消息,然后发送到代理 ...
- RabbitMQ 入门系列(1)— Ubuntu 安装 RabbitMQ 及配置
1. RabbitMQ 简介 消息 (Message) 是指在应用间传送的数据.消息可以非常简单,比如只包含文本字符串.JSON等,也可以很复杂,比如内嵌对象. 消息队列中间件(Message Que ...
- RabbitMQ超详细安装教程(Linux)
目录 1.简介 2.下载安装启动RabbitMQ 2.1.下载RabbitMQ 2.2.下载Erlang 2.3.安装Erlang 2.4.安装RabbitMQ 2.5.启动RabbitMQ服务 3. ...
- 第五节 RabbitMQ在C#端的应用-消息收发
原文:第五节 RabbitMQ在C#端的应用-消息收发 版权声明:未经本人同意,不得转载该文章,谢谢 https://blog.csdn.net/phocus1/article/details/873 ...
- RabbitMQ学习笔记一:本地Windows环境安装RabbitMQ Server
一:安装RabbitMQ需要先安装Erlang语言开发包,百度网盘地址:http://pan.baidu.com/s/1jH8S2u6.直接下载地址:http://erlang.org/downloa ...
- RabbitMQ使用及与spring boot整合
1.MQ 消息队列(Message Queue,简称MQ)--应用程序和应用程序之间的通信方法 应用:不同进程Process/线程Thread之间通信 比较流行的中间件: ActiveMQ Rabbi ...
最新文章
- 1030 Travel Plan (30 分) 【难度: 中 / 知识点: 最短路】
- cool venn diagram
- Java、Python、JS、C语言,哪个更值得学?
- 弃用官方网站!Python 将所有 Bug 迁移到 GitHub 中
- 类库 通用变量 is和as 委托
- Android之解决java.lang.UnsatisfiedLinkError: dlopen failed: ××××.so: has text relocations
- 一种简易的聊天泡泡设置颜色以及添加描边的方式
- DHTMLX Grid Crack
- Python组合数据类型
- TTF 字体文件 删除不了,提示已经在System 打开
- 对不起,我被裁员了。
- linux设备如何获取经纬度,openlayers鼠标移动获取地图经纬度格式化的两种方式
- 推荐|45个值得收藏的Python优质资源(附链接)
- Chrome浏览器安装devtools开发者工具
- 当代年轻人下班行为报告:我下班了,却又没完全下班
- 2020届c++工程师求职准备——计划篇(2019.03.05.)
- 基于Java的社区团购系统丨团购商城系统
- wmi服务或wmi提供程序_什么是WMI提供程序主机(WmiPrvSE.exe),为什么使用那么多的CPU?...
- print 中文输出乱码
- 正则表达式教程及练习
热门文章
- 网页与浏览器的关系(0)
- 背了 100 个面试题库,开放性问题还是不会
- 【JavaWeb】TableDemo 表格隔行显色+鼠标悬停高亮显示
- C/C++ 实现屏幕绘制字体
- java 6位随机数_关于java:生成6位数的随机数
- Codeforces 1326C. Permutation Partitions
- 【有共鸣转载一下】毕业后,读这么一篇——《那些事,大学才读懂》,或许才懂大学
- Fink SQL和Table API
- linux安装v100驱动,Nvidia Linux Display Driver v100.14.19
- 移动互联网 网民高达6.86亿