自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

不可變模式篇:非常抓狂,這特么到底是哪里不對?

開發(fā) 前端
本章,主要以場景故事線的方式講述了小菜來公司幾天后,接到第一個統(tǒng)計訪問商品詳情接口的項目任務(wù),本以為很簡單的功能,三下五除二做完,提交測試環(huán)境后,被測試打回,反復(fù)排查和調(diào)試代碼,也沒發(fā)現(xiàn)問題的過程。此時的小菜心里有點郁悶,明明很簡單的功能,這特么到底是哪里不對?
  • 本章難度:★★☆☆☆
  • 本章重點:以場景故事的形式講述小菜到公司幾天后,接到第一個統(tǒng)計調(diào)用商品詳情接口次數(shù)的任務(wù),在梳理了業(yè)務(wù)流程后,快速實現(xiàn)了功能,但測試結(jié)果與預(yù)期差距很大,排查和調(diào)試了一天也沒定位到問題的過程。

大家好,我是冰河~~

“這特么到底是哪里出了問題,我感覺沒啥問題啊,為什么我統(tǒng)計出來的數(shù)據(jù)就是和運維統(tǒng)計出來的數(shù)據(jù)對不上呢?為啥運維統(tǒng)計出來的結(jié)果是正確的呢?我覺得自己的代碼沒毛病???”——此時的小菜已經(jīng)糾結(jié)好久了,幾乎到精神崩潰的邊緣。

一、需求背景

事情是這樣的,小菜是一名剛從學(xué)校畢業(yè)的大學(xué)生,幾乎沒啥工作經(jīng)驗,憑借著在學(xué)校的傳奇經(jīng)歷,順利進(jìn)入了某頭部互聯(lián)網(wǎng)大廠實習(xí),剛來沒幾天,就被分到了一個統(tǒng)計線上調(diào)用商品詳情接口次數(shù)的任務(wù)。說起來不就是統(tǒng)計一個接口的訪問次數(shù)嗎?這個需求小菜很懂,也很明白,沒一會兒就搞定了,可是發(fā)布到測試環(huán)境測試時,卻發(fā)生了各種詭異的問題。

二、接手任務(wù)

時間過的真快,小菜不只不覺來公司實習(xí)快一周了,這幾天基本都是學(xué)習(xí)公司技術(shù)資料和項目業(yè)務(wù),平時自己寫寫demo,還沒有真正寫項目功能。

這不,這天小菜剛到公司,把自己厚重的電腦包往辦公位一放,就看到產(chǎn)品經(jīng)理屁顛屁顛的走過來了,不過不是找小菜的,而是徑直走到了小菜的直屬領(lǐng)導(dǎo)——老王的身邊。

“王工,咱的社區(qū)電商項目不是剛上線嗎?現(xiàn)在運營有個需求,要統(tǒng)計下訪問調(diào)用商品詳情接口的次數(shù)。”

“好,什么時候需要?!?/p>

“下周發(fā)布上線就行。”

“好的。”

老王把調(diào)用商品詳情的接口梳理了下,這個需求確實比較簡單。老王考慮到小菜來公司好幾天了,學(xué)習(xí)了幾天公司的技術(shù)資料和項目業(yè)務(wù)。心里就想著把這個簡單的需求,交給小菜做。

“小菜,你過來下,給你個簡單的任務(wù)”,老王說道。

于是小菜起身來到老王的身邊,老王開始巴拉巴拉的為小菜講解任務(wù)需求和對應(yīng)的接口情況。

雖說小菜沒啥工作經(jīng)驗吧,但是這個需求聽起來確實比較簡單,小菜聽完老王的講解后,說道:“沒問題,我盡快完成”。

于是小菜回到工位,開始認(rèn)真分析代碼,并在本子上畫實現(xiàn)的流程。

三、梳理任務(wù)

雖說小菜沒啥工作經(jīng)驗吧,但是他確實是懂得在搞清楚任務(wù)需求和實現(xiàn)流程之前,不會輕易干代碼的。這也是他剛來公司的時候,老王跟他說的,說起老王,特么確實是個大好人,新人剛來公司的第一天,就會將自己的一些踩坑經(jīng)驗巴拉巴拉的分享給這些新人(我剛參加工作那會兒怎么就遇不見像老王這樣的大好人呢?)。

經(jīng)過認(rèn)真的思考和仔細(xì)的梳理商品詳情接口后,小菜畫出了下面的這幅圖。

圖片圖片

客戶端在訪問系統(tǒng)接口時,首先會經(jīng)過網(wǎng)關(guān),由網(wǎng)關(guān)將訪問系統(tǒng)的流量路由到后端微服務(wù)。在網(wǎng)關(guān)的設(shè)計和實現(xiàn)上,總體上會分為網(wǎng)關(guān)核心組件和網(wǎng)關(guān)控制臺,網(wǎng)關(guān)的一些規(guī)則,比如接口統(tǒng)計、UV統(tǒng)計、PV統(tǒng)計,鑒權(quán)規(guī)則,其他規(guī)則等等,都是在網(wǎng)關(guān)控制臺進(jìn)行配置,并且在網(wǎng)關(guān)控制臺的配置會及時生效。

網(wǎng)關(guān)采用責(zé)任鏈設(shè)計模式實現(xiàn)了一系列的攔截器鏈,比如風(fēng)控攔截器、接口攔截器、鑒權(quán)攔截器、其他攔截器等,每個攔截器專注實現(xiàn)某種特定邏輯的校驗規(guī)則,例如風(fēng)控攔截器會調(diào)用風(fēng)控系統(tǒng)檢測請求是否存在風(fēng)險,接口攔截器主要是統(tǒng)計接口層面的一些請求信息,鑒權(quán)攔截器主要是檢測與鑒權(quán)相關(guān)的邏輯等等。到達(dá)網(wǎng)關(guān)的請求只有通過所有攔截器的校驗后,才會被路由到后端服務(wù)。

梳理完請求的流程和網(wǎng)關(guān)的攔截器邏輯后,小菜拿著本子走到了老王的面前。

“老大,業(yè)務(wù)流程我梳理清楚了,你看看對嗎?”

“好,我看看”。

大神就是大神,只見老王接過小菜的本子后,只是看了一眼,說道:“可以這樣實現(xiàn),沒問題,實現(xiàn)的過程中遇到自己解決不了的問題,可以再問我。”

“好的”。

小菜回到了工位上。

四、實現(xiàn)任務(wù)

要不說這個任務(wù)很簡單呢?小菜梳理清楚業(yè)務(wù)流程,向老王確認(rèn)可以這樣實現(xiàn)后,回到工位,啪啦啪啦就翹起了鍵盤,沒一會就完成了代碼開發(fā)。

“這個功能確實是簡單啊,我也只是花了沒多少時間就完成了,看來公司的項目其實也挺簡單的,哈哈哈”——小菜心里暗暗自喜。于是乎,小菜并沒有在自己本地對寫完的代碼進(jìn)行單元測試,他覺得這個功能太簡單了,沒必要測試。所以,小菜將代碼合并到了測試分支,由 CI/CD 平臺自動構(gòu)建并發(fā)布到了測試環(huán)境。

此時的小菜向測試提交了一份文檔,詳細(xì)的描述了自己這次實現(xiàn)的業(yè)務(wù)功能,交付測試。不一會兒,測試便將測試結(jié)果反饋給了小菜。

小菜拿到結(jié)果一看,瞬間懵逼了:“臥槽,不是吧,期望值10000,實際值7596?差距這么大嗎?不可能吧?這功能很簡單??!就是計數(shù)??!是不是測試搞錯了?(應(yīng)該大部分程序員首先會覺得是別人的問題吧,哈哈哈哈)”。

于是乎,小菜重新打開開發(fā)環(huán)境,一遍遍排查自己寫的代碼,也在自己本地一遍遍調(diào)試著自己的代碼。

過了很久,小菜得出一個結(jié)論:沒毛病啊,結(jié)果是對的??!于是小菜去問測試:”你是怎么測試的呢?“。

“我就是按照正常流程測試的啊,你寫的代碼肯定有問題”。

“沒問題啊,我自己調(diào)試半天了,結(jié)果是對的”。

于是,測試給小菜發(fā)了一份運維從測試服務(wù)器上統(tǒng)計的結(jié)果數(shù)據(jù),敲好與測試的結(jié)果一致。

小菜看到數(shù)據(jù)后,說了句:“好吧,我再看看吧”。

小菜回到工位,又開始了排查代碼和調(diào)試代碼,

就這樣,小菜從上午一直排查、調(diào)試到快下班了,得出的結(jié)論是:沒毛病啊,哪里除了問題呢?

此時的小菜已經(jīng)失去了剛做完這個功能時的自豪感,心情也越來越煩躁?!暗降啄睦镉袉栴}???我看代碼沒毛病??!怎么就不對呢?”

五、求助老王

實在是沒招了,小菜起身走到老王身邊:“老大,上午寫的那個功能,發(fā)布到測試環(huán)境,測試說我統(tǒng)計的結(jié)果數(shù)據(jù)不對,運維那邊從服務(wù)器上統(tǒng)計的結(jié)果是正確的,我排查了很久都沒發(fā)現(xiàn)問題。”

“是嗎?我看看你寫的代碼?!?/p>

于是老王將測試分支的代碼拉取到本地,找到小菜的提交記錄,僅僅看了一眼代碼,就發(fā)現(xiàn)了問題所在。

原來在小菜寫的代碼里定義了一個接口訪問計數(shù)器。

源碼詳見:concurrent-design-patterns-immutable工程下的io.binghe.concurrent.design.wrong.WrongCounter。

public class WrongCounter {

    private int visitCount;

    public void accessVisit(){
        visitCount++;
    }

    public int getVisitCount() {
        return visitCount;
    }
}

這個類中定義了一個int類型的成員變量visitCount,用來統(tǒng)計接口的訪問次數(shù),每次訪問接口時,在網(wǎng)關(guān)的接口攔截器里都會調(diào)用一次accessVisit()方法,將visitCount的值加1,這樣不斷累計接口的訪問次數(shù)。表面上看起來邏輯是沒毛病的。

老王對小菜說:“這個類實現(xiàn)的有問題,這樣實現(xiàn)根本就不能統(tǒng)計出正確的結(jié)果”。

“不對呀,我排查和調(diào)試半天了,沒問題呀,結(jié)果跟我自己預(yù)想的一樣呀”,小菜確實不知道哪里有問題,也并沒有發(fā)現(xiàn)這個類的不妥之處。

正好此時到了下班的點,老王今天還要早點回去接孩子放學(xué),于是就對小菜說:“這樣吧,你先回去想想,查查資料看看哪里有問題,我今天要早點回去接孩子放學(xué),明天到公司了,我給你講講哪里有問題”。

“好的”,小菜回答到。

就這樣,看起來一個很簡單的問題,小菜前前后后花了一天的時間,也沒搞定,心里確實有點郁悶:“明明是很簡單的功能啊,這特么到底是哪里不對呢?”。

他又回到了座位上。。。

六、本章總結(jié)

本章,主要以場景故事線的方式講述了小菜來公司幾天后,接到第一個統(tǒng)計訪問商品詳情接口的項目任務(wù),本以為很簡單的功能,三下五除二做完,提交測試環(huán)境后,被測試打回,反復(fù)排查和調(diào)試代碼,也沒發(fā)現(xiàn)問題的過程。此時的小菜心里有點郁悶,明明很簡單的功能,這特么到底是哪里不對?

好在明天到公司了,老王會給小菜講清楚到底是哪里的問題(再次感嘆:老王是真特么的好?。。?/p>

最后,可以在評論區(qū)寫下你學(xué)完本章節(jié)的收獲,祝大家都能學(xué)有所成,我們一起搞定高并發(fā)設(shè)計模式。

責(zé)任編輯:武曉燕 來源: 冰河技術(shù)
相關(guān)推薦

2018-02-24 23:19:31

iOSbug蘋果

2024-02-07 12:35:00

React并發(fā)模式concurrent

2021-01-11 05:37:54

倉儲模式接口

2015-08-13 09:34:31

公有云私有云云服務(wù)

2021-08-10 10:08:52

NAS網(wǎng)絡(luò)附加存儲存儲

2021-12-20 08:03:49

AI項目機器學(xué)習(xí)

2018-12-09 16:52:01

無線充電無線

2015-04-21 09:20:40

SwfitObject—C

2022-08-08 08:00:00

人工智能機器學(xué)習(xí)計算機應(yīng)用

2024-02-22 08:00:00

SoraOpenAI

2022-05-24 17:00:41

區(qū)塊鏈IT比特幣

2011-09-05 10:30:51

重構(gòu)代碼庫業(yè)務(wù)模型

2017-08-09 08:43:02

公有云趨勢聲勢

2018-09-26 14:17:00

編程語言JavaPython

2013-05-29 10:17:56

Hadoop分布式文件系統(tǒng)

2025-03-28 01:33:00

2018-10-09 15:26:19

JavaPython語言

2020-06-02 10:38:15

IDEiOSLinux

2012-02-13 15:50:59

2024-03-28 13:13:00

Htmx前端開發(fā)框架
點贊
收藏

51CTO技術(shù)棧公眾號