Day306.中间件的功能&对比

Posted 阿昌喜欢吃黄桃

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Day306.中间件的功能&对比相关的知识,希望对你有一定的参考价值。

中间件功能&对比

一、中间件的功能

1、MQ的异步

1)同步的概念

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WF66rmVq-1624333729922)(C:\\Users\\Administrator\\AppData\\Roaming\\Typora\\typora-user-images\\image-20210622105649502.png)]

同步

用户发起一个请求,系统A收到请求,接着系统A必须立马去调用系统B,直到系统B返回了,系统A
才能返回结果给用户
,不是那种学术型的解释


2)中间件实现异步

用户发起①请求给系统A,系统A收到请求并②发送消息给MQ,系统A发送消息成功,MQ接收到小心后系统A就③返回用户结果,根据MQ和系统B的情况,系统B④拿到获取消息,整个过程异步执行,分工明确

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UM0F7fm8-1624333729924)(C:\\Users\\Administrator\\AppData\\Roaming\\Typora\\typora-user-images\\image-20210622105836054.png)]


2、MQ的削峰

大量用户发起请求,系统A然后发送过来的每秒1万请求是一个流量洪峰,然后MQ直接给扛下来了,都存储自己本地磁盘,这个过程就是流量削峰的过程,瞬间把一个洪峰给削下来了,让系统B后续慢慢获取消息来处理;

不让数据库直接去承受大量的流量洪峰,而导致数据库宕机, 造成某个功能停止服务或是整个系统瘫痪

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-59Ivm9eU-1624333729927)(C:\\Users\\Administrator\\AppData\\Roaming\\Typora\\typora-user-images\\image-20210622110448181.png)]


3、MQ的解耦

系统A和系统B通过同步调用的模式耦合在了一起,所以一旦系统B出现故障,很可能会影响系统A也有故障
而且系统A还得去关心系统B的故障,去处理对应的异常

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-X1tO7A3Q-1624333729930)(C:\\Users\\Administrator\\AppData\\Roaming\\Typora\\typora-user-images\\image-20210622111546157.png)]

假设我们在系统A和系统B之间加入一个消息中间件,在这种情况下,系统A对系统B的调用仅仅是发送一个消息到MQ,然后就直接返回给用户了,系统A对系统B就不管了。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dV0R7AiY-1624333729934)(C:\\Users\\Administrator\\AppData\\Roaming\\Typora\\typora-user-images\\image-20210622111625181.png)]

此时系统B如果出现了故障,对系统A根本没影响,系统A也感觉不到。

因为通过引入MQ,两个系统实现了异步化调用,也就实现了解耦,系统A并没有跟系统B耦合,所以互相之
间并没有任何影响


4、MQ的异步化性能

假设系统A要调用系统B干一个事儿,然后系统A先执行一些操作,需要耗费20ms,接着系统B执行一些操作要耗费
200ms,总共就要耗费220ms。整体是同步调用,导致出现木桶效应

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-78GHJVMx-1624333729935)(C:\\Users\\Administrator\\AppData\\Roaming\\Typora\\typora-user-images\\image-20210622111914084.png)]

系统A和系统B直接的业务是同步进行的,所以两个系统的处理能力会影响整个接口的调用性能

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1CWyjdm4-1624333729936)(C:\\Users\\Administrator\\AppData\\Roaming\\Typora\\typora-user-images\\image-20210622112839612.png)]

通过MQ,系统只需要将消息发送给MQ即可,然后即可返回给用户结果,就完成了操作,用户仅仅等待25ms就收到了结果;

然后系统B从MQ里获取消息,接着花费200ms去执行,但是这个200ms就跟用户没关系了,用户早就收到结果了,他也不关心你花200ms还是2s去干自己的事。

实现了MQ的异步化性能提升


二、常用中间件的落地产品优缺点

发现一般国内常用的MQ技术有四种实现, ActiveMQ、Kafka、RabbitMQ、RocketMQ,但是其中ActiveMQ主要是几年以前较多公司使用,现在几乎国内用的公司都很少了。

下面主要是针对Kafka、RabbitMQ、RocketMQ三种技术做的介绍

1、Kafka

  • 性能强

发送消息给Kafka都是毫秒级的性能

  • 可用性高

Kafka是可以支持集群部署的,其中部分机器宕机是可以继续运行的。

  • 诟病

可能存在丢失数据的可能

因为Kafka收到消息之后会写入一个磁盘缓冲区里,并没有直接落地到物理磁盘上去,所以要是机器本身故障了,可能会导致磁盘缓冲区里的数据丢失。

  • 功能非常的单一

主要是支持发送消息给他,然后从里面消费消息,其他就没有什么额外的高级功能了。所以基于Kafka有限的功能,可能适用的场景并不是很多

  • 使用场景用户行为日志的采集和传输

因为那种日志适当丢失数据是没有关系的,而且一般量特别大,要求吞吐量要高,一般就是收发消息,不需要太多的高级功能,所以Kafka是非常适合这种场景的。


2、RabbitMQ

国内大部分公司都从ActiveMQ切换到RabbitMQ来使用,包括很多一线互联网大厂,而且直到现在都有很多 中小型公司 在使用RabbitMQ。

  • 吞吐量低

每秒几万的级别,所以如果遇到特别特别高并发的情况下,支撑起来是有点困难的。

  • 高可用性

集群部署的时候部分机器宕机可以继续运行,且不丢失数据

  • 功能丰富

支持部分高级功能,比如说死信队列,消息重试之类的

  • 扩展麻烦

进行集群扩展的时候(也就是加机器部署),还比较麻烦。

  • 开发的语言

开发语言是erlang,国内很少有精通erlang语言的工程师,因此也没办法去阅读他的源代码,甚至修改他的源代码。


3、RocketMQ

RocketMQ是阿里开源的消息中间件,久经沙场,非常的靠谱。他几乎同时解决了Kafka和RabbitMQ的缺陷。

RocketMQ是非常适合用在Java业务系统架构中的,因为他很高的性能表现,还有他的高阶功能的支持,可以让我们解决各种业务问题。

  • 吞吐量高

单机可以达到10万QPS以上

  • 高可用性

可以部署大规模的集群

  • 性能高
  • 数据不丢失

支持通过配置保证数据绝对不丢失

  • 功能丰富

比如延迟消息、事务消息、消息回溯、死信队列、消息积压,等等

  • 开发语言

是基于Java开发的,符合国内大多数公司的技术栈,很容易就可以阅读他的源码,甚至是修改他的源码。


4、优劣对比

消息中间件ActiveMq,RabbitMq,RocketMq,Kafka面试时可以从单机吞吐量,时效性,架构可靠性,消息可靠性,支持的功能等方面去讲

ActiveMqRabbitMqRocketMqKafka
单机吞吐量每秒万级每秒万级10万级10万级
时效性毫秒级微秒级毫秒级毫秒级
可用性基于主从架构基于主从架构天然支持分布式天然支持分布式
消息可靠性较低概率丢失经过配置几乎可以0丢失经过配置几乎可以0丢失经过配置几乎可以0丢失
功能及其完备基于erlang语言开发,并发能力强,延时很低基于Java语言开发,接口简单易用,功能完备,扩展性好,比如支持,普通消息(同步发送,异步发送,单向发送),定时延时消息,顺序消息,事物消息功能较为简单,主要支持简单的mq功能,因为功能简单,在大数据以及日志采集方面用处广
数据存储每个节点存储着所有的数据每个节点存储着所有的数据每个节点存储着一部分数据,并且每个节点都有数据备份,防数据丢失每个节点存储着一部分数据,并且每个节点都有数据备份,防数据丢失

以上是关于Day306.中间件的功能&对比的主要内容,如果未能解决你的问题,请参考以下文章

带有片段的重复 ID

Day467&468&469.JavaBIO&NIO编程&AIO&NIO与零拷贝&对比 -netty

如何将数据从顶点着色器传递到片段着色器,中间有着色器[重复]

分库分表数据库中间件对比

day10-12 函数语法铺垫&函数的参数

Day680.大佬如何学习源码 -深入拆解 Tomcat & Jetty