学习消息队列
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