消息队列
消息队列
传统消息队列的应用场景
进行异步的一些处理,加快系统的响应时间,比如用户进行注册时需要将注册信息先写入数据库再调用发送短信的接口这样的话比较慢,加入了消息队列时,我们在用户将注册信息填写完写入数据库时,页面就响应注册成功,然后我们就将发送短信的消息写入消息系统,这样减少了系统的响应时间问题。
使用消息队列的好处
解耦
异步
用户向系统A发送一个请求,系统A处理一条sql20ms,系统A分别再调用系统B,C,D的接口,分别耗时100ms,200ms,100ms,加起来一共耗时420ms
削峰
我们有一个系统,在一天中的00:00-08:00用户的访问量不大,每秒并发发请求只有500条,但是在一天中的16:00-18:00用户的访问量很大,每秒并发请求一下子达到了一万条,那么这样的话我们的系统就可能会崩溃。
缓冲
有助于控制和优化数据流,控制生产和消费数据不一致的问题
使用消息队列的坏处
可用性降低
如果消息队列挂掉,那么系统A就无法往消息队列中发送数据,系统B、C、D也无法从消息队列中消费数据,整个系统就会崩溃,这是非常严重的。
复杂性变高
系统A本来向系统B发送一条消息就可以了,但是因为与MQ协调的不好导致发送了两条数据给系统B
一致性问题
本来用户给系统A发送一个请求,需要ABCD全部执行完,但是因为消息队列可能系统D没有执行成功,就将执行成功的信息反馈给了·用户。
JMS AMQP
JMS
JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。
点对点模式
将消息发送到队列中,一个消息只能被一个消费者消费,可以有多个消费者
发布-订阅模式
将消息发布到队列中的topic中,消费者可以订阅topic来进行消费,一条数据可以被多个订阅者消费。
AMQP
AMQP,即Advanced Message Queuing Protocol,一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品,不同的开发语言等条件的限制。Erlang中的实现有RabbitMQ等。