成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

我最近犯了5個(gè)極愚蠢的錯(cuò)誤

譯文
開(kāi)發(fā) 后端
當(dāng)然,并非下文提供的每一個(gè)解決方案都完全是由我編寫(xiě)的——其中一些是我們?cè)诿艚蓍_(kāi)發(fā)中結(jié)對(duì)編程時(shí)所產(chǎn)生的,而一切都通過(guò)一個(gè)嚴(yán)格的代碼審查過(guò)程——也正是這一點(diǎn)使得問(wèn)題更加可笑。

【51CTO.com快譯】我們大家都時(shí)不時(shí)地犯錯(cuò)誤……而且,有時(shí)我們會(huì)一次犯很多錯(cuò)誤!Grzegorz Ziemonski以一種令人愉快的方式和坦誠(chéng)的態(tài)度與我們一起回顧了他在一次關(guān)鍵性Java應(yīng)用程序發(fā)行調(diào)試過(guò)程中一路走來(lái)所犯的錯(cuò)誤。

來(lái)自于DZone團(tuán)隊(duì)的Michael Tharrington最近向我建議,我應(yīng)該寫(xiě)一寫(xiě)作為一個(gè)開(kāi)發(fā)者我所犯過(guò)的一些錯(cuò)誤和從中取得的教訓(xùn)。好吧,現(xiàn)在做這件事實(shí)在是最恰當(dāng)不過(guò)——我的團(tuán)隊(duì)剛剛上線一款關(guān)鍵的應(yīng)用程序,而一切可能出錯(cuò)的地方都出現(xiàn)錯(cuò)誤了!當(dāng)然,并非下文提供的每一個(gè)解決方案都完全是由我編寫(xiě)的——其中一些是我們?cè)诿艚蓍_(kāi)發(fā)中結(jié)對(duì)編程時(shí)所產(chǎn)生的,而一切都通過(guò)一個(gè)嚴(yán)格的代碼審查過(guò)程——也正是這一點(diǎn)使得問(wèn)題更加可笑。

問(wèn)題產(chǎn)生的背景

[[173689]]

我們正在開(kāi)發(fā)一款簡(jiǎn)單的Web應(yīng)用程序,此程序能夠暴露一個(gè)REST API以便與一個(gè)外部供應(yīng)者程序進(jìn)行通信并能夠把一些結(jié)果***地存儲(chǔ)起來(lái);這樣的話,我們就不需要做太多的調(diào)用,因?yàn)槲覀儾坏貌粸槊恳淮蜛PI調(diào)用付費(fèi)。該應(yīng)用程序主要依賴于Spring Boot這個(gè)Web框架及數(shù)據(jù)功能。該應(yīng)用程序的兩個(gè)實(shí)例將部署在公司的支持負(fù)載平衡器的服務(wù)器上。

  • 錯(cuò)誤1—進(jìn)程并發(fā)錯(cuò)誤

對(duì)外部提供者程序的調(diào)用需要花費(fèi)很長(zhǎng)的時(shí)間;自然,我們的客戶端應(yīng)用程序都不愿意等待這種類型的調(diào)用。正因?yàn)槿绱耍覀兌纪馔ㄟ^(guò)后臺(tái)處理方式加以改進(jìn)——***次調(diào)用時(shí),我們返回一條消息“DONT_KNOW_YET_COME_BACK_LATER...”。下次調(diào)用時(shí),我們返回一個(gè)持久性的結(jié)果。于是,自然就出現(xiàn)這樣一個(gè)問(wèn)題:如果我們?cè)谧銐蚨痰臅r(shí)間內(nèi)進(jìn)行兩次相同的調(diào)用,那么會(huì)發(fā)生什么情況呢?靈感突然出現(xiàn):我們必須以某種方式保護(hù)自己避免使用相同的數(shù)據(jù)兩次調(diào)用外部提供者程序。下面給出我的初步的編程方案:

  1. private Set<Long> currentlyProcessedIds = ConcurrentHashMap.newKeySet(); 
  2.  
  3. // further down in the code: 
  4.  
  5. if (currentlyProcessedIds.add(id) {   
  6.  
  7.     doTheJob(id); 
  8.  
  9.     currentlyProcessedIds.remove(id); 
  10.  

你能找到這段代碼有什么毛病嗎?如果你馬上發(fā)現(xiàn)不了我的愚蠢錯(cuò)誤,慢慢來(lái)就是。

當(dāng)然,如果doTheJob部分拋出異常的話,整段程序會(huì)中斷!這是典型的進(jìn)程并發(fā)錯(cuò)誤,導(dǎo)致明顯的內(nèi)存破壞!遺憾的是,四個(gè)人盯著這段代碼卻沒(méi)人注意到,其實(shí)我們可以阻止id再次被正確處理。下面是更正后的代碼的正確版本:

  1. if (currentlyProcessedIds.add(id) {   
  2.  
  3.     try { 
  4.  
  5.         doTheJob(id); 
  6.  
  7.     } finally { 
  8.  
  9.         currentlyProcessedIds.remove(id); 
  10.  
  11.     } 
  12.  
  • 錯(cuò)誤2—負(fù)載已平衡,但問(wèn)題仍存在

如果你足夠聰明,你可能已經(jīng)注意到哪里出現(xiàn)錯(cuò)誤了——上面的這段代碼仍然存在問(wèn)題!我們?cè)谝慌_(tái)負(fù)載平衡器上部署了應(yīng)用程序的兩個(gè)獨(dú)立的實(shí)例。這意味著,問(wèn)題并不只是并發(fā)方面的,還與分布式有關(guān)系!

目前,我們還沒(méi)有實(shí)現(xiàn)一個(gè)分布式的解決方案,但我們明顯需要實(shí)現(xiàn)兩個(gè)應(yīng)用程序?qū)嵗g對(duì)當(dāng)前處理過(guò)的數(shù)據(jù)集進(jìn)行同步。

  • 錯(cuò)誤3—喝早咖啡意外發(fā)現(xiàn)性能問(wèn)題
  • [[173690]]

后臺(tái)處理的想法來(lái)自于我觀察舊式解決方案的結(jié)果。這種老式解決方案嚴(yán)重依賴于數(shù)據(jù)庫(kù)的性能,但即使在最糟糕的情況下,也比外部調(diào)用要快。一開(kāi)始,我們建議負(fù)責(zé)客戶端應(yīng)用程序的程序員可以允許***次(長(zhǎng))調(diào)用超時(shí),然后稍后再試。但是,實(shí)際運(yùn)行情況表明:當(dāng)整個(gè)系統(tǒng)負(fù)載很重時(shí)這種方案還很不理想。我負(fù)責(zé)測(cè)算我們的應(yīng)用程序響應(yīng)一個(gè)時(shí)間幀需要多長(zhǎng)時(shí)間。我找到舊解決方案中所有的數(shù)據(jù)庫(kù)查詢并一個(gè)接一個(gè)地針對(duì)我們的數(shù)據(jù)庫(kù)進(jìn)行測(cè)試。我收集這些結(jié)果,作出一些計(jì)算,***制作成一個(gè)不錯(cuò)的表并把它放在我們公司的Wiki上。

到底哪里出錯(cuò)了?好,我一邊喝著早餐咖啡一邊手工運(yùn)行查詢,結(jié)果發(fā)現(xiàn)這次的系統(tǒng)性能大大不同于在重負(fù)荷下運(yùn)行所有系統(tǒng)的性能。這意味著,我的計(jì)算以前過(guò)于樂(lè)觀,而在產(chǎn)品上線之后我們看到的***件事成為客戶端應(yīng)用程序超時(shí)的“一面墻壁”。

  • 錯(cuò)誤4—使用過(guò)少的測(cè)試數(shù)據(jù)

現(xiàn)在來(lái)看,系統(tǒng)負(fù)載只是我們高估了系統(tǒng)性能表現(xiàn)的原因之一。第二個(gè)原因更令人尷尬!我們的應(yīng)用程序和客戶端程序之間的所有測(cè)試都基于一組相當(dāng)有限的數(shù)據(jù)集——大約1000條記錄。結(jié)果看起來(lái)非常成功,因?yàn)闇y(cè)試過(guò)程中沒(méi)有出現(xiàn)過(guò)一點(diǎn)警告標(biāo)志。

其實(shí),我們忽略了一個(gè)小小的細(xì)節(jié),那就是:系統(tǒng)上線前,我們使用從舊解決方案中遷移的數(shù)據(jù)填充數(shù)據(jù)庫(kù)——這些數(shù)據(jù)大約有100萬(wàn)條記錄!數(shù)據(jù)集比原來(lái)增加了三個(gè)數(shù)量級(jí)!我們這才發(fā)現(xiàn)自己忘記了設(shè)置關(guān)鍵的數(shù)據(jù)庫(kù)索引——這是一款關(guān)鍵應(yīng)用程序上線前你必須且心甘情愿要做的事情!

  • 錯(cuò)誤5—度量并非統(tǒng)計(jì)結(jié)果

商界人士要求我們準(zhǔn)備一份有關(guān)我們向外部提供者程序發(fā)出請(qǐng)求的報(bào)告。因?yàn)槲覀冏隽舜罅康恼{(diào)用,而且這些調(diào)用都很昂貴,所以我們想給他們提供一種方式來(lái)計(jì)算預(yù)期成本和驗(yàn)證我們從供應(yīng)商那里得到的發(fā)票。當(dāng)然,業(yè)務(wù)人員不懂SQL,所以他們要求通過(guò)電子郵件發(fā)送給他們一個(gè)Excel報(bào)表。哦,我的娘……要求我們生成Excel文件并發(fā)送電子郵件?如今都是2016年了。實(shí)在是沒(méi)有辦法!最終,我們還是提供了一個(gè)漂亮的界面來(lái)實(shí)現(xiàn)統(tǒng)計(jì)度量。以后我們還將添加一個(gè)針對(duì)發(fā)出請(qǐng)求次數(shù)的計(jì)數(shù)器!

因?yàn)槲覀冇辛巳缟衔乃龅哪切┳畛醯膯?wèn)題,所以我們發(fā)出一些修補(bǔ)程序并再次發(fā)布應(yīng)用程序。經(jīng)過(guò)重新部署,顯示有計(jì)數(shù)器的儀表板看起來(lái)很不正常。請(qǐng)求的次數(shù)發(fā)生了什么事?情況是:度量數(shù)據(jù)保存在應(yīng)用程序端,并每隔固定的時(shí)間間隔發(fā)送到度量服務(wù)端。這意味著,每次我們重新啟動(dòng)應(yīng)用程序,計(jì)數(shù)器的值都將消失了。簡(jiǎn)單是廢話!

幸運(yùn)的是,我們有一種方法能夠提供有關(guān)請(qǐng)求的正確信息,而沒(méi)有使用儀表板上的漂亮計(jì)數(shù)器,但我們?nèi)匀辉谠噲D實(shí)現(xiàn)一個(gè)真正的計(jì)數(shù)器,以保持業(yè)務(wù)的統(tǒng)計(jì)數(shù)字。

總結(jié)

就在我們的產(chǎn)品最終上線之前,我曾經(jīng)告訴我的同事說(shuō):我有些擔(dān)心,因?yàn)閺捻?xiàng)目開(kāi)始到測(cè)試階段都不曾遇到過(guò)重大的問(wèn)題,一切顯得那么順利,沒(méi)有出現(xiàn)過(guò)重大障礙。事實(shí)證明我是正確的,錯(cuò)誤的東西注定會(huì)發(fā)生!雖然我在這篇文章中提到的錯(cuò)誤現(xiàn)在看起來(lái)都是很明顯的,但是當(dāng)我們趕時(shí)間進(jìn)行開(kāi)發(fā)和測(cè)試時(shí)它們卻不是那么明顯。現(xiàn)在,寫(xiě)出關(guān)于我們的項(xiàng)目開(kāi)發(fā)中的這些羞于啟齒的事是有點(diǎn)兒尷尬;但是,我希望作為讀者的您至少能夠從中獲得一些樂(lè)趣,并且以后不會(huì)再犯和我們同樣的錯(cuò)誤!

 

【51CTO譯稿,合作站點(diǎn)轉(zhuǎn)載請(qǐng)注明原文譯者和出處為51CTO.com】

責(zé)任編輯:陳琳 來(lái)源: 51CTO
相關(guān)推薦

2020-07-01 07:38:38

SQL數(shù)據(jù)庫(kù)程序員

2016-03-17 16:57:39

SaaSSaaS公司指標(biāo)

2009-07-09 09:15:22

2024-04-22 13:54:28

url代碼緩存

2023-04-24 08:11:02

圖片alt語(yǔ)音

2021-09-10 08:00:00

Python機(jī)器學(xué)習(xí)開(kāi)發(fā)

2022-01-24 19:10:31

開(kāi)發(fā)開(kāi)源編程

2022-09-20 10:22:00

CIOIT業(yè)務(wù)管理者

2010-05-24 09:11:13

Facebook隱私政策

2021-05-25 05:28:05

uniCloud前端項(xiàng)目

2022-09-28 08:40:52

CIO工具軟件

2009-07-09 10:26:08

2019-08-21 17:32:47

戴爾

2009-08-19 09:30:14

2022-10-27 19:37:31

LinuxWindows內(nèi)存

2023-07-14 07:05:27

優(yōu)化首席信息官IT

2024-06-03 08:32:54

2014-02-25 10:25:52

單元測(cè)試測(cè)試

2021-08-11 07:53:22

Git rejecthint

2020-10-08 18:12:36

數(shù)據(jù)科學(xué)職位面試數(shù)據(jù)科學(xué)家
點(diǎn)贊
收藏

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

主站蜘蛛池模板: 中文在线观看视频 | 国产精品.xx视频.xxtv | 日本三级网站在线 | 欧美日韩在线观看一区 | 一区二区在线观看av | 欧美1区2区| 国产精品久久久久久久久久久久久 | 2018中文字幕第一页 | 日韩在线免费 | 欧美亚洲成人网 | 国产成人精品一区二区三 | 亚洲一区二区成人 | 国产精品久久久99 | 日日操夜夜操天天操 | 一区二区三区亚洲 | 一级做a| 麻豆精品一区二区三区在线观看 | 亚洲午夜精品在线观看 | 亚洲一区二区三区免费视频 | 日韩成人免费视频 | 日本福利片 | 人人干免费 | 日韩在线小视频 | 午夜在线视频 | 亚洲444kkkk在线观看最新 | 精品免费国产视频 | 精品真实国产乱文在线 | 中文字幕日本一区二区 | 国产精品99久久久久久动医院 | 国产一区二区精华 | 久久久一区二区三区 | 成人av免费看 | 美女天天操 | 国产精品视频导航 | 欧美一级视频在线观看 | 91亚洲精品国偷拍自产在线观看 | 国产免费xxx| 国产区在线免费观看 | a久久| 国产精品视频区 | 国产美女在线观看 |