消息中间件MQ知识概括

MQ简介

MQ的产品种类和对比:

  • MQ就是消息中间件。MQ是一种理念,ActiveMQ是MQ的落地产品。不管是哪款消息中间件,都有如下一些技术维度:
    ①kafka:编程语言是scala,大数据领域的主流MQ。
    ②rabbitmq:编程语言是erlang,基于erlang语言,不好修改底层,不要查找问题的原因,不建议选用。
    ③rocketmq:编程语言是java,适用于大型项目。适用于集群。
    ④activemq:编程语言是java,适用于中小型项目。
    在这里插入图片描述

MQ的产生背景:

  • 系统之间直接调用存在的问题?
    微服务架构后,链式调用是我们在写程序时候的一般流程,为了完成一个整体功能会将其拆分成多个函数(或子模块),比如模块A调用模块B,模块B调用模块C,模块C调用模块D。但在大型分布式应用中,系统间的RPC交互繁杂,一个功能背后要调用上百个接口并非不可能,从单机架构过渡到分布式微服务架构的通例。这些架构会有哪些问题?

  • 系统之间接口耦合比较严重:
    ①每新增一个下游功能,都要对上游的相关接口进行改造;
    ②举个例子:如果系统A要发送数据给系统B和系统C,发送给每个系统的数据可能有差异,因此系统A对要发送给每个系统的数据进行了组装,然后逐一发送;当代码上线后又新增了一个需求:把数据也发送给D,新上了一个D系统也要接受A系统的数据,此时就需要修改A系统,让他感知到D系统的存在,同时把数据处理好再给D。在这个过程你会看到,每接入一个下游系统,都要对系统A进行代码改造,开发联调的效率很低。

  • 面对大流量并发时,容易被冲垮:
    ①每个接口模块的吞吐能力是有限的,这个上限能力如果是堤坝,当大流量(洪水)来临时,容易被冲垮。
    ②举个例子秒杀业务:上游系统发起下单购买操作,就是下单一个操作,很快就完成。然而,下游系统要完成秒杀业务后面的所有逻辑(读取订单,库存检查,库存冻结,余额检查,余额冻结,订单生产,余额扣减,库存减少,生成流水,余额解冻,库存解冻)。

  • 等待同步存在性能问题:
    ①RPC接口上基本都是同步调用,整体的服务性能遵循“木桶理论”,即整体系统的耗时取决于链路中最慢的那个接口。比如A调用B/C/D都是50ms,但此时B又调用了B1,花费2000ms,那么直接就拖累了整个服务性能。

  • 根据上述的几个问题,在设计系统时可以明确要达到的目标:
    ①要做到系统解耦,当新的模块接进来时,可以做到代码改动最小;能够解耦
    ②设置流量缓冲池,可以让后端系统按照自身吞吐能力进行消费,不被冲垮;能削峰
    ③强弱依赖梳理能将非关键调用链路的操作异步化并提升整体系统的吞吐能力;能够异步

MQ的主要作用:

  • 异步。调用者无需等待。
  • 解耦。解决了系统之间耦合调用的问题。
  • 消峰。抵御洪峰流量,保护了主业务。

MQ的定义:

  • 面向消息的中间件(message-oriented middleware)MOM能够很好的解决以上问题。是指利用高效可靠的消息传递机制与平台无关的数据交流,并基于数据通信来进行分布式系统的集成。通过提供消息传递和消息排队模型在分布式环境下提供应用解耦,弹性伸缩,冗余存储、流量削峰,异步通信,数据同步等功能。

  • 大致的过程是这样的:发送者把消息发送给消息服务器,消息服务器将消息存放在若干队列/主题topic中,在合适的时候,消息服务器回将消息转发给接受者。在这个过程中,发送和接收是异步的,也就是发送无需等待,而且发送者和接受者的生命周期也没有必然的关系;尤其在发布pub/订阅sub模式下,也可以完成一对多的通信,即让一个消息有多个接受者。

MQ的特点:

  • 采用异步处理模式:
    ①消息发送者可以发送一个消息而无须等待响应。消息发送者将消息发送到一条虚拟的通道(主题或者队列)上;
    ②消息接收者则订阅或者监听该爱通道。一条消息可能最终转发给一个或者多个消息接收者,这些消息接收者都无需对消息发送者做出同步回应。整个过程都是异步的。
    ③也就是说,一个系统跟另一个系统之间进行通信的时候,假如系统A希望发送一个消息给系统B,让他去处理。但是系统A不关注系统B到底怎么处理或者有没有处理好,所以系统A把消息发送给MQ,然后就不管这条消息的“死活了”,接着系统B从MQ里面消费出来处理即可。至于怎么处理,是否处理完毕,什么时候处理,都是系统B的事儿,与系统A无关。
  • 应用系统之间解耦合:
    ①发送者和接受者不必了解对方,只需要确认消息。
    ②发送者和接受者不必同时在线。
  • MQ的缺点:两个系统之间不能同步调用,不能实时回复,不能响应某个调用的回复。

MQ与RPC

传统的http请求存在那些缺点:

  • Http请求基于请求与响应的模型,在高并发的情况下,客户端发送大量的请求达到 服务器端有可能会导致我们服务器端处理请求堆积。

  • Tomcat服务器处理每个请求都有自己独立的线程,如果超过最大线程数会将该请求缓存到队列中,如果请求堆积过多的情况下,有可能会导致tomcat服务器崩溃的问题。

  • 所以一般都会在nginx入口实现限流,整合服务保护框架。
    在这里插入图片描述

  • http请求处理业务逻辑如果比较耗时的情况下,容易造成客户端一直等待,阻塞等待过程中会导致客户端超时发生重试策略,有可能会引发幂等性问题。

  • 注意事项:接口是为http协议的情况下,最好不要处理比较耗时的业务逻辑,耗时的业务逻辑应该单独交给多线程或者是mq处理

耗时解决方案对比:

  • 同步发送http请求:客户端发送请求到达服务器端,服务器端实现会员注册业务逻辑。
    ①insertMember() --插入会员数据 1s
    ②sendSms()----发送登陆短信提醒 3s
    ③sendCoupons()----发送新人优惠券 3s
    ④总共响应需要6s时间,可能会导致客户端阻塞6s时间,对用户体验
    不是很好。
    在这里插入图片描述
  • 多线程处理业务逻辑:用户向数据库中插入一条数据之后,在单独开启一个线程异步发送短信和优惠操作,客户端只需要等待1s时间。<
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值