kubo39's blog

ただの雑記です。

Rustのmysql_asyncをさわってみる

Rustの非同期I/O隆盛の流れでtokioベースのmysql driverができたっぽい。(ほんとにできたばっかり)

GitHub - blackbeam/mysql_async: Asyncronous Rust Mysql driver based on Tokio.

雑な説明だけれど一応書いておくと、非同期I/Oは一スレッドが捌くクライアントの数が多くなるので、ひとつのクライアントで重い処理が走ると全体のスループットが下がってしまう問題がある。Cで書かれたlibmysqlclientは同期I/Oの操作しか提供しておらず、ブロックするようなI/Oがはしるときに上述の問題があるのでイベントドリブンなサーバと相性が悪い。イベントドリブン前提なGoやnode.js、D言語(vibe.dベースのやつ)のmysqlクライアントなんかはこれを使わないで自前で書いてブロックしそうなI/Oイベントをいい感じにスイッチするようにしてる。Pythonなんかだとpure Pythonがどうしても遅いのでgreenifyみたいに頑張る人たちもいるけど。

書いててスイッチの話が出るなら軽量スレッドの話も必要になるか…と思ったけどめんどいしGoとかgeventとかそのへん調べてもらったほうがいいな。。

まあそういう流れでRustもtokio/futuresベースのやつができたので、さっそく試してみよう。試すっていうか、サンプルを触っただけ。

とりあえずUbuntuなのでこのへんを入れた。まあ各位よしなに。。というかんじ。

$ sudo apt install mysql-server mysql-client -y

cargo newでプロジェクトを作成。

( ՞ਊ ՞) :~/dev/rust $ cargo new --bin sample_mysql_async
     Created binary (application) `sample_mysql_async` project

Cargo.tomlに追記。

[dependencies]
mysql_async = "0.1.0"
futures = "0.1.*"
tokio-core = "0.1.*"

サンプル全体は ここ にある。

軽量スレッドとの組み合わせはどうなるのかな。Rustだとcoroutine-rsとかlibfringeとかと組み合わせるのか、なんかいい感じにmiocoやcoio-rsが使えるのかそういうかんじになりそう。