you21979の日記

実験ネタとか。仮想化とかnodejsで嵌った所とかおもしろかったところとかいろいろ

node.jsでmysqlはつらい

mysqlのモジュールで普通に組むといろいろな問題に直面する

・1.1アクセス1コネクションだとあっというまにmysqlの接続上限に達する

・2.コネクションプールしてコネクションをユーザー間で使いまわすとトランザクションが使えなくなる

・3.クエリー発行が非同期なためコールバックのネストが深くなりすごいことになる

・4.MYSQLの書き込みが遅すぎるためキューイングが発生するためnodeのメモリが足りなくなる(負荷テストすれば確認できる)

 

とりあえずこんなもんか。

 

回避策

1と2

スレーブ接続でコネクションプールしてラウンドロビンする

マスター接続は都度接続して必要なくなったらすぐ切る

 

モジュールのasyncblockでI/O待ちにfiberを用いる

クエリーをキューイングしてfiber内で一括で処理する

 

node.jsが秒間一万件以上リクエストさばけるのにMYSQLの書き込み性能がHDDだと秒間170件程度。

SSDが使えなければシャーディングするしかない

またはとりあえずredisに書き込んで裏で別のnode.jsを立ち上げて遅延書き込みする

 ※追記

同期(innodb_flush_log_at_trx_commit)をはずせば4の制限は外れるがそれでも遅い

 

大量にリクエストがさばけるのもバックエンドにとっては困りものだ。