0

Erlang で Web アプリケーションを作成していて、データを PostgreSQL に保存したいと考えています。

私のアプリケーションには 2 種類のリソースがあります。1 つは非常に重要ですが、もう 1 つはそれほど重要ではありません。

  • 重要なものについては、データの損失は許されません。
  • 重要度の低いものについては、システム障害によるデータ損失は問題ありません。

私は最大の効率を得たいと思い、そのようなアイデアを思いつきました: PostgreSQL のゲートウェイを書きます。ゲートウェイは でありgen_server、ビジネス ロジック (BL) パーツは、リソースを格納するためにゲートウェイと通信できます。

  • 重要なリソースを格納するために、BL パーツは格納するリソースをゲートウェイに送信し、メッセージ (成功または失敗) に対してブロックreceive、最終的に Web ページでユーザーに応答します。
  • 重要度の低いリソースを保存するために、BL パーツはブロックせずにリソースのみをゲートウェイに送信します。リソースを送信した後、BL パーツは Web ページで直接応答します。

ほとんどのリソースはそれほど重要ではないため、このアイデアから私が期待しているのは、リクエストあたりの秒数が少ないことです。しかし、これは良い考えなのだろうか、つまり、本当に期待どおりの結果が得られるのだろうか?

あなたの経験や信頼できる「ウェブ検索結果」に基づいて回答してください。ありがとう。:-)

4

1 に答える 1

4

あなたの提案には 2 つの問題があります。

  1. gen_server ゲートウェイに送信されるすべてのメッセージはシリアル化されます (ブロッキングまたはノンブロッキング)
  2. gen_server ゲートウェイ プロセスがクラッシュすると、少なくともプロセス メールボックス内のメッセージが失われます。

私がすることは、データベースの相互作用を担当するヘルパー モジュール (プロセスではない) を作成することです。このプロセスでは、接続プールをサポートする postgresql ライブラリを使用します (したがって、DB への呼び出しにある程度の並列性を持たせることができます)。

重要度の低いリソースに対してノンブロッキング DB 操作を行いたい場合は、DB とのやり取りを行うプロセスを生成して先に進みます。

postgresql erlang ライブラリへのいくつかのリンク (私は何も使用していません):

Erlang での Postgresql 接続プーリング

http://zotonic.com/page/519/epgsql-postgresql-driver

于 2012-09-11T18:39:08.880 に答える