消息队列知识储备

本文介绍了消息队列在系统解耦、异步处理和限流等方面的作用,并讨论了使用消息队列时需要考虑的高可用、数据丢失、幂等性、数据一致性等问题。通过举例说明了事务在保持数据一致性中的作用,以及如何避免消息队列积压。此外,还概述了消息队列的模型演化,包括队列模型、发布-订阅者模型以及RabbitMQ和Kafka/RocketMQ的消息模型。
摘要由CSDN通过智能技术生成

学习消息队列

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。如果检测到序号不连续,那就是丢消息了。还可以通过缺失的序号来确定丢失的是哪条消息,方便进一步排查原因。
    
  • 确保消息可靠传递

    	在生产阶段,消息队列通过最常用的请求确认机制,来保证消息的可靠传递:当你的代码调用发消息方法时&#x
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值