十二张图,踹开消息队列的大门(1)

本文讲述了程序员在日常工作中遇到的系统对接问题,通过引入消息队列实现了解耦、异步处理和流量控制。作者还强调了技术准备的重要性,包括技术沉淀、面试技巧和简历优化,提醒读者技术提升需长期积累和实战经验。
摘要由CSDN通过智能技术生成

订单支付-3

就这样,我过上了暗无天日的日子,我要维护和若干个系统的对接,每次他们发布新版本,我都要跟着值班。

我要迭代,也要改和几个系统的对接代码。

周一,营销系统;

周二,库存系统;

……

这天,眼圈发黑的我正在和下游服务撕巴的时候,突然忍不住两腿战战,她来了,产品(女)(王)来了——她是我不能拒绝的女人。

脆弱的眼泪流了满面,我的猿生一片灰暗……

没想到,代救星出现了,我的好朋友傲天过来了,拿鼻孔看着我。

“你个Loser,竟不知道用消息队列,怪不得天天被人欺负,哼!”

一语惊醒梦中人,为什么不用消息队列啊?

于是我引入消息队列,对系统进行了重构。

消息队列重构

这下好了,我只管更新订单状态,剩下的丢给消息队列,你们这些下游自己去消息队列消费消息就好了,别来缠着我了。

……

引入消息队列之后,又是一个闲适的下午。

我没有在群聊里扯扯,因为我退群了。

前几天,我受到了前所未有的伤害——

我在群里嘲讽一个老哥,技术真菜,连消息队列都不会!

老哥反手就发出他和女朋友的合照,“单身狗,技术好又怎么样,连个女朋友都没有!”

我瞬间san值狂掉!

“程序员单身,不算单身……new个对象的事,能算单身么?”接连着便是什么难懂的话,什么“没有妹子”,什么“哲学”之类,引得众人都哄笑起来,群里充满了快活的空气。

于是,这个下午我盯着空空如也的需求单发呆,公司真的没有妹子么?……

好了,冗长的前奏结束了,接下来该进入正文了😂。

消息队列つ用途

=========================================================================

在上面的前言中,我们已经了解了消息队列最重要的一个用途:

  • 解耦

通过消息队列,降低系统间的耦合,避免过多的调用。

就好像公司的行政小姐姐要通知一件事情,她通常会是在群里发一个公告,然后我们扣1就行了。要是一个个通知,她要通知几十上百次。

  • 异步

还是上面我们提到的订单支付,支付之后,我们要扣减库存、增加积分、发送消息等等,这样一来这个链路就长了,链路一长,响应时间就变长了。引入消息队列,除了更新订单状态,其它的都可以异步去做,这样一来就来,就能更快地响应我们的上游。

消息队列异步

为什么不用多线程之类的方式做异步呢?——

嗨,只用多线程做异步,不是还得写代码去调那一堆下游吗,所以这又回到了解耦这个问题上。

  • 削峰

消息队列同样可以用来削峰。

用一个比喻,一条河流,假如它的下游能容纳的水量是有限的,为了防止洪水冲垮堤坝,我们应该怎么办呢?

我们可以在上游修建一个水库,洪峰来的时候,我们先把水给蓄起来,闸口里只放出下游能承受地住的水量。

放在我们的系统,也是一个道理。比如秒杀系统,平时流量很低,但是要做秒杀活动,秒杀的时候流量疯狂怼进来,你的服务器,RedisMySQL各自的承受能力都不一样,直接全部流量照单全收肯定有问题啊,严重点可能直接打挂了。

所以一样,我们可以把请求放到队列里面,只放出我们下游服务能处理的流量,这样就能抗住短时间的大流量了。

削峰

除了这三大用途之外,还可以利用队列本身的顺序性,来满足消息必须按顺序投递的场景;利用队列 + 定时任务来实现消息的延时消费 ……

消息队列つ本质

=========================================================================

过气老北鼻马老师有三招——

消息队列核心有三板斧:消费

生产者先将消息投递一个叫做「队列」的容器中,然后再从这个容器中取出消息,最后再转发给消费者[1]。

消息队列核心

上面这个图便是消息队列最原始的模型,它包含了消息队列中的一两个关键词消息和队列队列

  1. 消息:就是要传输的数据,可以是最简单的文本字符串,也可以是自定义的复杂格式。

  2. 队列:大家应该再熟悉不过了,是一种先进先出数据结构。它是存放消息的容器,消息从队尾入队,从队头出队,入队即发消息的过程,出队即收消息的过程。

所以消息队列的本质就是把要传输的数据放在队列中。

围绕着这个本质:

  • 把数据放到消息队列的角色就是生产者

  • 把数据从队列中取出的就是消费者

消息队列つ模型

=========================================================================

[1]我们上面已经了解了消息队列模型的本质,随着应用场景的变化,消息队列的模型逐渐发生了一些演进。

就好像我们的文字通讯,最开始单对单地发消息,后来可以群发,再后来,可以拉一个群聊。

  • 队列模型

最初的消息队列就是上一节讲的原始模型,它是一个严格意义上的队列(Queue)。消息按照什么顺序写进去,就按照什么顺序读出来。不过,队列没有 “读” 这个操作,读就是出队,从队头中 “删除” 这个消息。

队列模型

如果有多个生产者往同一个队列里面发送消息,这个队列中可以消费到的消息,就是这些生产者生产的所有消息的合集。消息的顺序就是这些生产者发送消息的自然顺序。

如果有多个消费者接收同一个队列的消息,这些消费者之间实际上是竞争的关系,每个消费者只能收到队列中的一部分消息,也就是说任何一条消息只能被其中的一个消费者收到。

  • 发布 - 订阅模型

如果需要将一份消息数据分发给多个消费者,并且每个消费者都要求收到全量的消息。很显然,队列模型无法满足这个需求。

一个可行的方案是:为每个消费者创建一个单独的队列,让生产者发送多份。这种做法比较笨,而且同一份数据会被复制多份,也很浪费空间。

为了解决这个问题,就演化出了另外一种消息模型:发布-订阅模型。

发布-订阅模型

在发布 - 订阅模型中,消息的发送方称为发布者(Publisher),消息的接收方称为订阅者(Subscriber),服务端存放消息的容器称为主题(Topic)。发布者将消息发送到主题中,订阅者在接收消息之前需要先“订阅主题”。“订阅”在这里既是一个动作,同时还可以认为是主题在消费时的一个逻辑副本,每份订阅中,订阅者都可以接收到主题的所有消息。

仔细对比下它和 “队列模式” 的异同:生产者就是发布者,队列就是主题,消费者就是订阅者,无本质区别。唯一的不同点在于:一份消息数据是否可以被多次消费。

消息队列つ代价

=========================================================================

天下没有白吃的午餐——这句话放在系统设计中同样适用。引入了消息队列,解决了一些问题,但同时也增加了系统的复杂性和维护成本。[5]

  • 高可用

前面说,我们引入了消息队列,降低了系统间的耦合,但是,我们对消息队列的依赖也变重了,想想,要是消息队列挂了,那我们下游就全凉了。

消息队列故障

所以,我们消息队列的部署必须保证高可用,至少是主/从,一般都得集群/分布式

  • 消息丢失问题

我们将数据写到消息队列上,下游服务没来得及取消息队列的数据,突然挂了。如果没有做任何的措施,我们的数据就丢了

消息丢失

那可怎么办呢?

消息队列中的数据得想办法存在别的地方,这样才尽可能减少数据的丢失。

问题又来了,存在哪呢?

  • 磁盘?
    自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

最后的内容

在开头跟大家分享的时候我就说,面试我是没有做好准备的,全靠平时的积累,确实有点临时抱佛脚了,以至于我自己还是挺懊恼的。(准备好了或许可以拿个40k,没做准备只有30k+,你们懂那种感觉吗)

如何准备面试?

1、前期铺垫(技术沉积)

程序员面试其实是对于技术的一次摸底考试,你的技术牛逼,那你就是大爷。大厂对于技术的要求主要体现在:基础,原理,深入研究源码,广度,实战五个方面,也只有将原理理论结合实战才能把技术点吃透。

下面是我会看的一些资料笔记,希望能帮助大家由浅入深,由点到面的学习Java,应对大厂面试官的灵魂追问

这部分内容过多,小编只贴出部分内容展示给大家了,见谅见谅!

  • Java程序员必看《Java开发核心笔记(华山版)》

  • Redis学习笔记

  • Java并发编程学习笔记

四部分,详细拆分并发编程——并发编程+模式篇+应用篇+原理篇

  • Java程序员必看书籍《深入理解 ava虚拟机第3版》(pdf版)

  • 大厂面试必问——数据结构与算法汇集笔记

其他像Spring,SpringBoot,SpringCloud,SpringCloudAlibaba,Dubbo,Zookeeper,Kafka,RocketMQ,RabbitMQ,Netty,MySQL,Docker,K8s等等我都整理好,这里就不一一展示了。

2、狂刷面试题

技术主要是体现在平时的积累实用,面试前准备两个月的时间再好好复习一遍,紧接着就可以刷面试题了,下面这些面试题都是小编精心整理的,贴给大家看看。

①大厂高频45道笔试题(智商题)

②BAT大厂面试总结(部分内容截图)

③面试总结

3、结合实际,修改简历

程序员的简历一定要多下一些功夫,尤其是对一些字眼要再三斟酌,如“精通、熟悉、了解”这三者的区别一定要区分清楚,否则就是在给自己挖坑了。当然不会包装,我可以将我的简历给你参考参考,如果还不够,那下面这些简历模板任你挑选:

以上分享,希望大家可以在金三银四跳槽季找到一份好工作,但千万也记住,技术一定是平时工作种累计或者自学(或报班跟着老师学)通过实战累计的,千万不要临时抱佛脚。

另外,面试中遇到不会的问题不妨尝试讲讲自己的思路,因为有些问题不是考察我们的编程能力,而是逻辑思维表达能力;最后平时要进行自我分析与评价,做好职业规划,不断摸索,提高自己的编程能力和抽象思维能力。
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
熟悉、了解”这三者的区别一定要区分清楚,否则就是在给自己挖坑了。当然不会包装,我可以将我的简历给你参考参考,如果还不够,那下面这些简历模板任你挑选:

[外链图片转存中…(img-4nwoMVuq-1713552798322)]

以上分享,希望大家可以在金三银四跳槽季找到一份好工作,但千万也记住,技术一定是平时工作种累计或者自学(或报班跟着老师学)通过实战累计的,千万不要临时抱佛脚。

另外,面试中遇到不会的问题不妨尝试讲讲自己的思路,因为有些问题不是考察我们的编程能力,而是逻辑思维表达能力;最后平时要进行自我分析与评价,做好职业规划,不断摸索,提高自己的编程能力和抽象思维能力。
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值