消息队列——消息队列的应用场景

1 定义

消息队列:是一种数据结构
生产者:把数据放入到队列中的一方
消费者:把数据从队列中取出的一方

2 存在的意义

2.1 解耦
场景一:
存在三个系统
a系统要给b系统发送数据,调用系统b的接口
a系统要给c系统发送数据,调用系统c的接口
如果有一天b不需要a的数据了,就需要让a注释掉掉b接口的代码
如果新增系统d要接受数据,又要增加调用系统d的代码
这些调用逻辑都是一些重复的不可避免的劳动
此处的a系统与bcd系统高度耦合了,因为之间的数据交互如果需要修改,或者接受数据的系统出现了问题,那么a系统的调用逻辑还要思考需不需要继续发送数据

场景二:
在上述场景加入消息队列,消息队列是生产者(a系统)与消费者(bcd系统)之间的一个数据交互中转站
a系统发布消息,bcd订阅消息,如果不需要订阅就取消订阅即可,并不需要修改发布消息的代码
2.2 异步
消息队列是一个异步任务,如果a系统要完成产生数据(100ms),发送数据至系统b(300ms),发送数据至系统c(300ms)
此时a系统完成消息发送是一个同步任务,完成时间是100+300+300=700ms
如果用了消息队列,a系统只要产生消息,并发送至消息队列,由消息队列异步回调订阅过的系统接口
此时a系统完成发送消息的时间是100ms
2.3 削峰/限流
如果有一个商场网站出了促销活动,此时每秒的请求数是5000,一般的mysql只能处理2000个左右的并发。
此时在用户与mysql之间加入mq,它可以接受者5000个请求,但是只给mysql发送2000个。
就像一个喷水的管子,如果突然流水量过大,管子就会裂开,我们通过开关把水流量放小一点就问题不大,但是我们		  要知道,在这个开关后水压还是这么大,mq做到的只是限制最大量。
2.4 其他应用场景
日志处理:将大量日志存储到消息队列中(一般采用分布式消息队列kafka),解决大量日志传输的问题。其中,消息队列负责日志数据的接收,存储和转发;
消息通讯:点对点通讯或聊天室通讯。

3 使用消息队列会有什么优缺点

优点:
其实就是上文中谈到的,在特殊场景下的应用好处,解耦、异步与削峰等。
缺点:
系统可用性:
系统因为依赖与MQ消息队列这个服务,若这个服务崩溃了,那么我们的整个系统将不可用。为此往往我们都是通过集群/分布式部署来实现MQ高可用的。
高可用:通常来描述一个系统经过专门的设计,从而减少停工时间,而保持其服务的高度可用性
系统复杂度:
我们将数据写到消息队列上,就有可能会存在数据丢失的情况。以及我们如何保证消息没有被重复消费等问题。
一致性问题:
A系统将请求写入到消息队列后就返回请求成功了,假设在多机部署的时候,系统B、C写库成功,假设D写入失败了,这种情况下就会产生数据不一致的问题。
感谢原作者的贡献:https://www.jianshu.com/p/ec7c2503c3ef

感谢:https://huang_zhao.gitee.io/task/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值