聊个五毛钱的天(ActiveMQ)消息中间件

1 消息中间件介绍

1.1 什么是消息中间件

首先百度百科是这样解释的:

消息中间件利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通信来进行分布式系统的集成。通过提供消息传递和消息排队模型,它可以在分布式环境下扩展进程间的通信。

根据我的理解,其实消息中间件,简单的说就是——服务与服务之间的通讯工具;

打个简单比喻,现在互联网时代,我们人与人之间的通讯,用得最多的应该是微信吧;

场景模拟:

我:小明小明我找着女朋友了!!

小明:卧槽老哥赶紧通知家里

亲人群:啊哈哈哈,我有女朋友了;

。。。然后七大姑八大姨都知道了。这里的微信就充当了消息中间件这个角色;

1.2 为什么要用消息中间件

用消息中间件的主要目的是为了异步处理应用解耦;

1.2.1 异步处理

场景说明:用户注册后,需要发注册邮件和注册短信,传统的做法有两种1.串行的方式;2.并行的方式

  1. 串行方式:将注册信息写入数据库后,发送注册邮件,再发送注册短信,以上三个任务全部完成后才返回给客户端。 这有一个问题是,邮件,短信并不是必须的,它只是一个通知,而这种做法让客户端等待没有必要等待的东西;
  2. 并行方式:将注册信息写入数据库后,发送邮件的同时,发送短信,以上三个任务完成后,返回给客户端,并行的方式能提高处理的时间;

假设三个业务节点分别使用50ms,串行方式用时150ms,并行方式用时100ms。虽然并行已经提高的处理时间,但是,前面说过,邮件和短信对我正常的使用网站没有任何影响,客户端没有必要等着其发送完成才显示注册成功,应该是写入数据库后就返回;

上图采用传统的同步方式处理,性能很慢。

3.消息队列:

引入消息队列后,把发送邮件,短信不是必须的业务逻辑异步处理

由此可以看出,引入消息队列后,用户的响应时间就等于写入数据库的时间+写入消息队列的时间(可以忽略不计),引入消息队列后处理后,响应时间是串行的3倍,是并行的2倍。

 1.2.2 应用解耦

这里举例场景:我们双11秒杀活动,用户下单假设需要经过订单服务和库存服务。传统做法是订单服务调用库存服务接口,但是这样做会存在一些问题。

如果库存服务出现故障,那么用户下单就会失败。这样直接导致大批用户无法下单完成交易,淘宝也会损失大笔交易金额。服务于服务直接存在耦合。

那么我们这里使用消息队列(中间件)会怎么样呢?

订单系统:用户下单后,订单系统完成持久化处理,将消息写入消息队列,返回用户订单下单成功。

库存系统:订阅下单的消息,获取下单消息,进行库操作。

就算库存系统出现故障,消息队列也能保证消息的可靠投递,不会导致消息丢失

但是你有没有考虑另外一个问题,就是万一你依赖的那个MQ中间件突然挂掉了怎么办?这个还真的不是异想天开,MQ、Redis、MySQL这些组件都有可能会挂掉。一旦你的MQ挂了,就导致你的系统的核心业务流程中断了。本来你要是不引入MQ中间件,那其实就是一些系统之间的调用,但是现在你引入了MQ,就导致你多了一个依赖。一旦多了一个依赖,就会导致你的可用性降低。因此,一旦引入了MQ中间件,你就必须去考虑这个MQ是如何部署的,如何保证高可用性。甚至在复杂的高可用的场景下,你还要考虑如果MQ一旦挂了以后,你的系统有没有备用兜底的技术方案,可以保证系统继续运行下去。

博主还在学习,如果以后有技术方案会及时更新

1.2.3 流量削峰

顾名思义,当出现大流量的情况下舍弃掉一部分。一般秒杀等活动应用会出现这种情况。

当秒杀活动开始,其瞬间流量是非常大的,如果不去处理就会导致服务直接挂掉。所以为了解决我们在服务前端加入消息队列(中间件)。

这样我们可以起到以下作用:

  1. 控制整体活动人群数量,用户的请求,服务器收到之后,首先写入消息队列,加入消息队列长度超过最大值,则直接抛弃用户请求或跳转到错误页面;

  2. 可以缓解短时间的高流量压垮应用(应用程序按自己的最大处理能力获取订单);

  3. 秒杀业务根据消息队列中的请求信息,再做后续处理;

后续慢慢补

发布了106 篇原创文章 · 获赞 47 · 访问量 13万+

猜你喜欢

转载自blog.csdn.net/qq493820798/article/details/102601519