關於這周工作中遇到的關於快取問題的記錄

2022-01-18 16:51:14 字數 1813 閱讀 1177

序:本週在工作中遇到了一些麻煩,解決過程比較曲折和辛苦,特此記錄,留作經驗供以後參考

發現問題:周一上班的時候,運營打**來說,我們上個月做的乙個活動感覺資料不對,商家過來投訴了。結果我資料庫一查,資料還真有問題!這次的活動採用的是頁面上使用快取系統顯示活動數值(總金額),同時在後台記錄詳細的每條活動資料的辦法。每次使用者發生業務行為的時候都會在後台的快取的總金額上增加,同時記錄這次行為發生的金額數。結果我周一把資料庫的記錄加一起來一算,發現和頁面上快取的總金額竟然差了將近一半!

解決的過程:

1.由於資料庫記錄了每次業務行為的具體資料,而且比快取的總金額要多。我第一時間想到的就是快取系統**出錯了。於是我先去伺服器上找日誌,可惜的是活動時間過去太久,伺服器上的日誌已經沒有當時的記錄了(鬱悶!)。於是我只能靠自己來找出當時的bug了。

3.在接下來的一天裡,我詳細檢查了各個地方,進行了各種假設,均為能測出這個資料不一致的bug。而且要命的是,我在伺服器上模擬當時的場景也沒有出現這個bug。於是我想到,這個bug可能是那種只有在特定時間或著條件下才會出現的狀況。一般像這種情況的問題最難處置了,因為可能出問題的地方可能已經消失了,不知道什麼時候又會出現。第二天,我正向運營主管反應這個情況打算放棄的時候,他告訴了我乙個重要的線索!他說在活動結束前的時候,他發現活動的總金額有過突然減少的情況,這個情況是出乎我意料的。因為之前的一直以為是快取系統**出問題,導致增加的計數器沒起效果。但是他說總金額有突然變少過,我寫的業務**中根本沒有減少金額的邏輯,也就不可能存在金額減少的情況。於是乎,我把偵查重點又轉移到了快取系統本身上去。因為既然我寫的**根本不可能導致總金額的減少,那就一定是快取系統本身出了什麼問題,才會出現這種金額減少的狀況。

4.接來下,我與快取系統的技術支援**裡確認。詢問了到底什麼情況下,快取系統會有金額減少的狀況發生。在給他展示了我的關鍵性**之後,他告訴我,如果我存在快取裡的數值「丟失」的話,因為我在**裡沒有做「防災」處理,數值可能是會重新歸零的。快取數值的「丟失」!這是我在之前沒有考慮過的情況,因為我之前詢問過開發的前輩,他們說這套快取系統十分的穩定,因此我就大膽的直接使用它進行了業務數值的展現。而且從快取系統的監控裡,我也找不到類似於快取溢位的情況。後來這個快取部門的技術支援告訴我,由於我使用的是一塊公用的快取伺服器,即使我本身分配的快取空間還很多,但是如果其它使用者此時有很大的快取進來的話,是有可能把我駐留在記憶體裡的數值給「丟失」的。

5.到這裡,我基本上就想通了。在我上個月活動的那幾天裡,由於快取系統其它使用者出現的某些大負載量的狀況,把我保留在快取系統裡的業務資料(總金額)給弄「丟失」了。而我由於天真和大意,沒有考慮到快取系統數值丟失的狀況,只是一味的往上加一,即使在快取系統裡的數值「丟失」歸零之後。於是就出現了數值突然下降,最終和實際數值不一致的情況。找到了問題的原因,解決辦法也很容易想到。就是在這個業務場景下,考慮到快取可能「丟失」的情況,在每次給快取加一的時候,先判斷下快取是否存在,如果不存在就去資料庫裡取當前記錄的總值。

經驗總結:

找bug往往是程式設計師最痛苦的事情之一,而像我這次碰到的這種在某些情況下才會發生的bug,就更是難以被發現和處理。這時往往就得像偵探辦案似的,收集各種線索,進行各種假設。模擬業務場景,往往是程式設計師找出bug,最常使用的手段,但當這次這種無法重現的場景出現的時候,就只能靠「線索」了。「線索」是指那些有用的資訊,比如運營人員反映的數值突然下降過的事,比如日誌和資料記錄。這些平時看起來不重要的事物,在這時都有可能會變成有用的「線索」。所以平時儲存日誌和備份資料,還有監控記錄,這些東西在分布式,大資料的系統下就變得很重要了。

另外,還有最重要的一點,就是對找「bug'這件事本身的毅力也很重要,因為在找」bug'的過程中,可能會四處碰壁,這時如果放棄了,那這個bug就永遠淹沒成為過去了。但是如果你堅持下去,把他找出來,那你就能優化自己的**和系統,對於自身也是技術的增長和經驗的積累。

工作中遇到的

今天,在工作中,發現乙個問題,簡要描述 用perl寫的cgi程式獲取表單元素的值,用獲得的值拼接sql語句,假如有個表單元素這樣寫 其中 type id 由perl寫成的同乙個cgi程式執行時寫入。另設乙個表單元素,供使用者輸入值使用 在cgi中獲得表單元素的值 my type id cgi par...

工作中遇到的問題

1.環境oracle9 vs2008 問題 aspnet提示 無法載入 dll oramts.dll 找不到指定的模組。異常來自 hresult 0x8007007e 翻來覆去折騰了好久最後終於解決方法是 執行oracle安裝檔案增加oracle windows inte ces 模組功能。糾結啊!...

工作中遇到的問題

問題背景 第二天領導要去給客戶演示專案,讓我在演示電腦上部署我們的專案。由於我們的專案的資料庫使用的是oracle 10g,但是我從來沒有進行過導資料庫和還原資料庫的操作,第一次操作都是找度娘,而且還是很迷茫。剛開始我一直想辦法在我的plsql上把資料庫匯出來,但是一直摸不到竅門,而且我們的資料庫較...