Day306.中间件的功能&对比
Posted 阿昌喜欢吃黄桃
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Day306.中间件的功能&对比相关的知识,希望对你有一定的参考价值。
中间件功能&对比
一、中间件的功能
1、MQ的异步
1)同步的概念
同步:
用户发起一个请求,系统A收到请求,接着系统A必须立马去调用系统B,直到系统B返回了,系统A
才能
返回结果给用户,不是那种学术型的解释
2)中间件实现异步
用户发起①请求给系统A,系统A收到请求并②发送消息给MQ,系统A发送消息成功,MQ接收到小心后系统A就③返回用户结果,根据MQ和系统B的情况,系统B④拿到获取消息,整个过程异步执行,分工明确
2、MQ的削峰
大量用户发起请求,系统A然后发送过来的每秒1万请求是一个流量洪峰,然后MQ直接给扛下来
了,都存储自己本地磁盘,这个过程就是流量削峰的过程,瞬间把一个洪峰给削下来了,让系统B后续慢慢获取消息来处理;
不让数据库直接去承受大量的流量洪峰,而导致数据库宕机, 造成某个功能停止服务或是整个系统瘫痪
3、MQ的解耦
系统A和系统B通过同步调用的模式耦合在了一起,所以一旦系统B出现故障,很可能会影响系统A也有故障
而且系统A还得去关心系统B的故障,去处理对应的异常
假设我们在系统A和系统B之间加入一个消息中间件,在这种情况下,系统A对系统B的调用仅仅是发送一个消息到MQ,然后就直接返回给用户了,系统A对系统B就不管了。
此时系统B如果出现了故障,对系统A根本没影响,系统A也感觉不到。
因为通过引入MQ,两个系统实现了异步化调用,也就实现了
解耦
,系统A并没有跟系统B耦合,所以互相之
间并没有任何影响
。
4、MQ的异步化性能
假设系统A要调用系统B干一个事儿,然后系统A先执行一些操作,需要耗费20ms,接着系统B执行一些操作要耗费
200ms,总共就要耗费220ms。整体是同步调用,导致出现木桶效应
系统A和系统B直接的业务是同步进行的,所以两个系统的处理能力会影响整个接口的调用性能
通过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面试时可以从单机吞吐量,时效性,架构可靠性,消息可靠性,支持的功能等方面去讲
ActiveMq | RabbitMq | RocketMq | Kafka | |
---|---|---|---|---|
单机吞吐量 | 每秒万级 | 每秒万级 | 10万级 | 10万级 |
时效性 | 毫秒级 | 微秒级 | 毫秒级 | 毫秒级 |
可用性 | 基于主从架构 | 基于主从架构 | 天然支持分布式 | 天然支持分布式 |
消息可靠性 | 较低概率丢失 | 经过配置几乎可以0丢失 | 经过配置几乎可以0丢失 | 经过配置几乎可以0丢失 |
功能 | 及其完备 | 基于erlang语言开发,并发能力强,延时很低 | 基于Java语言开发,接口简单易用,功能完备,扩展性好,比如支持,普通消息(同步发送,异步发送,单向发送),定时延时消息,顺序消息,事物消息 | 功能较为简单,主要支持简单的mq功能,因为功能简单,在大数据以及日志采集方面用处广 |
数据存储 | 每个节点存储着所有的数据 | 每个节点存储着所有的数据 | 每个节点存储着一部分数据,并且每个节点都有数据备份,防数据丢失 | 每个节点存储着一部分数据,并且每个节点都有数据备份,防数据丢失 |
以上是关于Day306.中间件的功能&对比的主要内容,如果未能解决你的问题,请参考以下文章
Day467&468&469.JavaBIO&NIO编程&AIO&NIO与零拷贝&对比 -netty