2

プロセス間通信にファイルを使用することの長所と短所は何ですか?私がこの質問をしている文脈の背景をいくつか挙げさせてください。

問題は、いくつかの制約がある古典的な生産者/消費者問題です。プロデューサーは、マシンのクラスター上で実行される一連の協調プロセスであり、ブロードキャストを使用して相互に通信します。各プロセスには、それが知っているローカルユーザーがいて、上記のブロードキャストメカニズムによって他のプロセスにもそれらを知らせます。これまで、ブロードキャスト/共有されている状態情報は保持されていませんでしたが、保持する必要があります。

このシステムは何年にもわたって本番環境で実行されており、数千人のユーザーをサポートしており、永続性のサポートを追加するためにこれに依存関係を追加することについて、人々は当然のことながら非常に心配しています。私たちが選択したパスは、ローカルトラフィックをファイルシステム上のファイルに書き込む既存のプロセスに新しいスレッドを生成し、それを新しいプロセス(コンシューマーと呼びます)によって読み取られて永続化することでした。このアプローチで見られる利点は次のとおりです。

  1. 私たちは無料で永続性を取得します。新しいプロセスに問題がある場合は、ファイルシステムに書き込んでいるときに、ローカルトラフィックを失うことはありません。消費者が中断した場所を知っている限り、消費者はいつでもデータの処理を開始できます。
  2. キューイングライブラリを使用するための学習曲線はありません。そのプレーンな古いUNIXファイルIOです。
  3. 最大の利点は、ファイル書き込み用の新しいスレッドを除いて、現在のプロデューサープロセスにまったく影響を与えないことです。

このアプローチに関する懸念事項は次のとおりです。

  1. ファイルのロックと競合、およびそのパフォーマンスへの影響。
  2. 書き込みバッファがフラッシュされ、プロデューサーがファイルに完全なイベントが書き込まれた場合にのみファイルロックを解放することを確認してください。消費者は不完全な記録を読む必要があります。

考え?このアプローチはナイーブであり、既成の永続キューライブラリを使用するための立ち上げ時間の初期コストを支払う必要がありますか?ここでの主なポイントは、現在のプロセスへの影響を最小限に抑え、依存関係を追加しないことです。

4

1 に答える 1

1

私は最近、この選択に直面し、Berkeley DB について十分に学習して、そのキュー メカニズムを使用することを検討しました。しかし最終的には、代わりに Unix ファイルシステムを使用し、Posix セマフォを使用して独自のアトミック キュー プリミティブを作成することにしました。すべてのプロセスが 1 台のマシン上にある場合、これは非常に簡単です。アトミック put 関数は、約 12 行のコードです。アトミック get は、キューが空の場合は待機する必要があるため、約 3 倍のサイズになります。

私のアドバイスは、これらの詳細を隠すアトミック キュー API を設計することです。(インターフェイスを使用して、変更される可能性のある設計の詳細を隠すという Parnas のアドバイスに従う典型的な例です。) API の最初のバージョンは、プレーンな Unix ファイル I/O を使用して実行できます。次に、ロック、Berkeley DB、またはセマフォなどのバリエーションを試すことができます---すべて「現在のプロセスへの影響を最小限に抑えます」。

何かを試すまで、パフォーマンスへの影響はわかりません。実際のファイルシステムでのファイル ロックは非常に優れています。NFS でのファイル ロックは厄介です。

于 2009-05-03T02:34:13.547 に答える