Asyncdb(一):寫一個純函數式的Mysql異步驅動

本文由 GodPan 發表在 ScalaCool 團隊博客。java

以前的 Akka系列博客 接下去可能並不會常常更新了,可是後續看到一些好的點或者你們對哪些仍是比較感興趣還會繼續寫幾篇,這裏先跟你們說明一下。mysql

背景

寫一個純函數式的Mysql異步驅動這個構思是公司的一個大佬提的,這將會是一個開源項目,我也頗有幸可以參與其中,嘗試寫一個本身真正意義上的開源項目,其實不少人會有疑惑,爲何咱們要作一個數據庫驅動,就目前JVM生態上,已經有了比較成熟的產品,咱們還能作出一個怎樣的數據庫驅動呢?git

首先咱們明確了一點,毫不作重複造輪子的事,作這個項目必定要有意義,即便將來可能實用性兼容性等方面不是很擅長,咱們也要表達出新的設計理念,能給數據庫驅動注入一股新的活力。github

咱們在肯定這個項目的時候,也對目前JVM生態中的數據庫驅動進行了必定的總結,僅供參考:sql

項目 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)

最後也但願你們能參與其中,幫助咱們不斷的完善它,共同成長!

相關文章
相關標籤/搜索