データベースサーバー書き起こし

効率を求めているのにJavaScriptで、というのも矛盾している気がしなくもないが、実行効率ではなく開発効率であると言い換えることで辻褄を合わせている。
そんなことはさておき、リアルタイム系サービスの面倒な部分、ディスクIOの話。ファイルのロックやらなんやらでとっても面倒な部分ではあるのだけれど、結構画期的なこと(でもない)を思いついたのでエントリー。まぁ、メモリーリソースがあるのなら良い子の皆さんはMySQLを使えという話です。

まず、node.jsにおいてソケット通信のコールバック関数は新しいスレッドで呼ばれるため、限りなく同時に近いタイミングで複数のデータを受信し、ファイルへの書き込みを行おうとすると、ファイルが破損する。
ここでもしファイルロックをかけ、他のスレッドを待たせるという手もあるが、そうするとリアルタイムなメッセージの配送ができない。
これを解決するために、特殊なデータ管理方法を考えた。世のデータベースは既にすべて実装しているであろうと思われる(詳しくは調べていない)。
以下に具体的な手順を記述する。

  1. データを受けとる
  2. 即座にそのデータを書き込みキューへ回す
  3. さらにデータをブロードキャストする

そして、ここで書き込まれたキューはwhile(true)の無限ループで参照され、書き込める分だけ随時書き込まれる。さらに、読み出しのリクエストが飛んできた場合はファイルだけでなく、溜まっているキューの内容も読み出し、送信する。

だいたいこんな感じ。
この一連の動作が面倒だからどうせならサーバー化してしまおうというUNIXな考えというわけ。あとはTCPで繋げていろいろと読み込む。もうMySQL使えとw