工作記錄(20190715)

輸入文章標題的時候才發現距離上次工作總結已經過去近半年,期間老婆懷孕,自己又從SF離職到阿里接觸全新的業務,其間種種,一言難盡。感慨下人一忙就發胖,中間少不了老媽優秀廚藝的助攻,好在結果不錯,這段時間自己也適應了新的生活和工作節奏,博客寫起來,健身搞起來。感慨完畢,表一下最近我又收穫了哪些坑。

1.NPE,最近拜讀《重構》一書,收益匪淺,其間學習到了很多有用的重構手法,比如臨時參數的處理和抽象層次的提取。某次重構過程中,將現有的邏輯抽象向上提取了一層,由於代碼缺陷在某些業務場景下造成NPE,所以說紙上得來終覺淺,絕知此事要躬行。

2.關於fastJson版本升級踩坑,某些業務場景下需要對歷史請求數據做對比,爲了偷懶,原本的設計是將對象json序列化後利用String的equals方法,並不是核心業務,前期這麼做無可厚非,但是將fastJson版本1.2.25變更爲1.1.37(安全版本)後對比數據一直存在問題,檢查日誌發現,兩個版本對浮點數精度的默認值不一樣,另外字段的排序順序也有不同。

3.同事踩坑SimpleDateFormat併發環境下線程安全問題,1.8及以上版本使用DateTimeFormat類,1.8以下版本使用ThreadLocal封裝解決。

4.時間函數,最近業務中使用到了時區轉換問題,Date的話需要使用時間Format來格式化,較爲麻煩;直接利用時區寫死加減法也是不可取的;JDK1.8及以上提供了LocalDateTime類解決相關問題。

5.關於慢SQL的治理,一般小系統的業務瓶頸都在慢SQL上,根據二八原則,定期整理慢SQL的Top10並解決,能有效提升系統效率。

6.關於SQL優化,個人經驗也不是很豐富,幾點建議:不要吝嗇索引;限制索引長度;檢查條件是否真的落在聚合索引上;如無必要,不要建立外鍵;字段適當冗餘;不應當使用isNull來做條件判定。

7.深度分頁,概念就不贅述了,簡單來講你使用mysql的分頁limit 100000, 15其效率和limit 10, 15肯定是不可同日而語的。所以需要一定手段來避免深度分頁,一般手法是將limit語句改造成條件語句where from<=x AND x<=to。這裏你就可以看出單表下有一個id自增字段是多麼重要了。多表關聯處理方法類似,先查找範圍,將範圍轉化爲條件語句。這裏注意,用範圍條件語句一是增加了程序複雜度,二是如果你的範圍字段不連續可能會造成分頁不均勻。

8.還是關於數據庫,朋友的疑惑在於拆分微服務後,數據庫也跟着拆分,之前顯示功能中的關聯查詢怎麼辦。我的疑問在於既然要拆分,說明系統關聯性不大,爲什麼還要保留那個關聯查詢。解決方案:評估關聯性後重新拆分領域;如果真的是基礎數據,那麼相關係統內建立從表冗餘;另有朋友說數據庫視圖可以解決,這個我沒有嘗試過。

9.推薦下阿里代碼掃描插件,IDEA的Plugins欄搜索alibaba出現的第一個插件就是,除了有點囉嗦,使用還是很不錯的。

10.logback踩坑,logback日誌框架據說效率要比log4j系列要高,併發性要好,真實性請看評測文。logback是有缺省配置的,也說是說你的配置路徑不對不影響日誌打印,只不過和你想要的效果肯定有區別。

11.記一次任務重構,背景原任務會將數據庫數據取出計算放到Redis緩存供業務使用,原任務爲單機單線程實現,目前的任務量執行一次需要20+小時,且其設計不具有拓展性。改造思路,將單機改造爲多機,將單線程改造爲多線程。主要涉及到的點有三個任務拆分、分發和執行。拆分可以參考上面的深度分頁,主要是將整體任務分塊,讓多臺機器執行不用併發問題且負載均衡;分發不贅述,可以藉助消息中間件或者數據庫的能力;執行,主要是子任務包裝成多線程任務執行。重構完後的任務五臺機器情況下執行任務需半小時。

12.關於機器負載,接上面重構任務第一次重構完五臺機器十分鐘可以跑完全量數據,子任務是在線程池中進行,由於使用系統自定義線程池,沒有對線程數量做限制,導致cpu負載90以上,後對線程數量做了限制,保證任務可以平滑執行。這裏可以深入學習下線程池的構造參數。

13.mybaitis的映射文件中屬性jdbcType可以有效防止null值的問題。

14.關於網絡傳輸對象VO的建立是否必要,仁者見仁,智者見智。這裏舉一個必要的例子,最近接受一接口聯調,由於接口內容改變,所以改變了數據庫實例DO類的結構,修改後直接上線。後來得知該系統後面還有多個系統數據交互遂心涼,查看代碼後才心安,其中有convert邏輯,DO->VO->json序列化後->其他系統,幸虧有這層邏輯,否則下游系統將會統統報異常。當然這裏只是舉例DO到VO之間,類比內存對象的網絡傳輸。

15.最近學習了下跳錶,跳錶目的是解決順序鏈表只能順序查找無法二分查找的問題,而且避免樹形數據結構的複雜實現,於是空間換時間,增加維度關聯跨越節點之間的聯繫,其設計充分利用了計算機的隨機之美。跳錶實現可以參考下JDK1.8的ConcurrentSkipListMap類,其關於維度抽象類的設計也是非常值得稱讚得。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章