为什么需要消息队列MQ

主要原因:是在高并发情况下,由于来不及同步处理,请求往往会发生堵塞,比如诸多的insert、update之类的请求同时到达mysql,直接导致无数的行锁表锁,甚至最后请求会堆积很多,从而触发大量的too mang  connnections错误。通过消息队列,我们可以异步处理请求,从而缓解系统的压力。

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

MQ(message queue)是一种跨进程的通信机制,用于上下游传递消息。

mq的特点

1、先进先出

       不能先进先出,都不能说是队列了,消息队列的顺序在入队时基本已经确定,一般是不需要人工干预的。而且最重要的是,数据是只有一条数据在使用中,这也是mq在众多场景中被使用的原因。

2、发布订阅

       发布订阅是一种很高效的处理方式,如果不发生阻塞,基本可以当做是同步操作。这种处理方式能非常有效的提升服务器利用率,这样的应用场景非常广泛。

3、持久化

       持久化确保MQ的使用不只是一个部分场景的辅助工具,而是让MQ能像数据库一样存储核心的数据。

4、分布式

      在现在大流量、大数据的使用场景下,只支持单体应用的服务器软件基本是无法使用的,支持分布式的部署,才能被广泛使用。而且,MQ的定位就是一个高性能的中间件。

应用场景

基于上文所述的特点,那么MQ就衍生出了很多的使用场景,在大型的系统中,应用非常广泛,这里我们就列举一下常见的应用场景

应用解耦(异步) 

系统之间进行数据交互时,在时效性和稳定性之间我们都要进行选择;基于线程的异步处理,能确保用户体验,但在极端情况下,可能会出现异常,影响系统的稳定性,而同步调用很多时候无法保证理想的性能,那么我们就可以用mq来进行处理,上游系统将数据投递到mq,下游系统取mq的数据进行消费,投递和消费可以用同步的方式处理,因为mq接收数据的性能是非常高的,不会影响上游系统的性能,那么下游系统的及时率能保证吗?当然可以,不然就不会有下面的一个应用场景。

通知

 这里就用到了前文一个重要的特点,发布订阅,下游系统一直在监听MQ的数据,如果MQ有数据,下游系统则会按照 先进先出 这样的规则, 逐条进行消费 ,而上游系统只需要将数据存入MQ里,这样既降低了不同系统之间的耦合度,同时也确保了消息通知的及时性,而且也不影响上游系统的性能。

限流

上文有说了一个非常重要的特性,MQ 数据是只有一条数据在使用中。 在很多存在并发,而又对数据一致性要求高,而且对性能要求也高的场景,如何保证,那么MQ就能起这个作用了。不管多少流量进来,MQ都会让你遵守规则,排除处理,不会因为其他原因,导致并发的问题,而出现很多意想不到脏数据。

数据分发

MQ的发布订阅肯定不是只是简单的一对一,一个上游和一个下游的关系,MQ中间件基本都是支持一对多或者广播的模式,而且都可以根据规则选择分发的对象。这样上游的一份数据,众多下游系统中,可以根据规则选择是否接收这些数据,这样扩展性就很强了。
PS:上文中的上游和下游,在MQ更多的是叫做生产者(producer)和消费者(consumer)

分布式事务

分布式事务是我们开发中一直尽量避免的一个技术点,但是,现在越来越多的系统是基于微服务架构开发,那么分布式事务成为必须要面对的难题,解决分布式事务有一个比较容易理解的方案,就是二次提交。基于MQ的特点,MQ作为二次提交的中间节点,负责存储请求数据,在失败的情况可以进行多次尝试,或者基于MQ中的队列数据进行回滚操作,是一个既能保证性能,又能保证业务一致性的方案,当然,这个方案的主要问题就是定制化较多,有一定的开发工作量。

应用示例

为了更加直观的展示MQ的应用场景,这里我们就用一个常见的电商系统中的几个业务,来具体说明下MQ在实际开发中应用场景。
我们的实际场景大概是一个基于微服务架构的电商系统,分为用户微服务、商品微服务、订单微服务、促销微服务等。基于微服务模式开发的系统,MQ的使用场景更多,下面我们逐一说明:
1、注册后我们可能需要做很多初始化的操作,如:调用邮件服务器发送邮件、调用促销服务赠送优惠劵、下发用户数据到客户关系系统等。那么这时候我们将这些操作去监听MQ,当用户注册成功过后,通过MQ通知其他业务进行操作。确保注册用户的性能。
2、后台发布商品的时候,商品数据需要从数据库中转换成搜索引擎数据(基于elasticsearch),那么我们应该将商品写入数据库后,再写入到MQ,然后通过监听MQ来生成elasticsearch对应的数据。
3、用户下单后,24小时未支付,需要取消订单。以前我们可能是定时任务循环查询,然后取消订单。实际上,我更推荐类似延迟MQ的方式,避免了很多无效的数据库查询,将一个MQ设置为24小时后才让消费者消费掉,这样很大程度上能减轻服务器压力。
4、支付完成后,需要及时的通知子系统(进销存系统发货,用户服务积分,发送短信)进行下一步操作,但是,支付回调我们都是需要保证高性能的,所以,我应该直接修改数据库状态,存入MQ,让MQ通知子系统做其他非实时的业务操作。这样能保证核心业务的高效及时。

注意事项

其实,还有非常多的业务场景,是可以考虑用MQ方式的,但是很多时候,也会存在滥用的情况,我们需要清楚认识我们的业务场景:
发验证码短信、邮件,这种过分依赖外部,而且时效性可以接收几十秒延迟的,其实更好的方式是多线程异步处理,而不是过多依赖MQ。
秒杀抢购确保库存不为负数,更多的依赖高性能缓存(如redis),以及强制加锁,千万不要依赖消费者最终的返回结果。(实际工作中已经看到好几个这样的案例了)上游-下游 这种直接的处理方式效率肯定是比 上游-MQ-下游 方式要高,MQ效率高,是因为,我只是上游-MQ 这个阶段就当做已经成功了

 

转载于:https://www.cnblogs.com/pdd-666888/p/9447164.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/353089.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据库连接池的使用

关于数据库连接池的使用,首先我们要明白我们为什么要用它,对应普通的数据库连接操作,通常会涉及到以下一些操作是比较耗时的: 网络通讯,涉及到网络延时及协议通讯身份验证,涉及安全性检查连接合法性检查&a…

mysql基础知识整理_MYSQL基础知识整理

目录1、客户端命令2、服务器端命令3、常用数据类型3.1、数值型3.2、字符型3.3、日期时间型3.4、布尔型4、mysql的执行方式5、用户管理1、客户端命令客户端命令不需要以分号结尾 ,如果想获取客户端命令的帮助信息则:mysql> helpmysql常用客户端命令如下…

python 学习DAY11

动态传参 形参* # 聚合所有位置参数的实参 实参* #打散一个位置参数成多个 形参** #聚合所有关键词参数 实参** #打散实参的关键词参数 命名空间 第一种 内置名称空间 第二种 全局名称空间 第三中 局部名臣空间 作用域 全局作用域(是内置的,全局也可以调用) 局部作用域(局部可调…

【网络技术设备安全】BGP 基础与概述-2-中转 AS 中的 IBGP 路由传递

0x01 中转 AS 中的 IBGP 路由传递 参考该图: 上图,我们模拟一个 1.0 的路由通过 AS 65101 来传递 1:通过图可知,A 与 B 之间的 Peer 为 EBGP,B 与 E 之间为 Peer IBGP,E 与 F 之间为 Peer EBGP 邻接 2&a…

python函数变量的作用域_学不会的Python函数——变量作用域

1. LEGB函数Python中,程序的变量并不是在哪个位置都可以访问的,访问权限决定于这个变量是在哪里赋值的。我们先来看一段代码。上述代码有两个变量a,当在test函数中输出变量a的值是,为什么输出的是20,而不是10呢&#x…

浅谈JSP表单中的form传值

不同JSP页面之间、不同action之间,以及JSP中form与其对应的action之间,JSP中form与其不对应的action之间如何传值。本文将介绍JSP表单中的form传值。 JSP表单中的form传值 页面间链接和数据传递的三种方式 (1)通过JSP表单form将数据提交到下一个页面&…

react.js从入门到精通(一)

web端三大框架react、vue和angular,下面是对react.js的一些总结。 一、环境搭建 1、npm搭建项目 推荐使用npm搭建项目环境,如果网速过慢,可是使用cnpm进行项目的搭建(cnpm是淘宝的npm镜像,与npm有些差异,有…

java 代码冲突检测_Java中常见的代码冲突

java 代码冲突检测在工作中,最近我对现有Java项目进行了代码清理。 完成该练习后,我可以看到在代码中一次又一次地发生了一组常见的代码冲突。 因此,我想出了此类常见违规的清单,并与同行共享,以提高安全意识&#xff…

ubuntu 编译mysql_Ubuntu编译MySQL5

编译MySQL5源码提示 No curses/termcap library found,但安装curses termcap都提示已经安装。编译时加上路径即可解决,即./conf编译MySQL5源码提示 No curses/termcap library found,但安装curses termcap都提示已经安装。编译时加上路径即可…

WIN7下搭建FTP

步骤如下: 一、 二、 三、 四、 五、 六、 七、 八、 九、检验 注意:只有本机可以访问ftp,外部电脑无法访问ftp?可能是防火墙未关闭。

Android调用系统拍照裁剪和选图功能

最近项目中用到修改用户头像的功能,基本上都是模板代码,现在简单记录一下. 调用系统拍照private fun openCamera() { //调用相机拍照// 创建File对象,用于存储拍照后的图片var outputImage File(externalCacheDir, "output_image.jpg")try {if (outputI…

忘记番石榴:5个Google库Java开发人员应该知道的

什么是最有用但未知的Google Java库? 如果我们在激烈的黑客马拉松中阻止某人并要求她命名一个受欢迎的Google Java库,那么答案可能就是Guava。 这也就不足为奇了,因为它的主要重点是提高开发人员的生产力。 但是其他Google图书馆呢&#xff…

VS在win32平台与mysql链接_mysql5.5.28-win32 + qt--4.8.2-vs2008 数据库驱动编译与连接...

我们来编译配置qt的mysql数据库驱动,首先看看官方文档的说明,如下How to Build the QMYSQL Plugin on WindowsYou need to get the MySQL installation files.RunSETUP.EXEand choose "Custom Install".Install the "Libs & Include …

JAVA知识学习——类的修饰符

Java程序在定义类时,除了使用class关键字标识之外,还可以在class之前增加若干类的修饰符来修饰限定所定义的类的特性。类的修饰符分为访问控制符和非访问控制符两大类。修饰符之间的先后排列次序对类的性质没有任何影响。一,非访问修饰符。 1…

神秘的数组初始化_I / O神秘化

神秘的数组初始化由于对高度可扩展的服务器设计的所有炒作以及对Node.js的狂热,我一直想重点研究IO设计模式,直到现在为止都没有足够的时间进行投资。 现在已经做了一些研究,我认为最好记下我遇到的东西,作为对我以及可能遇到这篇…

mysql characteristic_MySQL存储过程定义中的特性(characteristic)的含义

MySQL的存储过程蛮啰嗦的,与MSSQL或者Oracle的存储过程相比,如果没有显式指定,他会隐含地指定一系列特性(characteristic)的默认值来创建存储过程通常在使用图形界面工具进行存储过程编写的时候,图形界面工具会自动加上这部分内容…

hive 案例分析

转自 http://www.cnblogs.com/guanhao/p/5641675.html 1. 创建数据库,切换数据库 create database testdb2; use testdb2; 2. 创建管理表 create table emp( empno int, empname string, job string, mgr int, hiredate string, salary double, comm double, deptn…

BeanUtils包的使用

BeanUtils工具包是由Apache公司所开发,主要是方便程序员对Bean类能够进行简便的操作。 在使用BeanUtils工具包之前我们需要的Jar包有以下几种: (1) BeanUtils相关包 commons-beanutils-1.8.3.jar commons-beanutils-1.8.3-javadoc.jar commons-beanuti…

使用JMX作为Ganglia的现代替代品进行CLDB监视

有许多选项可用于监视MapR集群的性能和运行状况。 在本文中,我将介绍使用Java管理扩展(JMX)监视CLDB的鲜为人知的方法。 据最受尊敬的MapR数据工程师之一,Akihiko Kusanagi称,与使用Ganglia相比,使用JMX来…

python 多线程并发怎么还是顺序执行_python thread 并发且顺序运行示例

python怎么实现用多线程顺序执行python 的GIL规定每个时刻只能有一个线程访问python虚拟机,所以你要用python的多线程来做计算是很不合算的,但是对于IO密集型的应用,例如网络交互来说,自己把自己说服了,是一种理智的胜利;自己被自己感动了,是…