1. 程式人生 > >專案也可以學習到很多東西

專案也可以學習到很多東西

今天分享關於最近做的一個小專案學習一些感悟。

1.小專案也能學習到非常多的知識

最近做的是一個數據整理的一個專案,後臺系統需要一些統計的資料,如果從原有的系統中查詢,會大大影響到其他端的效能,而且相對於手機端去直接使用者,後臺系統面對的是公司人員和運營人員,使用者量少,但是查詢的資料確不少,需要做大量的計算,而這大量的計算就耗掉伺服器的效能。為了保證線上手機和前端的效能,資料庫做了優化工作,建立的索引也是根據使用者來建立。後臺系統搜尋的條件特別多,沒有建立的索引的情況下,在大量的資料中查詢資料,還包括大量的計算,這就造成效能的影響,那麼就需要哪空間換時間,並且後臺系統要求的實時性並不高,那麼就可以將關心的資料抽取出來,放到新的資料庫中,然後在新的資料庫中進行聚合,得到後臺系統需要的資料,這裡可以看關於資料倉庫的概念。那麼我做的這個專案就是將資料從原資料庫中抽取資料到新資料庫中,任務很簡單。

但是,這個小專案卻讓我學習到很多知識:

1.資料庫格式的問題,開發人員建立的資料庫的欄位都不做統一,因為公司用了兩種資料庫,mysql和mongodb,從這兩個資料庫中抽取資料,由於我使用的mysql當資料儲存,在建立表字段時,就遇到特別多的麻煩,欄位長度不同一,很多資料都沒有做強制性規範,mysql和mongodb資料不同一,不過這不統一也正常,但是程式中又有了規範,如果按照程式中做,但是資料庫中有大量不規範的資料欄位。

2.做好資料容錯處理,很多資料時增量抽取,即抽取前一天的資料,但是突然發現前兩天的資料有一點問題,那麼該如何做,需要在程式中啟動另一個監聽執行緒,該監聽執行緒是每十分鐘會讀取資料庫中的一個欄位,該欄位是否為true,為true則將這幾天的資料刪除,重新抽取。

3.因為跑的資料有先後順序,例如需要先抽取使用者的資訊,然後對使用者資訊進行統計,如果使用者的資訊出現錯誤,那麼後續的統計都會有問題。這裡我設計了一個任務處理的小框架。在這個其中需要做到任務的順序可配置,前一個任務沒執行完,後續任務不能執行,一個佇列中的任務可並行執行,不同優先順序的任務序列執行。在實現這個邏輯,學習到了java中佇列,樹形結構,學習了多執行緒的知識,為了程式設計優美,學習了單例模式,觀察者模式(EventBus),為了能夠極大簡化程式碼,使用註解,學習guava包,common-lang包中類,並且在該專案中添加了異常後傳送郵件功能。

這是這個 很小的專案,我在其中學習很了特別多的知識。很多時候,在抱怨每天都在做增刪改查的工作,感覺每天都做的是體力活,完全不費腦力的工作,其實不然,想要將工作做好,需要花費特別多的經歷。寫介面做的就是增刪改查的工作,但是其中的能夠操作的空間極大,使用SpringBoot做專案,是否在專案中添加了攔截工作,對請求過來做一些基礎工作如日誌列印,對異常是否有做統一的處理工作,後續的是否有做單元測試,對於介面是否有做壓測,要將一個功能或者是一個專案做好,是需要非常多的精力的,所以小專案,如果我們肯花心思去做,發現會有特別多的事情要做,而且在這個小專案中可以學習到非常多的東西。

2.敢於實踐,將想法都化成程式碼

將自己思想都化作程式碼,但是能夠做到完全將思想化作程式碼是非常困難的。

很多時候,我們看別人分享,我們也記住了其中如何操作的,例如redis作為快取,遇到快取雪崩,快取穿透等問題都能夠說出個一二三來,但很少去親手去實踐。遇到這樣的場景真的很少,比如我,開發了兩年,公司的資料都很少,併發也不高,一個小的redis的叢集,完全支援了線上訪問,也不會遇到快取穿透導致的查詢速度慢的情況。如果沒有真正遇到,動手解決過該問題,並不能很好的去理解該問題是什麼一個情況,即使別人分享的很透徹,那也是他真正去解決過,形成了自己的經驗。而我們看了,也是隻住了有這麼一個問題。而看到該問題,需要去將問題重現,並按照他人分享的方式去解決,這樣才能是自己真正學到收了。

業務上沒有碰到這樣的問題,那該怎麼辦呢,那麼就去模擬,自己東西寫程式,然後利用工具模擬大量的請求,實現高併發的情況,觀察在高併發的情況下,redis和資料庫的情況,然後在根據該情況解決該問題,最後再來驗證該問題。當自己做完這些的時候,才能真正的說自己做過在高併發的情況下,解決reidis快取的一些問題。

再比如分庫分表,網上有非常多的文章來介紹其思路。但是線上資料在並不大的情況下是不需要分庫分表的,那麼僅僅是看了文章,並沒有深入的去了解,一個表面映像,如果是到了下一個公司,突然問分庫分表的問題,雖然能夠簡單的說一下思路,但是真的講操作的時候,很可能就錯誤百出。並且當已經是線上程式了,需要做分庫分表工作時,需要該如何處理呢,線上程式停下來維護,將資料搬移到新的資料庫中?是否有更好的方式呢,是否可以進行雙寫的操作,即資料的插入不僅寫入舊資料庫中,也寫入分庫分表中,然後將資料的更新刪除操作傳送到訊息中介軟體中,當舊資料庫中的資料都搬移到資料庫中,然後將程式的資料庫切換成分庫分表資料庫,消費訊息中介軟體的訊息,最後寫一個程式進行資料的比對。這一系列的操作過程,只有在實際操作中能夠得到檢驗,也只有在實踐中才能將別人的知識化成自己的知識。

總結:程式設計是一個需要花精力做的事情,不要抱怨每天干的僅僅是增刪改查的工作,小的專案也可以變成一個內容很豐富的專案,在小專案中也可以學習到非常多的知識。