MQ全称为Message Queue-消息队列,是一种应用程序对应用程序的消息通信,一端只管往队列不断发布信息,另一端只管往队列中读取消息,发布者不需要关心读取消息的谁,读取消息者不需要关心发布消息的是谁,各干各的互不干扰。


市场上现在常用的消息队列有:RabbitMQ、RocketMQ、Kafka,ActiveMQ。

先从开发语言来说,几款MQ对应的开发语言:

  • Kafka:Scala
  • RabbitMQ:Erlang
  • RocketMQ:java
  • ActiveMQ:java

详细对比如下(ActiveMQ->RabbitMQ->RocketMQ->Kafka):

一般的业务系统要引入MQ,最早大家都用ActiveMQ,但是现在用的并不多了,没经过大规模吞吐量场景的验证,社区也不是很活跃;
后来大家开始用RabbitMQ,但是确实erlang语言阻止了大量的java工程师去深入研究和掌控他,对公司而言,几乎处于不可控的状态,但是确实人是开源的,比较稳定的支持,活跃度也高;

不过现在确实越来越多的公司,会去用RocketMQ,确实很不错,对自己公司技术实力有绝对自信的,我推荐用RocketMQ。

所以中小型公司,技术实力较为一般,技术挑战不是特别高,用RabbitMQ是不错的选择;大型公司,基础架构研发实力较强,用RocketMQ是很好的选择。

如果是大数据领域的实时计算、日志采集等场景,用Kafka是业内标准的,绝对没问题,社区活跃度很高,目前几乎是全世界这个领域的事实性规范了。

二、MQ的优势

(1) 解耦

使用消息MQ后,只需要保证消息格式不变,不需要关心发布者及消费者之间的关系,这两者不需要彼此联系

(2) 异步

在一些不需要即时(同步)的返回结果操作,通过消息队列来实现异步。

(3) 削峰

在大量请求时(秒杀场景),使用消息队列做缓冲处理,削弱峰值流量,防止系统在短时间内被峰值流量冲垮。
场景:在大量流量涌入高峰,如数据库只能抗住2000的并发流量,可以使用MQ控制2000到数据库中

(4) 日志处理

日志存储在消息队列中,用来处理日志,比如kafka。

三、MQ的劣势

系统的可用性降低

在还未引进MQ之前,系统只需要关系生产端与消费端的接口一致性就可以了,现在引进后,系统需要关注生产端、MQ与消费端三者的稳定性,这增加系统的负担,系统运维成本增加。
系统的复杂性提高

引入了MQ,需要考虑的问题就增加了,如何保障消息的一致性,消费不被重复消费等问题,
一致性问题

A系统发送完消息直接返回成功,但是BCD系统之中若有系统写库失败,则会产生数据不一致的问题。

四、常见问题

(1) 怎么保证消息没有重复消费?使用消息队列如何保证幂等性

幂等性:就是用户对于同一操作发起的一次请求或者多次请求的结果是一致的,不会因为多次点击而产生了副作用
问题出现原因

我们先来了解一下产生消息重复消费的原因,对于MQ的使用,有三个角色:生产者、MQ、消费者,那么消息的重复这三者会出现:

生产者:生产者可能会推送重复的数据到MQ中,有可能controller接口重复提交了两次,也可能是重试机制导致的

MQ:假设网络出现了波动,消费者消费完一条消息后,发送ack时,MQ还没来得及接受,突然挂了,导致MQ以为消费者还未消费该条消息,MQ回复后会再次推送了这条消息,导致出现重复消费。

消费者:消费者接收到消息后,正准备发送ack到MQ,突然消费者挂了,还没得及发送ack,这时MQ以为消费者还没消费该消息,消费者重启后,MQ再次推送该条消息。

解决方案

在正常情况下,生产者是客户,我们很难避免出现用户重复点击的情况,而MQ是允许存在多条一样的消息,但消费者是不允许出现消费两条一样的数据,所以幂等性一般是在消费端实现的:

状态判断:消费者把消费消息记录到redis中,再次消费时先到redis判断是否存在该数据,存在则表示消费过,直接丢弃

业务判断:消费完数据后,都是需要插入到数据库中,使用数据库的唯一约束防止重复消费。插入数据库前先查询是否存在该数据,存在则直接丢弃消息,这种方式是比较简单粗暴地解决问题

(2) 消息丢失的情况

(3) 消息的传输顺序性

解决思路

在生产端发布消息时,每次法发布消息都把上一条消息的ID记录到消息体中,消费者接收到消息时,做如下操作
先根据上一条Id去检查是否存在上一条消息还没被消费,如果不存在(消费后去掉id),则正常进行,如果正常操作

如果存在,则根据id到数据库检查是否被消费,如果被消费,则正常操作

如果还没被消费,则休眠一定时间(比如30ms),再重新检查,如被消费,则正常操作

如果还没被消费,则抛出异常

(4) 怎么解决百万消息积压问题

根据消息重要程度,可以分为两种情况处理

如果消息可以被丢弃,那么直接丢弃就好了

一般情况下,消息是不可以被丢弃的,那么这样需要考虑策略了,我们可以把原来的消费端重新当做生产端,重新部署一天MQ,再后面出现增加消费端,这样形成另一条生产-消息-消费的线路

喜欢软件测试的小伙伴们,如果我的博客对你有帮助、如果你喜欢我的博客内容,请 “点赞” “评论” “收藏” 一 键三连哦!

测开必备:使用MQ的优势、劣势及常见问题相关推荐

  1. 从外行到外包,从手工测试到知名互联大厂测开 我经历了我这个年龄段不该经历的事情...

    本人本科就读于某普通一本院校(非985,211),经管类专业,从大四实习到15年毕业后前两年一直在从事自己专业相关的工作. 17年时决定想要转业从事计算机相关领域工作,在17年9月的一个机遇大跨度转行 ...

  2. 初识测开/测试- 细节狂魔 - 测开/测试方向

    文章目录 前言 什么是软件测试? 实战练习 软件测试和软件开发的区别 技能 && 难易程度 杂项:薪资,工作环境,工作压力 发展前景 一个经典面试题:软件测试 和 软件开发中的调试 有 ...

  3. 初识测开/测试- 第一篇 - 测开/测试方向

    前言 在进入软件测试的正式讲解之前,我们需要对这个行业有一个整体的了解. 当我们从软件开发转向软件测试的时候,多数公司是欢迎的,而且难度也小. 反之,当我们从软件测试转向软件开发的时候,难度将会变得很 ...

  4. 阿里、字节年薪百万的测开专家,都在关注哪些前沿技术

    近些年,随着计算机技术高速发展,软件测试行业也正处于转型期.传统的测试技术逐步淘汰,各种新的测试技术层出不穷,测试人员的薪水也水涨船高.与此同时,各大厂对测试人员的要求也越来越高.打开任意一个招聘AP ...

  5. 软件测试 | 测试开发 | 从外行到外包,从手工测试到知名互联大厂测开 这个90后小姐姐是怎么腾飞的?

    本文为霍格沃兹测试学院优秀学员跳槽笔记,测试开发进阶学习文末加群. 编者按:本文的主人公小姐姐是我们自动化班的学员,小姐姐人很好,很努力也很优秀.希望她的分享能够帮助到一每位需要帮助的小伙伴,相伴学习 ...

  6. 测试人生 | 从外行到外包,从手工测试到知名互联大厂测开 这个90后是怎么腾飞的?

    原文链接 编者按:本文的主人公小姐姐是我们自动化班的学员,小姐姐人很好,很努力也很优秀.希望她的分享能够帮助到一每位需要帮助的小伙伴,相伴学习的路上,我们一起加油~ 本人本科就读于某普通一本院校(非9 ...

  7. 跳槽前恶补面试题,成功上岸阿里,拿到33k的测开offer

    不知不觉间,时间过得真快啊.作为一名程序员,应该都清楚每年的3.4月份和9.10月份都是跳槽的黄金季,各大企业在这段时间会大量招聘人才.在这段时间里,有人欢喜有人悲.想必各位在跳槽前都会做好充足的准备 ...

  8. 35岁以后软测就没有出路了吗?听听京东10年测开的经验分析

    国内的互联网行业发展较快,所以造成了技术研发类员工工作强度比较大,同时技术的快速更新又需要员工不断的学习新的技术.因此淘汰率也比较高,超过35岁的基层研发类员工,往往因为家庭原因.身体原因,比较难以跟 ...

  9. 测试员薪资两极分化,如何成为年薪百万的阿里测开?

    在一线大厂,没有测试这个岗位,只有测开这个岗位.这几年,各互联网大厂技术高速更新迭代,软件测试行业也正处于转型期.传统的功能测试技术逐步淘汰,各种新的测试技术层出不穷,测试人员的薪资也水涨船高.与此同 ...

最新文章

  1. 保存数组_面试官:讲一讲你对据结构——数组、链表、栈、队列的理解
  2. Spring+SpringMVC+MyBatis深入学习及搭建(一)——MyBatis的基础知识
  3. [cocos2d-x·总结]关于cocos2d-x几种画图方法的用法与思考
  4. EF增删查改加执行存储过程和sql语句,多种方法汇总
  5. DCOS实践分享(4):如何基于DC/OS整合SMACK(Spark, Mesos, Akka, Cassandra, Kafka)
  6. oracle11gasm,oracle11gASM管理
  7. 2020年Airbnb爱彼迎中国房东社区报告
  8. 使用SQL Coalesce函数查询数据
  9. GDAL工具使用示例(一)
  10. YAML_06 playbook从上往下顺序执行,若报错,不提示,继续往下执行
  11. iOS:主流启动优化方案浅析
  12. 嵌入式C语言自我修养分享课件
  13. 1、金融企业信息化建设的必要性
  14. Win10 CMD命令大全 命令提示符常用命令有哪些
  15. python股市回测程序
  16. 微信小助手简版 WeChatSeptet for Mac安装教程!
  17. python金融量化风险_Python量化:评估投资组合的收益率和风险
  18. 快手和抖音怎么打开微信小程序
  19. 不得不会的软件测试bug分析定位技巧
  20. 爬取豌豆荚app数据

热门文章

  1. 创业公司如何构建一个分布式文件存储系统
  2. 又一自动驾驶新蓝海赛道来临,谁将率先抢占市场先机?
  3. 4G通信模块CAT1和CAT4的区别
  4. 河北计算机等级考试但不包含职称,河北省计算机等级考试但不包含职称的页面(河北省计算机等级考试时间)...
  5. Selenium自动化测试工具的简单介绍和使用
  6. 敖然:数字化手段要与业务需求深度结合|2021全球数字价值峰会
  7. C++ 实现数学归纳法证明过程
  8. android 清除cookie,Android实现清除单个域名的cookie
  9. 图解 免费安装 SQL Server 2005 详细步骤
  10. 在代码注释里 插入专属定制 Banner(超简单)