Hello,大家好,我是阿粉,今天是周六,你是在放假还是跟阿粉一样在加班呢?今天的课题是跟大伙聊聊数据表的优化问题,这个问题小伙伴们在工作应该会遇到而且在面试中还经常会问到。
RPC 用着好好的?为什么还需要使用 MQ?
阿粉最近看了一场架构师之路沈剑老师的一场直播,最近又重温了一下,根据自己的认知总结了一下,分享给大家。
MQ 想必大家或多或少都用过,接入 MQ 之后的整体架构如下:
可以看到使用 MQ 之后,上下游通信就变成图上的这种方式。
这种跨进程的通信方式,我们还有一种常用的解决方案,使用 Dubbo 等这类 RPC 服务。
理论上使用 RPC 的跨进程通信的场景,使用 MQ 也能解决,当然反过来也能说通。
那为什么不都用 RPC,或者 MQ 来解决那?
这其实都是业务场景决定的,抛开业务场景来谈架构都是耍流氓!没有全能的架构,只要适合的架构。
下面我们来看看那些场景适合 RPC,而那些场景适合 MQ。
RPC 场景
使用 RPC 的场景一般都是上游服务需要实时依赖下游服务的返回。
我们以一个登录服务为例,架构图如下:
用户发起的登录请求首先由对外的 WEB 服务接受,然后 WEB 服务服务调用用户服务查询用户信息,然后比对用户密码。
也就是说我们的 WEB 应用需要实时依赖用户服务返回的用户信息,如果没有返回,这次登录将会失败。
假如这个场景我们用 MQ 代替, WEB 应用发送 MQ 消息之后,然后流程就结束了,此时 WEB 应用无法拿到用户信息。
所以说对于这种需要强依赖下游返回的场景,使用 MQ 将会带来以下不足:
- 上游无法直接得到下游结果
- 增加一个 MQ 组件,系统更复杂
MQ 场景
上游不关心下游结果的场景
举个例子,在我们第三方支付系统中,每支付成功一笔,都需要计算手续费。
这个场景我们显然可以使用 RPC 完成调用,但是实际上,支付系统是不关心的计费系统的结果,两个系统不存在直接强依赖的关系。
大家可以想象一下,用户实际上已经收到银行卡扣款短信了,但是支付系统因为计费系统失败,导致对外返回是失败的结果。这对于用户来讲,不能接受啊。我都付钱了,你却告诉我支付异常。
所以对于这种场景,直接使用 RPC 调用由以下几点不足:
- 系统整体调用延时增加
- 下游服务异常,影响上游服务。两者物理以及逻辑依赖严重
- 若后面再增加一个下游系统,需要知道支付成功的结果,上游系统需要改动代码。这种情况对于上游情况来讲,就会很烦。明明与上游系统没有什么关系,却需要修改代码。
那一定要用 MQ 解决吗?
其实不一定,对于我们上面举的场景,我们其实可以使用异步 RPC 或者线程池异步调用 RPC 就可以解决。
毕竟增加一个 MQ, 系统就变得更加复杂,我们还要单独运维 MQ,这对于小团队来讲,工作量还是很大的。
但是这种方式,还是解决不了,增加一个下游系统,上游系统还要改动的代码囧境。
增加 MQ 解耦
这个场景使用 MQ 解耦,带来几点优点:
- 任务一:上游系统执行时间变短
- 任务二:上下游逻辑解耦,物理解耦
- 任务三:最重要一点,增加一个下游服务,其只要订阅即可,上游服务无需要改动代码
数据驱动的定时任务场景
举个例子,支付公司每日都需要对账,主要目的是核实自己系统的应收的钱与支付渠道端是否一致,主要流程分为以下几步:
- 定时任务下载渠道对账文件,下载方式可能为 Http 接口下载,也有可能 SFTP 下载
- 定时任务解析对账文件,然后将对账数据入库
- 定时任务将自己本端支付数据与对账数据核对
上面的定时任务使用 Spring-Schedule 调度,假设各个定时任务下载时间如下所示:
上图中三个任务,任务二需要依赖任务一完成,而任务三有需要依赖任务二完成。
我们之前使用这种模式,通常会碰到几个问题:
- 通常 06:00 就能下载到对账文件,但是有时候渠道端对账文件延迟,就会导致任务一执行失败,这样就会后续两个定时任务也会执行失败
- 假设任务二数据过多,执行时间过长,任务三执行时还没结束,这就导致任务三无法拿到全量数据,导致对账异常
- 整体任务执行时间过长
- 任务一若调整时间,可能导致任务二,任务三都需要调整时间
使用 MQ解耦
使用 MQ 解耦之后架构图如下:
这种方式,只要任务一的定时任务准时启动,任务一完成之后发送 MQ 消息,任务二收到之后就会启动任务,结束之后再发送消息给 MQ。任务三流程同任务二
使用这种方式存在优点为:
- 下游任务只要收到消息就能立刻执行,不需要额外等待,整体任务执行时间变短
- 上游任务时间变动,无需修改下游任务时间。我们这个例子,只需要任务一的实际即可
总结
对于上游需要关注下游返回结果的场景,不适合使用 MQ。
适合使用 MQ 的场景有:
- 上游不关心下游结果的场景
- 数据驱动的定时任务依赖
网传虾米音乐将在明年一月关闭,网友直呼不要
Hello,大家好,我是阿粉,不知道大家最近有没有看到这个新闻,说虾米音乐将在明年一月份关闭,在被腾讯系音乐软件包围的大环境下,现在真的很少有引用软件能够发展起来,阿里旗下的也不例外。
现在市面上常用的音乐软件有网易云引用,QQ 音乐,酷我音乐,酷狗音乐,虾米音乐,咪咕音乐,其中虾米音乐所占的份额并不是特别多。
在网上传出这个说法的时候,网友直呼满满的都是回忆,不舍得虾米音乐被关闭。
其实阿粉不属于虾米音乐的粉丝,平日里用的比较多的还是 QQ 音乐和网易云音乐,因为感觉 QQ 音乐里面的都是青春,想当年阿粉还是 QQ 音乐三巨头的忠实歌迷,现在用的比较多的是网易云音乐,喜欢网易云音乐的每日推荐和私人 FM,总是能推荐一些不错的音乐。相反的 QQ 音乐用的少了一点,毕竟过了那个年纪~~扎心了。
虾米音乐已经发展了十多年了,在音乐届也绝对属于元老级的音乐平台。国内最早的一批独立音乐人,都是靠虾米整个平台,才让更多人听到了自己的作品,从初创开始,虾米就致力于扶持原创音乐和音乐人。
2013 年 1 月的时候,虾米被阿里收购,2015 年 3 月与天天动听合并为阿里音乐,说到这里其实阿粉当年还是挺喜欢天天动听这款音乐软件的,可惜后面渐渐落寞了。虾米的落寞很大的原因是当年的版权问题,导致很多原创歌曲被下架,渐渐的就流失了很多用户,从而导致这样的局面。
关于虾米音乐是否会被关闭的事件,目前官方还没有给出明确的答复,我们不做判断,但是从这件事我们还是可以看出,像阿里这样的大厂也不能说做什么一定成功的,更何况很多创业型小公司了,说实话要是虾米音乐在某个小公司手里,早就被关闭了,毕竟每年的版权投入是非常巨大的。
并发编程把我整的是服服气气的了
阿粉因为原来的编程习惯,已经很久没有去考虑并发的问题了,结果之前在面试的问题就回答的不是很完善,而阿粉也用心学习了并发编程这一块的所有内容,一起来分享给大家。
【非广告】Gitbook 接入 Gitlab Webhook 功能,实现文档实时在线更新
Hello,大家好,我是阿粉,对接文档是每个开发人员不可避免都要写的,友好的文档可以大大的提升工作效率。阿粉最近将项目的文档基于 Gitbook 和 Gitlab 的 Webhook 功能的在内网部署了一套实时的,使用起来特方便了。跟着阿粉的步骤,教你部署自己的文档服务。
读者提问:为什么 HashMap 会发生数据覆盖问题
在 面试官你能不能别问我 HashMap 了? 这篇文章中,有读者问阿粉,不同的值相同的 hash 值为什么会被覆盖, hashmap 不是对相同的 hash 值有链表结构处理吗
RandomAccess 明明是个空接口,能有什么用呢?
Hello,大家好,我是阿粉,Java 语言中有很多有意思的设计,之前二哥的一篇文章中介绍了Serializable
空接口,今天阿粉给大家介绍一个另一个 Java 中的空接口 RandomAccess
。
面试官你能不能别问我 HashMap 了?
面试官的那些套路,阿粉摸的都透透的
来说说垃圾回收怎么样~
JVM 的自动内存管理,让原本应该是开发人员去做的事情,变成了垃圾回收器来做的事情
常用sql脚本总结
数据库sql操作总结
JVM 是如何加载 Java 类的?
看到这个题目的时候,你可能就会觉得,阿粉,这不是挺简单的一个问题么
天天都在使用的 Java 注解,你真的了解它吗?
Hello,大家好,我是阿粉,Java 的注解相信大家天天都在用,但是关于注解的原理,大家都了解吗?这篇文章通过意见简单的示例给大家演示一下注解的使用和原理。
你还在手写crud吗,看完这篇文章,绝对赚了
看完本文,你一定会有所收获
双十一外卖会员只要 58 一年!还买一送一?
Hello,大家早上好,我是阿粉!
双十一已经过去好几天了,不知道大家战果如何?
今年双十一阿粉倒是没买很多东西,唯一买的东西,竟然还被骗了,城市套路深啊~
哎,给大家分享一下这次被骗经历,希望看到小伙伴都提高警惕。
事情是这样的,双十一之前阿粉的朋友推荐一个商品链接,说是可以低价购买美团外卖年度会员。
原价 100 多,现在为了冲双十一的销量,商家放出很多优惠券,满 100 就可以 50 ,相当于 58 就可以购买美团年度的会员。
而美团外卖 APP 上,一个月会员 15 ,一年等于需要 180,四舍五入相当于省了 100 多元钱。
起初,阿粉还是有点怀疑这个真实性的,真的会这么便宜?
朋友看我不相信,甩给我一个购买的订单截图,以及美团外卖 app 会员截图。
这么有理有据,阿粉开始相信这个了,于是也购买了一个。
购买之后,商户发送一个兑换码,需要跳到一个网站上兑换。
在这个网站,输入兑换码以及手机号之后,美团外卖 APP 上就绑定一个月的美团的会员。
起初,阿粉比较纳闷,明明买的是年度会员,你给我个一个月会员什么意思。
跑去跟客服沟通,客服回复这个他们这个年度会员并不是直接充值一年的会员,而是通过每个月帮客户自动续充月度会员,充值 12 个月。
注意了,套路就在这里,下文再仔细讲。
既然客服这么说了,阿粉也没继续怀疑了。毕竟实打实收到了一个月外卖会员,账户里也多了好几张外卖红包。
直到最近在 B 站刷到 up 主给我一个镜头 V 的视频,阿粉这才发现上当了。
https://b23.tv/kEiOBO
阿粉想起立刻去淘宝维权,还想尝试一下,看下能否退款。就算不能退款,那也要投诉这个商家。
打开之前购买的订单,阿粉发现这个店铺已经消失。想投诉,也没有地方可以投诉。
当然了,第一个月会员失效之后,他当然也没给我续充。。。。
四舍五入,净亏 43 元,商家通过这种方式每单至少可以赚 40 元以上。这简直是个暴利的赚钱方式。
现在细想一下,这里面真的有很多套路。
第一,上架的商品价格没有低的离谱,而是通过优惠券的方式满减扣掉,这样很容易让人以为是为了冲销量而发起的活动,让人有一种捡到便宜的感觉。
第二,当消费者购买之后,发现是月度会员的时候,这时会主动去咨询商家。而商家这边就会解释说这个年度会员将会在每个月失效前自动续充。然后商家还会诱导消费者,如果现在确认收货,还将会多送三个月的会员。
这时,作为消费者我们就可能为了优惠,很有可能就会确认收货了。
一旦确认收货了,这类会员充值属于虚拟商品,就无法再差评了。
另外某宝虽然有 15 天售后时间,有问题可以在 15 天内申请售后,还是可以退款的。
但是呢,商家给我的发的是月卡,我们只有在 30 天后才会发现不续费的问题,这样售后时间早就过去了。
第三,他们的兑换网站,看起来就像官方做的一样,让人以为是官方自己的活动。其实我们仔细看看,还是能发现端倪,因为这个网站地址,不是美团自己的域名。
哎,分享这个惨痛的经历,希望各位小伙伴,要是碰到这种低价年度会员,擦亮眼睛了。
从双十一凌晨准时开启秒杀,看任务调度实践历程
定时任务开启篇
你是不是 redo log 和 binlog 傻傻分不清楚?
阿粉这么贴心,肯定给你讲清楚了~
懂王特朗普真的会把总统的位置拱手相送么?
说实话,阿粉自从开始接触电脑以来,从来没有关注过美国大选,但是这次因为各种新闻的推送,也不得不开始关注美国大选了,就在昨天,美国民主党候选人拜登在美国大选中获胜,将成为美国第46任总统,而“懂王”特朗普真的会心甘情愿的放弃白宫的位置,让拜登选手正式入驻白宫么?那么我们先来分析一下这个美国目前的形式。
朋友说要被他女朋友烦死了,竟然是因为“小视频”
Hello,大家好,我是阿粉,前几天阿粉的一个朋友跟阿粉抱怨说自己快被女朋友烦死了,他说自己的女朋友报了一个舞蹈班,因为今年的疫情原因线下课程改成了线上课程,但是因为下班回来比较晚,线上的直播课经常耽误没上到,而且这个课程视频只能在线回看一周,很多复杂的动作要看好多遍才能学会,更由于很多时候种种原因就把课程给拉下了,女朋友就因为这个整天跟他闹,搞的他心里很烦。
在foreach里面如果我们进行remove和add会发生什么大事呢?
相信大家肯定都看过阿里巴巴开发手册,而在阿里巴巴开发手册中明确的指出,不要再foreach循环里面进行元素的add和remove,如果你非要进行remove元素,那么请使用Iterator方式,如果存在并发,那么你一定要选择加锁。
微信支付、支付宝最全接入指引,看完立刻就可以上手!
Hello,大家好,我是阿粉~
前端时间阿粉在公司接手了一个支付项目,这个项目接入了微信、支付宝。这个项目开发下来,阿粉可是完完整整体验了一下微信、支付宝开发流程,也踩了一些坑。
最近正好看到有些小伙伴想接入微信、支付宝,但是不知道如何开发,所以阿粉就给大家总结一下微信支付、支付宝接入开发流程。