消息队列介绍
消息队列是在消息的传输过程中保存消息的容器。消息生产者将消息放到消息队列后无论消息是否被消费都会继续处理后面的任务,消息队列充当消息生产者与消费者之间的中间人角色或通知存储的容器。队列的主要目的是提供路由并保证消息的传递;如果发送消息时接收者不可用,消息队列会保留消息,直到可以成功地传递它(根据设定的策略)。消息队列通常实现的目的是解耦+削峰+异步
一个消息可以只被一个消费者消费,也可使被多个消费者消费
目的及适用场景
-
异步
如用户注册成功后使用消息队列,主线程只是把用户成功注册的消息放入消息队列,即可继续后续任务的执行,期间不去关心邮件是否发送成功,有订阅此消息的消息消费者去执行发送邮件的任务。如把用户注册的相关业务分成3步,第一步验证用户信息并保存进数据库,第二步发送邮件,第三步返回客户端信息,使用传统的方式串行执行,假如使用的时间分别是50,50,20,则总共使用120,如果使用消息队列,则不用关心发布邮件的问题,子线程将消息存入消息队列则减少中间50的时间花费。 -
解耦
还是使用上面的列子,如果使用传统的串行方式,如果中间发布邮件出现错误,邮件发送失败,一种方法是直接跳过该操作,邮件不予发送,一种是发送邮件成功与否状态保存数据库,使用定时任务定时执行不成功的邮件发送任务。无论哪种方式系统任务初始方式耦合度都很高,使用消息队列则不用关心邮件是否发送成功,生产者完全不用关心消费者是否能够正确执行任务,消费者只是执行在队列中订阅的任务,实现了系统解耦。 -
削锋
如在一个秒杀活动中,在流量大的情况下不做任何流量限制措施,服务器很可能会垮掉。用户的请求在服务器接收后,首先写入消息队列,假如消息队列长度超过最大数量,则直接抛弃用户请求或跳转到错误页面,秒杀业务根据消息队列中的请求信息,再做后续处理。
其他的场景使用方面比如系统日志,其实也是异步/解耦/削峰的实现,知道消息队列能够解决什么问题,在系统开发或架构中灵活使用,选择使用远程过程调用(RPC)还是消息队列,相信都能有最合适的解决方案。