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