具体的な所として、
現状で問題がないのであればそのままでも大丈夫です。
しかし衝突に遭遇して「排他制御」が必要と感じたら、
それを実装する時間を使ってデータベースを勉強して使いましょう。
データベースはファイルの読み書きに特化したソリューションですので、
多くのWebエンジニアに歓迎され、受け入れられています。
仮に貴方がWebサービスを開発・運用しているチームに改めて参入した場合
ほぼ確実に何らかのデータベースは導入済みであるでしょう。
その場合はしかたない、学習することになります。
実際のプロジェクトのコード読めばどうやって利用しているのか読めるので、
意外と一瞬で使えるようになるものです。
まずWeb上で情報を預かる場合の責任についてです。
貴方が仮に恋人や友人とLineで会う約束をしていたとします。
しかし当日待ち合わせ場所に来ない……
よく調べてみたら、Lineのシステムの手違いでその約束が消えてて
相手が知らないまま当日を迎えてしまっていて電話で発覚した。
許せますか?
Web上で情報を預かるということは
「例え無料だとしてもそれなりの責任が伴う」事を意味します。
この辺は「データの価値」をどの程度見積もるか評価・設計をしてください。
Lineは会社が潰れるレベルの価値に設定しているかと思います。
なのでそういう問題が起こらないよう、よく設計を練って堅牢なシステムを築いているはずです。
100人のユーザーが訪れて同時に読み書きを要求して来ても
データが消えない事を保証出来なければならない。
更にWebの利用者は目が肥えているので時間の掛かるサービスはすぐに「使えない」と見切ります。
速度も重要視されます。
こういう世界で闘う事になる可能性は覚悟しておきましょう。
Node.jsはシングルスレッドですので1プロセスで動作させている場合は問題は起こらないでしょう。
見た目は並列処理しているように見えても
イベントループの仕組み上、基本的には1個の関数しか同時に動きません。
なのでfs.writeFileSyncのような
同期処理を使って待たせている場合、
破綻することはないでしょう。
ファイルが肥大化すれば処理速度の面で悩まされる事になるでしょう。
一般的に取られる下記のような手段を採用すると牙を向いて襲いかかってくる事になるでしょう。
ディレクトリやファイルを個別に管理したり、ファイルの書き込みを遅延させたり
アイデア次第で結構頑張れると思いますが、それって目的見失ってませんか?
ファイルの整合性の担保が目的じゃないですよね、元々やりたいことがあったのでは?
ファイルの整合性の担保は、
それ自体を責任取って面倒みてくれるデータベースに任せましょうよって話です。
※セキュリティ絡みはまた別問題です。
マシンが乗っ取られて正規の手段でデータベースにアクセスされて情報を持ち逃げされるようなケースがありえます。
権限とかで縛ってマシン単位でアクセスを禁止すればパスワードなんかは守れたりしますけど……
テキストでファイルを管理する場合
問題はファイルの保存時の衝突くらいでしょうか?
解決策は「排他制御」です。
2000年前後のWebではCGIを使ったテキストチャットや掲示板サイトが多く存在しました。
当時はJSONはなく、CSV等のファイル形式で保管していました。
(JSONは{}
や[]
が第一行目と最終行目に来て包む形になりますから、追記が出来るCSVのがファイル管理のサービスに向いているでしょう)
ファイルの書き込みは基本的に上書き、つまり複数の処理が同時に書き込むと後勝ちです。
なので2つの処理が同時に書き込むと、先に書き込んだ方が消えます。
掲示板のケースで話を進めると複数ユーザーが同時に書き込むと、
先に書き込んだユーザーの発言が消えて、後から発言したユーザ1人の書き込みだけが残ります。
それに対抗するため、プログラマ達は「排他制御」を開発します
- 一時ファイルを沢山作る
- ファイルをロックする仕組みを作る
- 書き込みたい状況でロックされている場合は待つ
- ファイルを複数に分けて頻繁なロック待ちを避ける
しかし、そういう手段を講じてもデッドロック等の不具合が発生して
そもそも書き込めないんだが?みたいな現象に悩まされ続ける事になります。
単純にデータの書き込みだけの為にクッソ頑張る事になるわけで、
コード量も作業時間もどんどん肥大化してヤバい事になりますね。
(そもそもどうやって複数人が同時に書き込んでも大丈夫かを担保するねん?という事でテストもしにくい)
やりたい事は「複数ユーザの意思疎通」が目的の掲示板制作ですよね。
どうしてこうなった?
ここでデータベースが登場します。
データベースは大まかにこの辺を目的・担当にしています。
- 超高速
- 既に多数のデータを内包していてもデータ片の読み書き速度が落ちない
- ファイルの排他制御
特にRDBMSはデータの担保の面で非常に堅牢です。
手軽に導入できるMySQLやPostgreSQLは多くのWebエンジニアから愛されていますし、
金融業界やNTTデータのような大企業でも愛用されるOracleなんてものもあります。
一般的にNoSQLはRDBMSに多少担保の面で劣るものの、
スケールのしやすさ、複数台に増やして動作させる性能が高かったりして注目を集めています。
MongoDBはRDBMSとNoSQLの同居みたいなバランス感覚が絶妙で、
中々使い勝手が良いみたいな話を聞きます。
とまぁ、データベースを使えば衝突や速度を稼ぐという事を責任とってやってくれますので、
メインの業務ロジックに集中できます。
データを預かる事に疲弊したWebエンジニアがデータベースを使わない理由がない。
Webエンジニア達はデータベースの学習コストを甘んじて受け入れる事になりました。
めでたし。
こんな感じの流れです。
複数のWebエンジニアが協業して、
大きなWebサービスを作り上げるとなれば、
まぁ、何らかのデータベースは使う事になります。
一人でも一度データベースを勉強して扱えるようになっておけば
あっちこっちのプロジェクトで排他制御を書きまくるなんてこともせずに済みます。
学習コストを割く価値は十分あると思います。