<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          回答計算機問題的一種思考方式

          共 2026字,需瀏覽 5分鐘

           ·

          2021-05-28 01:25

          低并發(fā)編程
          戰(zhàn)略上藐視技術(shù),戰(zhàn)術(shù)上重視技術(shù)

          以前我有一類面試問題總是不會回答:
          如何解決 XXX 問題?
          舉一個具體的例子:
          TCP 如何解決丟包的問題?
          每當(dāng)問到這類問題的時候,我的腦子是蒙蒙的,一片空白。
          當(dāng)然,這個問題你知道答案,就很簡單了,ACK + 重傳嘛。
          但假如你不知道答案呢?

          給小宇寄錢





          這里我想到了一個很有意思的場景。
          假如我要給我女朋友小宇郵寄 1000 塊錢,我問小宇:
          小宇,我要給你郵 1000 塊錢過去,萬一路上丟了怎么辦?
          這時小宇肯定會說:
          啊,你把郵寄地址寫好了,郵票貼好了,都仔細(xì)檢查著,時時刻刻盯著快遞信息,時不時打電話問一下。哎不行,要不你一路跟著快遞吧,或者要不你親自給我送過來吧!
          你看,這種思維方式在生活中是完全正確的,但放在剛剛那個問題,就不對了。
          那就陷入了,TCP 作為一個傳輸層協(xié)議,要解決丟包問題,還要干擾下面網(wǎng)絡(luò)層的事情,實際上是做不到的。
          當(dāng)然,如果是一個富二代小宇,很快就能找到正確的解決方案:
          丟了就丟了唄,你再寄一次不就完了。
          這就是 TCP 層該考慮的事情,網(wǎng)絡(luò)層丟包不可避免,丟了我就重傳,就這么簡單。

          思維轉(zhuǎn)變





          看到?jīng)],TCP 層并不需要,也不應(yīng)該去“解決”丟包的問題,只需要去考慮丟包問題發(fā)生后,該怎么處理,即可。
          如果按照這個思路,我覺得即使不知道這個問題的答案,也能猜個八九不離十,這就這類計算機問題的一種思維吧。
          這個問題甚至有個更具迷惑性的問法,而這種問法面試中還更常見:
          TCP 為什么可以保證不丟包?
          這下壞了,更引導(dǎo)你往剛剛生活中的思維方式去想,將重點放在“不”丟包的方案上。
          所以很多時候,遇到類似:
          如何解決 XXX 問題?
          如何避免 XXX 問題?
          如何保證不出現(xiàn) XXX 問題?
          沒有思路時,不妨換個問法問自己:
          XXX 問題是無法避免的,它出現(xiàn)的時候應(yīng)該采取什么補救措施?
          拿剛剛寄錢這個問題舉例,就是你就當(dāng)錢已經(jīng)寄丟了,并且也找不回來了,但小宇必須最后得拿到 1000 塊錢,那還怎么辦呢?只有重新寄了。
          這樣,其實即使是個外行人,或許也能答上個一二。 

          試試 mq 連環(huán)炮





          mq 的面試題中往往有一些經(jīng)典的連環(huán)炮問法,就是 mq 如何保證消息不怎么怎么樣的。
          我們用剛剛的思維來試試。

          問:mq 如何保證消息不丟失?

          錯誤的思考方式:
          我要保證生產(chǎn)端到 mq 的網(wǎng)絡(luò)狀態(tài)良好,我要保證 mq 服務(wù)不掛,我要保證 mq 到消費端的網(wǎng)絡(luò)狀態(tài)良好。
          正確的思考方式:
          mq 的消息是一定會丟失的,丟失了之后怎么辦?
          如果生產(chǎn)端到 mq 丟失了,沒辦法,重傳!
          如果 mq 服務(wù)掛了丟失了,沒辦法,只能通過存盤、主從、集群等方式減少這個概率。
          但仍然是會丟,怎么辦?要么你的業(yè)務(wù)有一定容忍度,要么存盤過程改同步,失敗了就,重傳!
          如果mq 到消費端丟失了,沒辦法,重傳!
          看到?jīng)],你會發(fā)現(xiàn)思路如果對了,這些問題都能按照最蠢的方式答個八九不離十。
          趁熱打鐵再來一個。

          問:mq 如何保證消息不重復(fù)?

          直接來正確的思考方式:
          不管如何,消息重復(fù)問題不可避免,消費端直接就想想收到了重復(fù)的消息怎么辦就行了。
          那自然就引出了第一個要解決的問題,就是消費端先考慮怎么知道兩個消息是重復(fù)的?
          那又自然引出了兩種解決辦法。
          第一種,消息體里面放一個 ID,消費端自己根據(jù)這個 ID 來判斷是不是同一個消息。
          第二種,mq 提供一種機制,可以查詢一條消息是否已經(jīng)發(fā)送過。
          兩種方式,一種交給自己,一種交給別人,搞定了消息是不是重復(fù)的這個判斷問題。
          接下來,解決如果重復(fù)了怎么辦?
          那這個問題就十分業(yè)務(wù)了,可以放飛自我回答,但也分兩種思想。
          第一種,業(yè)務(wù)端不在乎,重復(fù)就重復(fù)了,比如一篇文章的閱讀數(shù),多一個少一個,不在乎。
          第二種,各種辦法實現(xiàn)冪等,比如數(shù)據(jù)庫弄唯一標(biāo)識,重復(fù)插入就直接報錯?;蛘邌为毰粡埍恚严⑽ㄒ粯?biāo)識存起來,來一條消息時先判斷是否在這個表里,如果已經(jīng)存在了就什么都不做。
          其實,也是一種交給業(yè)務(wù)邏輯自己處理,一種交給其他人比如 mysql 處理。

          合理運用





          當(dāng)然,這種思維方式,本質(zhì)上適用于那些問法本身就有問題的問題。
          就比如本文所提到的問題,其實本身就是有問題的,只不過我們都約定俗成這么問罷了。
          比如另一個 mq 問題,mq 如何保證消息的順序性?
          這你就不能再轉(zhuǎn)換成:
          mq 無法保證順序性,亂序之后怎么辦?
          當(dāng)然也是個思考方式,但并不是這個問題主要想問的點了。
          所以,善用今天給大家講的這種思路,很多問題可以清晰不少,希望可以幫到大家。

          課后作業(yè)


          把這個思路告訴你的女朋友(非技術(shù)女友),或者好基友,然后讓她試試回答你遇到的面試題,看看是不是也能回答上來一些。
          由于我的女友也是搞技術(shù)的,就沒法做實驗了,大家得空了幫我試試喲~
          瀏覽 44
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  久久精品69 | 水密桃视频下载 | 中文字幕欧美日韩在线视频播放 | 伊人色播| 国产mv和日韩 |