一、消息中间件概述

1.1MQ概述

MQ全称为消息队列,是在消息的传输过程中保存消息的容器。多用于分布式系统之间的通信
# 一、pandas是什么?示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。

1.2MQ的优势

1.应用解耦

MQ相当于一个中介,生产方通过MQ与消费方交互,他将应用程序进行解耦

系统的耦合性越高,容错性就越低,可维护性就越低
在这里插入图片描述
使用MQ使得应用间解耦,提升容错性和可维护性
在这里插入图片描述

2.任务异步处理

将不需要同步处理的并且耗时长的操作由消息队列通知消息接收方进行异步处理。提高了应用程序的响应时间
在这里插入图片描述

一个下单操作耗时:20+300+300+300=920
用户点击完下单按钮后,需要等待920ms才能得到下单响应
在这里插入图片描述
用户点击完下单按钮后,只需要等待52ms就能得到下单响应20+5=25
提升用户体验和系统吞吐量(单位时间内处理请求的数目)

3.削峰填谷

如订单系统,在下单的时候就会往数据库写数据。但是数据库只能支撑每秒1000左右的并发写入,并发量再高就容易宕机。假设低峰期的时候并发100左右,高峰期为5000左右,这时数据库肯定卡死了
在这里插入图片描述
消息被MQ保存起来,然后系统就可以按照自己的消费能力来消费,比如每秒1000个消息,这样慢慢写入数据库,就不会卡死数据库
在这里插入图片描述
在使用了MQ后,限制消费信息的速度为1000,但这样一来,高峰期产生的数据必会积压在MQ中,高峰就被削掉了,在高峰期过后的一段时间内,消费信息还是会维持在1000QPS(吞吐量),直到消费完积压的消息,这就叫填谷

1.3MQ的劣势

系统可用性降低

系统引入的外部依赖越多,系统的稳定性就越差。一旦MQ宕机,就会对业务造成影响。如何保证MQ的高可用?

系统复杂度提高

MQ的加入大大增加了系统的复杂程度,以前系统间是同步远程调用,现在通过MQ进行异步调用。如何保证消息没有被重复消费?怎么处理消息丢失情况?怎么保证消息传递的顺序性?

一致性问题

A系统处理完业务,通过MQ给B、C、D三个系统发消息,如果B系统、C系统处理成功,D系统处理失败。如何保证消息数据处理的一致性?

1.4常见的MQ产品

RabbitMQActiveMQRocketMQKafka
公司/社区RabbitApache阿里Apache
开发语言ErlangJavaJavaScala&Java
协议支持AMQP,XMPP,SMTP,STOMPOpenWire,STOMPREST,XMPP,AMQP自定义自定义协议,社区封装了http协议支持
客户端支持语言官方支持Erlang,Java,Ruby等,社区产出多种API,几乎支持所有语言Java,C,C++,Python,PHP,Perl,.net等Java,C++(不成熟)官方支持Java,社区产出多种API,如PHP,Python等
单机吞吐量万级(其次)万级(最差)十万级(最好)十万级(次之)
消息延迟微秒级毫秒级毫秒级毫秒以内
功能特性并发能力强,性能极其好,延时低,社区活跃,管理界面丰富老牌产品,成度高,文档较多MQ功能比较完备,扩展性佳只支持主要的MQ功能,毕竟是为大数据领域准备的。

1.5AMQP和JMS

实现MQ的大致两种主流方式:AMQP、JMS

AMQP

AMQP,即Advanced Message Queuing Protocol(高级消息队列协议)
,是一个网络协议,是应用层协议的一个开放标准,为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息,遵循此协议,不受客户端和中间件产品和开发语言限制。2006年,AMQP规范发布。类别HTTP
在这里插入图片描述

JMS

JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件的API
JMS是JavaEE规范中的一种,类比JDBC
很多消息中间件都实现了JMS规范,例如:ActivityMQ。RabbitMQ官方没有提供JMS的实现包,但是开源社区有

AMQP与JMS区别

  • JMS是定义了统一的接口,来对消息操作进行统一;AMQP是通过规定协议来统一数据交互的格式
  • JMS限定了必须使用Java语言;AMQP只是协议,不规定实现方式,因此是跨语言的
  • JMS规定了两种消息模式,而AMQP更加丰富
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐