消息中间件(1)

1 JMS
Java Message Service,Java消息服务是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。

2 mq应用场景

1) 解耦
A 系统跟其它各种乱七八糟的系统严重耦合,A 系统产生一条比较关键的数据,很多系统都需要 A 系统将这个数据发送过来。A 系统要时时刻刻考虑 BCDE 四个系统如果挂了该咋办?要不要重发,要不要把消息存起来?头发都白了啊!

如果使用 MQ,A 系统产生一条数据,发送到 MQ 里面去,哪个系统需要数据自己去 MQ 里面消费。如果新系统需要数据,直接从 MQ 里消费即可;如果某个系统不需要这条数据了,就取消对 MQ 消息的消费即可。这样下来,A 系统压根儿不需要去考虑要给谁发送数据,不需要维护这个代码,也不需要考虑人家是否调用成功、失败超时等情况。

2) 异步
再来看一个场景,A 系统接收一个请求,需要在自己本地写库,还需要在 BCD 三个系统写库,自己本地写库要 3ms,BCD 三个系统分别写库要 300ms、450ms、200ms。最终请求总延时是 3 + 300 + 450 + 200 = 953ms,接近 1s,用户感觉搞个什么东西,慢死了慢死了。用户通过浏览器发起请求,等待个 1s,这几乎是不可接受的。

一般互联网类的企业,对于用户直接的操作,一般要求是每个请求都必须在 200 ms 以内完成,对用户几乎是无感知的。

如果使用 MQ,那么 A 系统连续发送 3 条消息到 MQ 队列中,假如耗时 5ms,A 系统从接受一个请求到返回响应给用户,总时长是 3 + 5 = 8ms,对于用户而言,其实感觉上就是点个按钮,8ms 以后就直接返回了,爽!网站做得真好,真快!

3) 削峰
每天 0:00 到 12:00,A 系统风平浪静,每秒并发请求数量就 50 个。结果每次一到 12:00 ~ 13:00 ,每秒并发请求数量突然会暴增到 5k+ 条。但是系统是直接基于 MySQL 的,大量的请求涌入 MySQL,每秒钟对 MySQL 执行约 5k 条 SQL。

一般的 MySQL,扛到每秒 2k 个请求就差不多了,如果每秒请求到 5k 的话,可能就直接把 MySQL 给打死了,导致系统崩溃,用户也就没法再使用系统了。

但是高峰期一过,到了下午的时候,就成了低峰期,可能也就 1w 的用户同时在网站上操作,每秒中的请求数量可能也就 50 个请求,对整个系统几乎没有任何的压力。

如果使用 MQ,每秒 5k 个请求写入 MQ,A 系统每秒钟最多处理 2k 个请求,因为 MySQL 每秒钟最多处理 2k 个。A 系统从 MQ 中慢慢拉取请求,每秒钟就拉取 2k 个请求,不要超过自己每秒能处理的最大请求数量就 ok,这样下来,哪怕是高峰期的时候,A 系统也绝对不会挂掉。而 MQ 每秒钟 5k 个请求进来,就 2k 个请求出去,结果就导致在中午高峰期(1 个小时),可能有几十万甚至几百万的请求积压在 MQ 中。这个短暂的高峰期积压是 ok 的,因为高峰期过了之后,每秒钟就 50 个请求进 MQ,但是 A 系统依然会按照每秒 2k 个请求的速度在处理。所以说,只要高峰期一过,A 系统就会快速将积压的消息给解决掉。

3 MQ带来的问题
1) 系统复杂度增高
2) 一致性要求降低
4 常用消息的中间件

1 ActiveMQ

ActiveMQ是apache出品,能力强劲的开源消息总线,它是一个完全支持JMS规范的消息中间件
提供丰富的API、多种集群构建模式使它成为业界老牌
消息中间件,在中小企业应用广泛
MQ衡量指标:服务性能、数据存储、集群架构

优点:API丰富
缺点:其性能跟不上高并发、大数据等应用场景。ActiveMQ显得力不从心。
2 Kafka

Kafka是LinkedIn开源的、分布式发布-订阅消息系统,目前属于Apache的顶级项目。其特点是基于Pull的模式来处理消息消费,追求高吞吐量,其设计目的就是用于日志收集和传输。0.8版本开始支持复制,但不支持事务,对消息的重复、丢失、错误等没有严格的要求,适合生产大量数据的互联网服务的数据收集业务

优点:吞吐量高(每秒百万级)
缺点:不支持事务,数据可靠性不是很高
3 RocketMQ

RocketMQ是阿里的开源消息中间件,目前已孵化为Apache顶级项目,它是纯Java开发,具有高吞吐量、高可用性、适合大规模分布式系统应用的特点。RocketMQ思路源于Kafka,它对消息的可靠传输及事务性做了优化。目前在阿里被广泛应用于交易、充值、流计算、消息推送、日志流式处理、binglog分发等场景

优点:高性能、支持事务、支持分布式、大数据
缺点:维护需要专业人员、商业版收费
4 RabbitMQ

RabbitMQ是使用Erlang语言开发的开源消息队列系统,基于AMQP协议实现。AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。AMQP协议更多用于企业系统内,对数据一致性、稳定性和可靠性要求很高的场景,对性能和吞吐量的要求还在其次

优点:性能适中,稳定性、可靠性高

猜你喜欢

转载自blog.csdn.net/cheerlh2018/article/details/107478145