2

データベースアクセスとサービスの抽象化に関する以前の質問への回答は、SOAではデータベースサービスがパブリックAPIを提供する必要があるが、データベースへの直接アクセス(SQLまたはORM経由)は提供しないことを理解するのに役立ちました。

さて、Erlang / OTPアプリケーションで(SOA)サービスを作成したい場合は、gen_serverまたは他のOTPの動作である必要があると思います。その場合、APIは簡単に定義され、サービス自体を簡単に組み込むことができるからです。アプリケーション。

しかし、サービスからそのコンシューマーにデータを渡すにはどうすればよいですか?

RubyonRailsでは次のようなことができることを知っています

persons = Person.find(all)

personsその後、サービスコンシューマーに戻ることができます。

Erlang / OTPpersonsで数千レコードの場合、gen_server returnステートメントで渡す必要がありますか?これは、gen_serverがその呼び出し元(サービスコンシューマー)にメッセージを送信し、メッセージが基本的にErlangVMにコピーされることを意味します。私はそれがErlangメッセージパッシングの適切な使用法ではないと思う傾向があります。

だから私の質問は:

  • Erlang / OTPでデータベースサービス(SOA)を作成するにはどうすればよいですか?
  • このようなサービスのAPIは、OTP標準メカニズム(gen_serverリターンメッセージなど)またはその他のものを使用する必要がありますか?
4

1 に答える 1

4

すべての Erlang アプリケーションにメッセージが必要なわけではありません! また、すべての Erlang アプリケーションが を使用する必要があるわけではありませんgen_servers。Web アプリケーションなどの接続を伴うアプリケーションの場合、gen_server.

Web サーバー ( Yaws) は、基本的に、各着信要求を処理するプロセスを生成します。ここで、アプリケーションで次のことが発生する可能性があります。

1. 別のプロセスを生成してリクエストを処理し
、応答をメッセージとして最初のプロセスに送信する
こともでき
ます。 ODBC接続などを介して
の場合、1すでにリクエストごとのプロセス数を増やしています。ほとんどのアプリケーションは、 case と十分に並行し2ます。このすべてにどのgen_serverように参加しますか?

Agen_serverは多くのものの抽象化です。ただし、それでも agen_serverは requests を処理しone-by-one、障害点も作成します。もちろん、それが失敗した場合、restart strategyそれを立ち上げる があります。したがって、その間にgen_server立っている場合、またはその後、gen_server がこれらのプロセスを順番に処理しているため、実行される並列化は時間の無駄です。しかし、各プロセスが一連のコードを順番に処理して答えを得る場合、そのメリットは計り知れません。yawsmnesiaan odbc connection to MySQL / Oracle / e.t.c.yaws

実際、私はSOA以前にいくつかのアプリケーションを作成しましたが、それらはRESTFUL自然の中にあります。データベース内の情報へのパスに が含まれている場合、実際に言うとyaws appmods(基本的にはRESTFUL既に使用されています)、無駄になることがわかりました。アプリケーションの速度と安定性の面で改善されたパフォーマンスをgen_server削除します。gen_server場合によってmailbox / message boxは、gen_serverが大きくなりすぎて、プロセスが応答を待機するため、システム全体の速度が低下することがあります。もう 1 つの問題は、メッセージが erlang VM のいたるところにコピーされるため、メモリが問題になることです。まさにあなたの問題の参考例として、この本 (Franceso and Simpsons Erlang Book)110を開いて、タイトルの下のページを見てください。A Case Study on Concurrency-Oriented Programming、プロセスの設計パターン、悪い方法と良い方法を示します。

于 2012-08-03T08:44:33.757 に答える