本文由 GodPan 發表在 ScalaCool 團隊部落格。
之前的 Akka系列部落格 接下去可能並不會經常更新了,但是後續看到一些好的點或者大家對哪些還是比較感興趣還會繼續寫幾篇,這裡先跟大家說明一下。
背景
寫一個純函式式的Mysql非同步驅動這個構思是公司的一個大佬提的,這將會是一個開源專案,我也很有幸能夠參與其中,嘗試寫一個自己真正意義上的開源專案,其實很多人會有疑惑,為什麼我們要做一個資料庫驅動,就目前JVM生態上,已經有了比較成熟的產品,我們還能做出一個怎樣的資料庫驅動呢?
首先我們明確了一點,絕不做重複造輪子的事,做這個專案一定要有意義,即使未來可能實用性相容性等方面不是很擅長,我們也要表達出新的設計理念,能給資料庫驅動注入一股新的活力。
我們在確定這個專案的時候,也對目前JVM生態中的資料庫驅動進行了一定的總結,僅供參考:
專案 | mysql-async | HikariCP + mysql-connector/j |
---|---|---|
程式設計模型 | 非同步 | 同步 |
網路IO | NIO | BIO |
連結池 | 非同步實現 | 同步實現 |
過載防護 | 通過調節佇列長度實現 | 需要額外實現 (例如指定執行緒池任務佇列長度) |
可伸縮性 | 只需要設定合理連線數(例如幾十個) | 需要測試最佳執行緒數和連結數 |
執行緒數 | 少 | 多 |
具體相關測試及說明可以看我們寫的相關係列文章MySQL 非同步驅動淺析 (一):效能分析。
相信寫過Java工程的同學都應該知道mysql-connector-java,但應該很多人對其的實現和相關架構設計應該不是很瞭解,正如我們上面對其相關功能測試,發現它的某些方面表現並不是很好,比如使用了BIO,請求時需要大量的執行緒等等。
相信你們也注意到了mysql-async,但是應該大多數人都不是很熟悉,它也是一個基於Netty,使用Scala編寫的,完全非同步的資料庫驅動,同時支援PostgreSQL和MySQL,其專案地址postgresql-async。
其實我們公司專案底層用的資料庫驅動也是基於mysql-async的,不過因為實際使用中遇到了一些問題,,具體相關問題分析可以看我們寫的相關係列文章MySQL 非同步驅動淺析 (二):缺點分析。
雖然我們使用的mysql-async內部版本對上述的許多問題都進行了修復,具體資訊可以看我們寫的相關係列文章MySQL 非同步驅動淺析 (三):連線池改進方案,但是整個專案變得混亂,架構設計也不是很完美,所以我們最終決定自己實現一個純函式式的Mysql非同步驅動,我們叫它:asyncdb
目標
那麼我們到底要做一個怎樣的驅動呢?我們提了以下幾個主要方面:
- 1.構建於cats-effect(純函式式的關鍵)
- 2.合理的資料庫包解析框架
- 3.支援簡單的流處理(可選)
- 4.基於Java NIO2,絕不阻塞
- 5.提供對應Java8的介面
總的來說,除了第一點大家可能比較陌生,其他幾點大家都應該能大致瞭解,但是第一點才是我們這個專案最重要的一點,也是用來解決我們之前遇到問題的關鍵,後續我會寫幾篇文章對於這一點進行的相關介紹,如果有興趣的同學可以自己瞭解一下:cats-effect
關注 Asyncdb
如果你對我們的專案也有興趣,歡迎你們star我們的專案,專案地址:asyncdb,我們將會從頭開始,你可以一步一步瞭解我們的架構設計和具體的實現方法,當然你有好的想法或者相關問題,也歡迎給我們提issue。
進階學習
若是你對資料庫驅動非常有興趣,也想探究裡面的奧祕,這裡我提一些相應的建議:
- 1.熟悉瞭解Java NIO,並熟練使用它
- 2.學習MySQL資料庫網路傳輸包協議
- 3.掌握函式式語言中的Monad表示式,理解其的含義和使用場景
- 4.學習Scala相關的函式庫比如:cats,shapeless
- 5.學習IO-Monad(cats-effect)
最後也希望大家能參與其中,幫助我們不斷的完善它,共同成長!