消息队列知识储备

学习消息队列

1.背景

​ 学习,不懂得就要学。

2.定义

  • 消息队列可以简单理解为:把要传输的数据放在队列中
    • 把数据放到消息队列叫做生产者
    • 从消息队列里边取数据叫做消费者

3.为什么要用消息队列

3.1为了解耦。

例子:

[外链图片转存失败,源站可能有在这里插入图片描述

系统A将userId写到消息队列中,系统C和系统D从消息队列中拿数据。这样有什么好处

  • 系统A只负责把数据写到队列中,谁想要或不想要这个数据(消息),系统A一点都不关心
  • 即便现在系统D不想要userId这个数据了,系统B又突然想要userId这个数据了,都跟系统A无关,系统A一点代码都不用改。
  • 系统D拿userId不再经过系统A,而是从消息队列里边拿。系统D即便挂了或者请求超时,都跟系统A无关,只跟消息队列有关

这样一来,系统A与系统B、C、D都解耦

3.2为了异步,提高性能

在这里插入图片描述

生产者生产完放入队列就去干别的事情。

3.3为了限流

在这里插入图片描述

生产者生产多少就在队列中放多少,消费者消费多少就在队列中拿多少。

4.使用消息队列要考虑什么问题

4.1高可用

项目中使用消息队列,都是得集群/分布式的。要做集群/分布式就必然希望该消息队列能够提供现成的支持,而不是自己写代码手动去实现。

4.2数据丢失问题

  • 写到消息队列上,系统B和C还没来得及取消息队列的数据,就挂掉了。如果没有做任何的措施,我们的数据就丢了。消息队列中的数据也需要存在别的地方,这样才尽可能减少数据的丢失
丢消息的原因

绝大部分丢消息的原因都是由于开发者不熟悉消息队列,没有正确使用和配置消息队列导致的

消息队列怎么保证消息可靠传递的
  • 利用消息队列的有序性来验证是否有消息丢失

    在 Producer 端,我们给每个发出的消息附加一个连续递增的序号,然后在 Consumer 端来检查这个序号的连续性。
    如果没有消息丢失,Consumer 收到消息的序号必然是连续递增的,或者说收到的消息,其中的序号必然是上一条消息的序号 +1。如果检测到序号不连续,那就是丢消息了。还可以通过缺失的序号来确定丢失的
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值