node.jsでmysqlはつらい
mysqlのモジュールで普通に組むといろいろな問題に直面する
・1.1アクセス1コネクションだとあっというまにmysqlの接続上限に達する
・2.コネクションプールしてコネクションをユーザー間で使いまわすとトランザクションが使えなくなる
・3.クエリー発行が非同期なためコールバックのネストが深くなりすごいことになる
・4.MYSQLの書き込みが遅すぎるためキューイングが発生するためnodeのメモリが足りなくなる(負荷テストすれば確認できる)
とりあえずこんなもんか。
回避策
1と2
スレーブ接続でコネクションプールしてラウンドロビンする
マスター接続は都度接続して必要なくなったらすぐ切る
3
モジュールのasyncblockでI/O待ちにfiberを用いる
クエリーをキューイングしてfiber内で一括で処理する
4
node.jsが秒間一万件以上リクエストさばけるのにMYSQLの書き込み性能がHDDだと秒間170件程度。
SSDが使えなければシャーディングするしかない
またはとりあえずredisに書き込んで裏で別のnode.jsを立ち上げて遅延書き込みする
※追記
同期(innodb_flush_log_at_trx_commit)をはずせば4の制限は外れるがそれでも遅い
大量にリクエストがさばけるのもバックエンドにとっては困りものだ。