关于这周工作中遇到的关于缓存问题的记录
序:本周在工作中遇到了一些麻煩,解決過程比較曲折和辛苦,特此記錄,留作經驗供以后參考
?
發現問題:周一上班的時候,運營打電話來說,我們上個月做的一個活動感覺數據不對,商家過來投訴了。結果我數據庫一查,數據還真有問題!這次的活動采用的是頁面上使用緩存系統顯示活動數值(總金額),同時在后臺記錄詳細的每條活動數據的辦法。每次用戶發生業務行為的時候都會在后臺的緩存的總金額上增加,同時記錄這次行為發生的金額數。結果我周一把數據庫的記錄加一起來一算,發現和頁面上緩存的總金額竟然差了將近一半!
?
解決的過程:
1.由于數據庫記錄了每次業務行為的具體數據,而且比緩存的總金額要多。我第一時間想到的就是緩存系統哪里出錯了。于是我先去服務器上找日志,可惜的是活動時間過去太久,服務器上的日志已經沒有當時的記錄了(郁悶!)。于是我只能靠自己來找出當時的BUG了。
2.我想到在上線之前我已經在線下環境和預發環境做過測試,緩存的數據和數據庫的數據是會保持一致的。難道是因為線上的環境有2臺服務器,又或者是在高并發大數據的情況下,才會產生的錯誤,又或者是其中某一臺服務器的緩存服務器發生故障了?(因為數值剛好差了近一半么,如果其中一臺服務器的緩存出錯了,數值就符合了)。于是我修改了代碼,重現了當時的業務場景,結果發現在比較高的并發量的情況下,2臺服務器均未出現緩存服務故障和數據庫不一致的現象。之后我又詢問了其它開發和緩存部門的人,確定了在當時的訪問量下,緩存和服務器應該不會出現瓶頸。于是乎,我的假設失敗了,BUG還是沒找到。
3.在接下來的一天里,我詳細檢查了各個地方,進行了各種假設,均為能測出這個數據不一致的BUG。而且要命的是,我在服務器上模擬當時的場景也沒有出現這個BUG。于是我想到,這個BUG可能是那種只有在特定時間或著條件下才會出現的狀況。一般像這種情況的問題最難處置了,因為可能出問題的地方可能已經消失了,不知道什么時候又會出現。第二天,我正向運營主管反應這個情況打算放棄的時候,他告訴了我一個重要的線索!他說在活動結束前的時候,他發現活動的總金額有過突然減少的情況,這個情況是出乎我意料的。因為之前的一直以為是緩存系統哪里出問題,導致增加的計數器沒起效果。但是他說總金額有突然變少過,我寫的業務代碼中根本沒有減少金額的邏輯,也就不可能存在金額減少的情況。于是乎,我把偵查重點又轉移到了緩存系統本身上去。因為既然我寫的代碼根本不可能導致總金額的減少,那就一定是緩存系統本身出了什么問題,才會出現這種金額減少的狀況。
4.接來下,我與緩存系統的技術支持電話里確認。詢問了到底什么情況下,緩存系統會有金額減少的狀況發生。在給他展示了我的關鍵性代碼之后,他告訴我,如果我存在緩存里的數值“丟失”的話,因為我在代碼里沒有做“防災”處理,數值可能是會重新歸零的。緩存數值的“丟失”!這是我在之前沒有考慮過的情況,因為我之前詢問過開發的前輩,他們說這套緩存系統十分的穩定,因此我就大膽的直接使用它進行了業務數值的展現。而且從緩存系統的監控里,我也找不到類似于緩存溢出的情況。后來這個緩存部門的技術支持告訴我,由于我使用的是一塊公用的緩存服務器,即使我本身分配的緩存空間還很多,但是如果其它用戶此時有很大的緩存進來的話,是有可能把我駐留在內存里的數值給“丟失”的。
5.到這里,我基本上就想通了。在我上個月活動的那幾天里,由于緩存系統其它用戶出現的某些大負載量的狀況,把我保留在緩存系統里的業務數據(總金額)給弄“丟失”了。而我由于天真和大意,沒有考慮到緩存系統數值丟失的狀況,只是一味的往上加一,即使在緩存系統里的數值“丟失”歸零之后。于是就出現了數值突然下降,最終和實際數值不一致的情況。找到了問題的原因,解決辦法也很容易想到。就是在這個業務場景下,考慮到緩存可能“丟失”的情況,在每次給緩存加一的時候,先判斷下緩存是否存在,如果不存在就去數據庫里取當前記錄的總值。
?
經驗總結:
找BUG往往是程序員最痛苦的事情之一,而像我這次碰到的這種在某些情況下才會發生的BUG,就更是難以被發現和處理。這時往往就得像偵探辦案似的,收集各種線索,進行各種假設。模擬業務場景,往往是程序員找出BUG,最常使用的手段,但當這次這種無法重現的場景出現的時候,就只能靠“線索”了。“線索”是指那些有用的信息,比如運營人員反映的數值突然下降過的事,比如日志和數據記錄。這些平時看起來不重要的事物,在這時都有可能會變成有用的“線索”。所以平時保存日志和備份數據,還有監控記錄,這些東西在分布式,大數據的系統下就變得很重要了。
另外,還有最重要的一點,就是對找“BUG'這件事本身的毅力也很重要,因為在找”BUG'的過程中,可能會四處碰壁,這時如果放棄了,那這個BUG就永遠淹沒成為過去了。但是如果你堅持下去,把他找出來,那你就能優化自己的代碼和系統,對于自身也是技術的增長和經驗的積累。
轉載于:https://www.cnblogs.com/xujanus/p/3849342.html
總結
以上是生活随笔為你收集整理的关于这周工作中遇到的关于缓存问题的记录的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: UITextField
- 下一篇: 对集合数据进行排序