MQ
引入
消息队列
简单理解就是把要传输的数据放在队列中
生产消息的叫生产者,从队列中消费消息的叫消费者
好处:解耦、削峰、异步
缺点:引入更多的外部依赖降低了系统可用性,增加了系统复杂性、同时带来消息一致性问题
消息队列
队列 :先进新出
java中已经有不少队列的实现,但是都是简单的内存队列,而消息中间件要考虑高可用,数据丢失等问题
优势
解耦
比如系统A对接多个其他系统,任何一个其他系统对A系统的需求发生改变都需要变更A系统
使用消息队列,A系统只负责把其他系统需要的数据存放在队列中,谁要谁拿,系统A不需要时长被动的去做出更改,以做到解耦
异步
同步调用会增加系统整体的耗时,而且取决于耗时最长的部分,对于注重吞吐量的业务来说,异步调用能够缩短服务调用时间,对于不需要等待返回值的调用,像删除日志记录这种,使用异步调用会更好
削峰/限流
上游短时间过多的请求可能会使下游系统超负荷,如果缓存到消息队列中,下游系统可以根据自己的实际能力去逐步处理请求
需要考虑的问题
高可用
消息队列不能是单机的,万一这台机器挂了,整个系统都将不可用
数据丢失问题
将数据写到队列上,下游还没来得及消费,队列就挂掉了(一般MQ中间件为了提高系统的吞吐量会把消息保存在内存中)
消息队列中的数据需要有别的地方存储,像redis一样
怎么得到队列数据?
生产者将数据放到消息队列纵,消息队列有数据了,主动叫消费者去拿(push)
消费者不断轮询消息队列,看有没有新的数据,如果有就消费(pull)
宕机后消息还存在吗?
消息一般都是存放在内存中的,宕机后消息会丢失,需要持久化,存储到磁盘或者数据库
常用MQ
作者: deity-night
出处: https://www.cnblogs.com/deity-night/
关于作者:码农
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出, 原文链接 如有问题, 可邮件(***@163.com)咨询.