今天分享關於最近做的一個小項目學習一些感悟。
1.小項目也能學習到非常多的知識
最近做的是一個數據整理的一個項目,后台系統需要一些統計的數據,如果從原有的系統中查詢,會大大影響到其他端的性能,而且相對於手機端去直接用戶,后台系統面對的是公司人員和運營人員,用戶量少,但是查詢的數據確不少,需要做大量的計算,而這大量的計算就耗掉服務器的性能。為了保證線上手機和前端的性能,數據庫做了優化工作,建立的索引也是根據用戶來建立。后台系統搜索的條件特別多,沒有建立的索引的情況下,在大量的數據中查詢數據,還包括大量的計算,這就造成性能的影響,那么就需要哪空間換時間,並且后台系統要求的實時性並不高,那么就可以將關心的數據抽取出來,放到新的數據庫中,然后在新的數據庫中進行聚合,得到后台系統需要的數據,這里可以看關於數據倉庫的概念。那么我做的這個項目就是將數據從原數據庫中抽取數據到新數據庫中,任務很簡單。
但是,這個小項目卻讓我學習到很多知識:
1.數據庫格式的問題,開發人員創建的數據庫的字段都不做統一,因為公司用了兩種數據庫,mysql和mongodb,從這兩個數據庫中抽取數據,由於我使用的mysql當數據存儲,在創建表字段時,就遇到特別多的麻煩,字段長度不同一,很多數據都沒有做強制性規范,mysql和mongodb數據不同一,不過這不統一也正常,但是程序中又有了規范,如果按照程序中做,但是數據庫中有大量不規范的數據字段。
2.做好數據容錯處理,很多數據時增量抽取,即抽取前一天的數據,但是突然發現前兩天的數據有一點問題,那么該如何做,需要在程序中啟動另一個監聽線程,該監聽線程是每十分鍾會讀取數據庫中的一個字段,該字段是否為true,為true則將這幾天的數據刪除,重新抽取。
3.因為跑的數據有先后順序,例如需要先抽取用戶的信息,然后對用戶信息進行統計,如果用戶的信息出現錯誤,那么后續的統計都會有問題。這里我設計了一個任務處理的小框架。在這個其中需要做到任務的順序可配置,前一個任務沒執行完,后續任務不能執行,一個隊列中的任務可並行執行,不同優先級的任務串行執行。在實現這個邏輯,學習到了java中隊列,樹形結構,學習了多線程的知識,為了程序設計優美,學習了單例模式,觀察者模式(EventBus),為了能夠極大簡化代碼,使用注解,學習guava包,common-lang包中類,並且在該項目中添加了異常后發送郵件功能。
這是這個 很小的項目,我在其中學習很了特別多的知識。很多時候,在抱怨每天都在做增刪改查的工作,感覺每天都做的是體力活,完全不費腦力的工作,其實不然,想要將工作做好,需要花費特別多的經歷。寫接口做的就是增刪改查的工作,但是其中的能夠操作的空間極大,使用SpringBoot做項目,是否在項目中添加了攔截工作,對請求過來做一些基礎工作如日志打印,對異常是否有做統一的處理工作,后續的是否有做單元測試,對於接口是否有做壓測,要將一個功能或者是一個項目做好,是需要非常多的精力的,所以小項目,如果我們肯花心思去做,發現會有特別多的事情要做,而且在這個小項目中可以學習到非常多的東西。
2.敢於實踐,將想法都化成代碼
將自己思想都化作代碼,但是能夠做到完全將思想化作代碼是非常困難的。
很多時候,我們看別人分享,我們也記住了其中如何操作的,例如redis作為緩存,遇到緩存雪崩,緩存穿透等問題都能夠說出個一二三來,但很少去親手去實踐。遇到這樣的場景真的很少,比如我,開發了兩年,公司的數據都很少,並發也不高,一個小的redis的集群,完全支持了線上訪問,也不會遇到緩存穿透導致的查詢速度慢的情況。如果沒有真正遇到,動手解決過該問題,並不能很好的去理解該問題是什么一個情況,即使別人分享的很透徹,那也是他真正去解決過,形成了自己的經驗。而我們看了,也是只住了有這么一個問題。而看到該問題,需要去將問題重現,並按照他人分享的方式去解決,這樣才能是自己真正學到收了。
業務上沒有碰到這樣的問題,那該怎么辦呢,那么就去模擬,自己東西寫程序,然后利用工具模擬大量的請求,實現高並發的情況,觀察在高並發的情況下,redis和數據庫的情況,然后在根據該情況解決該問題,最后再來驗證該問題。當自己做完這些的時候,才能真正的說自己做過在高並發的情況下,解決reidis緩存的一些問題。
再比如分庫分表,網上有非常多的文章來介紹其思路。但是線上數據在並不大的情況下是不需要分庫分表的,那么僅僅是看了文章,並沒有深入的去了解,一個表面映像,如果是到了下一個公司,突然問分庫分表的問題,雖然能夠簡單的說一下思路,但是真的講操作的時候,很可能就錯誤百出。並且當已經是線上程序了,需要做分庫分表工作時,需要該如何處理呢,線上程序停下來維護,將數據搬移到新的數據庫中?是否有更好的方式呢,是否可以進行雙寫的操作,即數據的插入不僅寫入舊數據庫中,也寫入分庫分表中,然后將數據的更新刪除操作發送到消息中間件中,當舊數據庫中的數據都搬移到數據庫中,然后將程序的數據庫切換成分庫分表數據庫,消費消息中間件的消息,最后寫一個程序進行數據的比對。這一系列的操作過程,只有在實際操作中能夠得到檢驗,也只有在實踐中才能將別人的知識化成自己的知識。
總結:編程是一個需要花精力做的事情,不要抱怨每天干的僅僅是增刪改查的工作,小的項目也可以變成一個內容很豐富的項目,在小項目中也可以學習到非常多的知識。