月数100万アクセスをDB使わず超簡単にさばく
ここの反応を見て思ったことやメモなど。
まず、PHPでは普通にファイルをストレージとして使う。PHPの初期設定でセッションを使う場合、データはファイルに保存される。たぶん多くの人が知らない間にファイルをストレージとして使っている。
サーバー1台でセッションGCをcronで実行するなら、Redisよりファイルの方が速い。
当然RDBよりも速い。
そしてデータ書き込み競合のことを心配している反応もあるが、LOCK_EX
を読み飛ばしているのだろうか?今時Webプログラミングでfopen
なんてしないから意味が分かっていない人も居るのかもしれない。
ファイル名がユニークと書いてあるので、昔のカウンターCGIや掲示板のデータファイルのようにはならなさそう。ファイルが大量にあって遅いならgit
やキャッシュライブラリのようにprefixでディレクトリを分けてもいい。
CPU1、メモリ1GBのサーバーでDBを使っても1アクセス0.05秒以下の処理速度は普通に出るので、DBもフレームワークも使わないなら例えレンタルサーバーでもかなり速いのではないかな。速いならロックで詰まることも起きにくい。
それから、Linuxではファイルは可能な限りキャッシュされる。一度読み込んだファイルがメモリにあるならわざわざディスクを読んだりしない。
MySQLをtmpfsに置いたりするのはナンセンスだし、ファイルから読み込んだ内容をそのまま(1台で)メモリキャッシュ系サーバーに登録するのも意味が無い。
書き込みもLinuxならキャッシュに書き込んでディスクでは待たされないけど、PHPのファイル操作はどうだっけ?
RDBMSは不要かというとそんなことはなくて、ACIDを実現したいなら使うしかないし、複雑なリレーションを管理したいときも使うしかない。
まあ「コイン系SNSサービス」でACID要らないの?という気もしなくはないけれど、BitcoinだってKVS+バイナリデータファイル+seekによるデータ保存だったし、結果整合性でやりくりするならKVSのようなファイルがいいのかもしれない。RDBのトランザクションより結果整合性を担保する設計の方が難しい気はするが。
あと、どうでもいいけど、コメント欄のゆるい返信が地味にすごい。