jasync-sql mysql-r2dbc 違い [検索]
— やんく (@yy_yank) February 4, 2021
ということで、R2DBCのMySQLドライバの2つについて書く。
はじめに
R2DBCのMySQLドライバが2つあるけど、どう違うのだろう?
という疑問を発端に、色々と調べてみたので、自分の頭の中の整理も兼ねてブログを書くことにしてみる。
簡単なまとめ
- R2DBCには2つのMySQLドライバ実装があるけど、2つのドライバの開発歴で言うとそんなに差はないよ
- 基本的な動作はどちらのドライバも大丈夫そうだけど、細かな部分で実装依存もあるだろうから使っているうちにコーナーケースを踏むということはあるかもしれないよ
- 2つのドライバのどちらのプロジェクトにも R2DBCのプロジェクトリードっぽい人が絡んでいるから基本的には大丈夫だと思うよ
- どちらを選択するにしてもアプリ開発時にちゃんと検証しておけばきっと安心だよ
- ドライバはMavenやGradleなどのdependency 管理で差し替え可能だよ(アプリケーションコードには、大きく影響しないはず)
目次
- はじめに
- 簡単なまとめ
- 一応R2DBCとは
- R2DBCは2018年に公開
- R2DBCについてのJUGツアーとかもやっている
- 2つのR2DBCのMySQLドライバーとは
- 2つのR2DBCのMySQLドライバーの始まり
- どちらを選ぶか?
- まとめ
一応、R2DBCとは
R2DBCはReactive Relational Database Connectivityの略で、簡単に言ってしまうと、今まで同期的だったDB処理を非同期でやってしまおうというもの。
詳細は https://r2dbc.io/ に託す。
R2DBCは2018年に公開
一応時系列の整理をしたい。R2DBCはコミュニティベースでの開発が続いているっぽいが、Spring Oneにて2018年に仕様が公開された。
It’s official now: R2DBC – Reactive Relational Database Connectivity #SpringOne pic.twitter.com/azPyy2SrjD
— Mark Paluch 👨💻&🎹 (@mp911de) September 26, 2018
2021年2月現在、@mp911de(Mark Paluch)さんがR2DBCの実質リード的な存在のようだ。
GitHub( https://github.com/mp911de )には、
Work on [Spring Data](https://spring.io/projects/spring-data), [R2DBC](https://r2dbc.io/), [Lettuce](https://lettuce.io/), and other projects
と書いてある。
R2DBCについてのJUGツアーとかもやっている
同じ年の、2018年に世界のJUG(Java User Group)を巡るツアーもやっている。
Happy to announce my @R2DBC (Reactive Relational Database Connectivity) Java User Group tour https://t.co/8kk3uCAHnU
— Mark Paluch 👨💻&🎹 (@mp911de) November 5, 2018
2つのR2DBCのMySQLドライバーとは
以下の2つ。
1, https://github.com/jasync-sql/jasync-sql
2. https://github.com/mirromutth/r2dbc-mysql
jasync-sqlはざっくり言うと
READMEにも書いてある通り、元々 mauricio/postgresql-asyncというScala実装のpostgreSQLとMySQLのNettyベースの非同期通信用のDBアクセスライブラリのKotlin移植プロジェクト。 oshai (https://github.com/oshai)さん作。
そこに、後からMySQLのR2DBCドライバ実装が追加された。
一方、r2dbc-mysqlはR2DBCドライバのSPI実装を作ったライブラリ。mirromutthさん作。mirromutthさんはR2DBCのSPIにもcontributeとかしてる人。
※[脱線] jasync-sqlのScala → Kotlin移植、そもそものライブラリの始まりに関して気になる人は、作者本人のブログ記事がある。
https://medium.com/outbrain-engineering/async-database-access-with-mysql-kotlin-and-jasync-sql-dbfdb8e7fd04
https://hackernoon.com/how-i-ported-10k-lines-of-scala-to-kotlin-in-one-week-c645732d3c1
2つのR2DBCのMySQLドライバーの始まり
jasync-sql/r2dbc-mysqlの実装が始まったのとmirromutth/r2dbc-mysqlがはじまったのは2019年の春ごろで、ほぼ同じ時期。
- 2019年3月、R2DBCのリードである mp911deさんが jasync-sqlのohaiさんに「R2DBCのMySQLドライバ実装作ってみないか?」と提案する
https://github.com/jasync-sql/jasync-sql/issues/98- mp911deさん曰く「JDBCとR2DBCというドライバ2つのフロントエンド実装を持つことになるけど、R2DBCはいいぞ!Kotlin Coroutines for Reactive Streamsとの相性良かったりするぞ」
- 「mp911deさんがある程度サポートするならやってみるよ」とohaiさんやる気になる
- 実装の距離が近い方が変に制約が発生しないから良いよという話になり、R2DBCのorgのリポジトリではなく、jasync-sqlリポジトリ内にr2dbc-mysqlという別ライブラリが同梱される方針となる
- 同じく、2019年3月、ohaiさんがmirromutthさんに「jasync-sqlで R2DBCのMySQLドライバ実装作ることになったけど、統合しますか?」と持ちかけるhttps://github.com/mirromutth/r2dbc-mysql/issues/1
- mirromutthさん「現実的な話だと思う。しかし、jasync-sqlと統合せず独立させておこうと思う。jasync-sqlはvert.xとかでも使われそうだし、mysql-connector-jの実装や構造を持たないクリーンリーム実装としておきたい。mysql-connector-jはGPLv2でR2DBC Apache 2.0ライセンスでややこしい」
といった流れで
- JDBCドライバフロントエンドにR2DBCのMySQLドライバフロントエンドを追加したもの(jasync-sql)
- R2DBCのMySQLドライバのクリーンルーム実装(mirromutth/r2dbc-mysql)
の2つが進んでいくこととなったらしい。
どちらを選ぶか?
ここから、完全に独断と偏見を持って書きます。
どちらを選ぶかですが、今のところ有意な差は見つけられていません。
- 2021年2月現在jasync-sqlはver1.16。スター数は1.1k
- contributorは、oshaiさんとmp911deさんとmirromutthさんなど(jasync-sql/r2dbc-mysqlだけに限定した場合)
- jasync-sql/r2dbc-mysqlに関する開発は2019年3月から
- CHANGELOG https://github.com/jasync-sql/jasync-sql/blob/master/CHANGELOG.md
- mirromutth/r2dbc-mysql は0.8.2。スター数は400
- contiributorは、mirromutthさんとmp911deさん
- 開発は2019年3月ごろから
- https://github.com/mirromutth/r2dbc-mysql/blob/main/CHANGELOG.md
どちらのドライバも普通に使ってみたところ、普通に動きますし細かいところではドライバの実装依存もあるかもしれませんがそこまで大きな差はないのではないかと思っています。
個人的にはmirromutthさんの方がR2DBC本体に対してのcontributeなどをしているので、印象は良いですが、あくまで印象の話です。
あと、どちらも面白いのでどちらも応援していきたい!
あと、どちらもmp911deさんが見ているので大丈夫なんじゃない?(雑)という気持ちになります。mp911deさんはR2DBCが仕事のようなので、R2DBC関連のところには神出鬼没な感じで出現してます。
まとめ
ということで、R2DBCのMySQLドライバの開発のヒストリーみたいな話になってしまいましたが、書きました。
開発状況や実装どんな感じかなって調べているうちに、ちょっと別視点でこれまでのいきさつが見えてきたので一旦ブログにしてみた次第です。
個人的にはこういう背景があった方がどのライブラリ使おうっかなーって考えの参考にはなるのかもなというので一応書いてみました。
もう少し調べた話で以下のようなトピックがありますが、気が向いたら別記事にしてみようかと思います。
- FlywayはR2DBCにはまだ対応してないっぽいよという話(https://github.com/flyway/flyway/issues/2502)
- TestContainerには一応R2DBCサポートがあるけど使いにくいよって話https://www.testcontainers.org/modules/databases/r2dbc/
- https://github.com/testcontainers/testcontainers-java/issues/1003
- https://github.com/testcontainers/testcontainers-java/pull/2545
- https://github.com/testcontainers/testcontainers-java/pull/2577
0 件のコメント:
コメントを投稿