mq的作用

  1. 通过异步方式对系统解耦
  2. 增加系统的并发处理能力

通过异步方式对系统解耦

以用户注册为例,一般情况下:

分下一下,上面过程存在的一些问题:

  1. 注册过程会调用4个服务(注册服务、邮件服务、短信服务、积分服务),服务之间依赖性太强,任何一个服务不可用,直接影响整个注册业务
  2. 接口耗时太长,每个服务耗时100ms,注册流程耗时400ms
  3. 对用户来说,用户信息入库是主要的业务流程,其他并不是响应用户过程中直接关注的逻辑,可以异步进行处理

采用mq的方式实现:

过程:

  • 调用注册服务,注册信息入库,耗时100ms
  • 投递注册消息到mq
  • 返回注册成功
  • 对于用户来说耗时200ms
  • 其他3个操作(发邮件、发短信、增加积分)从消息队列中拉取消息进行处理,对于主流程来说是异步操作

将依赖于3个服务转换为只依赖于mq服务,只需要保证注册服务、mq服务高可用,即可以保证注册服务的高可用,相比保证其他3个服务高可用上容易了许多。

增加系统的并发处理能力

以电商中的秒杀场景为例,采用同步处理:

  • 用户点击秒杀
  • 调用订单服务,验证库存、锁定库存
  • 跳转到支付页面进行支付

分析一下,存在的问题:

  • 验证库存、锁定库存会访问数据库
  • 秒杀场景,商品数量有限,请求量非常大,每个请求来了都做以上处理,直接会把数据库压垮,导致数据库无法对外提供服务,数据库的不可用直接导致整个业务的不可用,秒杀活动打水漂。

  • 大量请求会同时到达,同时去访问数据库,数据库连接有限,导致很多请求会处于等待状态,导致并发性能急剧下降
  • 大量用户同时操作库存,存在争抢数据库锁的情况,容易导致死锁
  • 秒杀中数量一般是有限,大量用户抢购,其实最终只有很少的用户能够抢购到

大家都有在银行办理业务的经验,银行处理业务的流程:领号、排队、等待叫号办理业务

秒杀中我们也可以参考银行办理业务的流程:

  • 用户点击描述
  • 系统接受到用户请求后,生成一个唯一的编号,然后投递一条消息(秒杀下单)到mq
  • 响应用户:秒杀正在处理中
  • 秒杀系统从mq中拉取消息进行处理,处理完成之后告知用户,这步操作对于用户来说是异步处理的过程

从上面可以看出,从接受用户请求到响应用户请求,未访问数据库,只有生成编号和发送消息的操作,这部分处理速度是非常快的,不存在性能的问题,数据库也不存在压力的问题了,所有用户的请求都被作为一条消息投递到mq进行异步处理;从而解决了秒杀中同步处理遇到的各种问题。

其他一些使用场景

  1. 系统日志的处理
    系统手机日志,异步发送到mq,日志服务队从mq中拉取消息进行各种处理,关于这个以后我们会专门讨论。
  2. 通过事件驱动的一些业务,也可以使用mq实现

总结

  1. mq是采用异步的方式来解决系统耦合性的问题,并发处理的问题;重点是在于异步,那么什么情况下使用异步呢?当调用方不强依赖于被调用方的结果的时候,可以采用异步的方式进行处理,此时可以使用mq。
  2. 当调用方强依赖于被调用方的结果的时候,需要使用同步的方式,不能使用mq

mq系列整个内容,我们将讨论

  1. mq的使用场景
  2. 业务系统中投递消息的几种方式?
  3. 如何确保投递消息一定成功?
  4. 消息消费的几种方式
  5. 如何确保消息至少消费一次
  6. 如何保证消息消费的幂等性

路人甲Java,只生产干货,公众号:javacode2018,喜欢的关注一下。

聊聊mq的使用场景的更多相关文章

  1. 聊聊mq中消息消费的几种方式

    mq系列文章 对mq了解不是很多的,可以看一下下面两篇文章: 聊聊mq的使用场景 聊聊业务系统中投递消息到mq的几种方式 聊聊消息消费的几种方式 如何确保消息至少消费一次 如何保证消息消费的幂等性 本 ...

  2. MQ的使用场景

    一.消息队列概述消息队列中间件是分布式系统中重要的组件,主要解决应用解耦,异步消息,流量削锋等问题,实现高性能,高可用,可伸缩和最终一致性架构.目前使用较多的消息队列有ActiveMQ,RabbitM ...

  3. MQ基本应用场景

    简介 消息队列 MQ 既可为分布式应用系统提供异步解耦和削峰填谷的能力,同时也具备互联网应用所需的海量消息堆积.高吞吐.可靠重试等特性. 应用场景 削峰填谷:诸如秒杀.抢红包.企业开门红等大型活动时皆 ...

  4. dubbo和mq的使用场景

    MQ:消息队列.生产者消费者模式,可用于对消息实时性要求不高的场景.多进程之间间接调用关系 Dubbo:RPC实现.多进程之间直接调用关系 dubbo 1,rpc的分布式集群支持:负载均衡是对外提供一 ...

  5. 聊聊@Transactional 的失效场景,有哪些坑?

    先别急着回答,看完再说也不迟嘛.我们都知道在 Spring 项目中,我们可以直接使用注解 @Transactional 来标识一个事务方法.然而,你可能并不知道这个事务是不是按照你想的方式执行.下面我 ...

  6. 聊聊业务系统中投递消息到mq的几种方式

    背景 电商中有这样的一个场景: 下单成功之后送积分的操作,我们使用mq来实现 下单成功之后,投递一条消息到mq,积分系统消费消息,给用户增加积分 我们主要讨论一下,下单及投递消息到mq的操作,如何实现 ...

  7. 聊聊db和缓存一致性的5种实现方式

    数据存储在数据库中,为了加快业务访问的速度,我们将数据库中的一些数据放在缓存中,那么问题来了,如何确保db和缓存中数据的一致性呢?我们列出了5种方法,大家都了解一下,然后根据业务自己选择. 方案1 获 ...

  8. MQ(消息队列)常见的应用场景解析

    前言 提高系统性能首先考虑的是数据库的优化,之前一篇文章<数据库的使用你可能忽略了这些>中有提到过开发中,针对数据库需要注意的事项.但是数据库因为历史原因,横向扩展是一件非常复杂的工程,所 ...

  9. mq使用场景、不丢不重、时序性

    mq使用场景.不丢不重.时序性.削峰 参考: http://zhuanlan.51cto.com/art/201704/536407.htm http://zhuanlan.51cto.com/art ...

随机推荐

  1. 3 Angular 2 快速上手启动项目Demo

    Angular2.x与Angular1.x 的区别类似 Java 和 JavaScript 或者说是雷锋与雷峰塔的区别,想要运行Angular2需要安装一些第三方依赖,不会像Angular1.x那样, ...

  2. IDEA--java版本修改(jdk1.8改成jdk1.7)

    转载:https://blog.csdn.net/huyishero/article/details/61916516

  3. 必备java参考资源列表

    现在开始正式介绍这些参考资源. Web 站点和开发人员 Web 门户 网络无疑改变了共享资源和出版的本质(对我也是一样:您正在网络上阅读这篇文章),因此,从每位 Java 开发人员都应该关注的关键 W ...

  4. GEO,IGSO,MEO,LEO

    GEO(Geosynchronous Eearth Orbit):地球静止轨道卫星 IGSO(Inclined Geosynchronous Satellite Orbit):倾斜轨道同步卫星 地球同 ...

  5. android8 Notification

     界面Layout:  customnotice.xml <?xml version="1.0" encoding="utf-8"?> <Li ...

  6. HDU1054 Strategic Game —— 最小点覆盖 or 树形DP

    题目链接:https://vjudge.net/problem/HDU-1054 Strategic Game Time Limit: 20000/10000 MS (Java/Others)     ...

  7. HDU3642 Get The Treasury —— 求矩形交体积 线段树 + 扫描线 + 离散化

    题目链接:https://vjudge.net/problem/HDU-3642 Jack knows that there is a great underground treasury in a ...

  8. POJ1182 食物链 —— 种类并查集

    题目链接:http://poj.org/problem?id=1182 食物链 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: ...

  9. Golang1.8编译静态库给C使用

    Go实例代码: package main import ( "fmt" ) import "C" //export Printf func Printf(for ...

  10. luogu 4720 【模板】扩展卢卡斯

    题目大意: 求$C_n^m \mod p$,p不一定为质数 思路: 首先可以将$p$分解为$p1^{a1}*p2^{a2}*...*pk^{ak}$,对于这些部分可以使用$CRT$合并 对于每个$p_ ...