回答计算机问题的一种思考方式

共 2026字,需浏览 5分钟

 ·

2021-05-28 01:25

低并发编程
战略上藐视技术,战术上重视技术

以前我有一类面试问题总是不会回答:
如何解决 XXX 问题?
举一个具体的例子:
TCP 如何解决丢包的问题?
每当问到这类问题的时候,我的脑子是蒙蒙的,一片空白。
当然,这个问题你知道答案,就很简单了,ACK + 重传嘛。
但假如你不知道答案呢?

给小宇寄钱





这里我想到了一个很有意思的场景。
假如我要给我女朋友小宇邮寄 1000 块钱,我问小宇:
小宇,我要给你邮 1000 块钱过去,万一路上丢了怎么办?
这时小宇肯定会说:
啊,你把邮寄地址写好了,邮票贴好了,都仔细检查着,时时刻刻盯着快递信息,时不时打电话问一下。哎不行,要不你一路跟着快递吧,或者要不你亲自给我送过来吧!
你看,这种思维方式在生活中是完全正确的,但放在刚刚那个问题,就不对了。
那就陷入了,TCP 作为一个传输层协议,要解决丢包问题,还要干扰下面网络层的事情,实际上是做不到的。
当然,如果是一个富二代小宇,很快就能找到正确的解决方案:
丢了就丢了呗,你再寄一次不就完了。
这就是 TCP 层该考虑的事情,网络层丢包不可避免,丢了我就重传,就这么简单。

思维转变





看到没,TCP 层并不需要,也不应该去“解决”丢包的问题,只需要去考虑丢包问题发生后,该怎么处理,即可。
如果按照这个思路,我觉得即使不知道这个问题的答案,也能猜个八九不离十,这就这类计算机问题的一种思维吧。
这个问题甚至有个更具迷惑性的问法,而这种问法面试中还更常见:
TCP 为什么可以保证不丢包?
这下坏了,更引导你往刚刚生活中的思维方式去想,将重点放在“不”丢包的方案上。
所以很多时候,遇到类似:
如何解决 XXX 问题?
如何避免 XXX 问题?
如何保证不出现 XXX 问题?
没有思路时,不妨换个问法问自己:
XXX 问题是无法避免的,它出现的时候应该采取什么补救措施?
拿刚刚寄钱这个问题举例,就是你就当钱已经寄丢了,并且也找不回来了,但小宇必须最后得拿到 1000 块钱,那还怎么办呢?只有重新寄了。
这样,其实即使是个外行人,或许也能答上个一二。 

试试 mq 连环炮





mq 的面试题中往往有一些经典的连环炮问法,就是 mq 如何保证消息不怎么怎么样的。
我们用刚刚的思维来试试。

问:mq 如何保证消息不丢失?

错误的思考方式:
我要保证生产端到 mq 的网络状态良好,我要保证 mq 服务不挂,我要保证 mq 到消费端的网络状态良好。
正确的思考方式:
mq 的消息是一定会丢失的,丢失了之后怎么办?
如果生产端到 mq 丢失了,没办法,重传!
如果 mq 服务挂了丢失了,没办法,只能通过存盘、主从、集群等方式减少这个概率。
但仍然是会丢,怎么办?要么你的业务有一定容忍度,要么存盘过程改同步,失败了就,重传!
如果mq 到消费端丢失了,没办法,重传!
看到没,你会发现思路如果对了,这些问题都能按照最蠢的方式答个八九不离十。
趁热打铁再来一个。

问:mq 如何保证消息不重复?

直接来正确的思考方式:
不管如何,消息重复问题不可避免,消费端直接就想想收到了重复的消息怎么办就行了。
那自然就引出了第一个要解决的问题,就是消费端先考虑怎么知道两个消息是重复的?
那又自然引出了两种解决办法。
第一种,消息体里面放一个 ID,消费端自己根据这个 ID 来判断是不是同一个消息。
第二种,mq 提供一种机制,可以查询一条消息是否已经发送过。
两种方式,一种交给自己,一种交给别人,搞定了消息是不是重复的这个判断问题。
接下来,解决如果重复了怎么办?
那这个问题就十分业务了,可以放飞自我回答,但也分两种思想。
第一种,业务端不在乎,重复就重复了,比如一篇文章的阅读数,多一个少一个,不在乎。
第二种,各种办法实现幂等,比如数据库弄唯一标识,重复插入就直接报错。或者单独弄一张表,把消息唯一标识存起来,来一条消息时先判断是否在这个表里,如果已经存在了就什么都不做。
其实,也是一种交给业务逻辑自己处理,一种交给其他人比如 mysql 处理

合理运用





当然,这种思维方式,本质上适用于那些问法本身就有问题的问题。
就比如本文所提到的问题,其实本身就是有问题的,只不过我们都约定俗成这么问罢了。
比如另一个 mq 问题,mq 如何保证消息的顺序性?
这你就不能再转换成:
mq 无法保证顺序性,乱序之后怎么办?
当然也是个思考方式,但并不是这个问题主要想问的点了。
所以,善用今天给大家讲的这种思路,很多问题可以清晰不少,希望可以帮到大家。

课后作业


把这个思路告诉你的女朋友(非技术女友),或者好基友,然后让她试试回答你遇到的面试题,看看是不是也能回答上来一些。
由于我的女友也是搞技术的,就没法做实验了,大家得空了帮我试试哟~
浏览 34
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报