1

私は私が解決しなければならない問題を話すつもりです、そして私が正しい道にいるならば私はいくつかの提案が必要です。

問題は:

リクエストを受信して​​何らかのアクションを実行するWindowsサービスアプリケーションを作成する必要があります。(ソケット通信)このアクションは、スクリプト(おそらくluaまたはperl)を実行することです。このスクリプトは、クライアントのビジネスルールをモデル化し、データベースでクエリを実行し、Webサイトで要求を行い、クライアントに応答を送信します。

3つの必須要件があります。

  1. サービスは同時に多くのリクエストを受け取ります。ですから、ワーカーのスレッドモデルを使うと思います。
  2. サービスは高スループットである必要があります。同時にたくさんのリクエストがあります。
  3. 低遅延:これらの要求に非常に迅速に応答する必要があります。

すべてのリクエストでログエントリが生成されます。I / O時間が長いため、スクリプトの実行と同時にこれらのログエントリを物理ディスクに書き込むことはできません。おそらく私はメモリ内にキューを作成し、他のスレッドはこのキューを消費してディスクに書き込みます。

将来的には、2人のwokerのスレッドがメッセージを変更しなければならない可能性があります。

このサービスのプロトコルを作成する必要があります。Thriftを使用することを考えていましたが、関連するオーバーヘッドがわかりません。多分私は自分のプロトコルを作るでしょう。

Windowsサービスを書くために、私はErlangで考えていました。それは良い考えですか?

この問題を解決するための提案/ヒントはありますか?このサービスを作成するのに適した言語はどれですか?

4

1 に答える 1

1

はい、Erlangは、知っているか、学ぶ準備ができている場合に適しています。Erlangを使用すると、ワーカースレッドは必要ありません。サーバーをErlangスタイルで実装するだけで、マルチスレッドソリューションを自動的に受け取ることができます。

ErlangプログラムをWindowsサービスに変換する方法はわかりませんが、おそらく実行可能です。

多くのスレッドから同じログファイルに書き込むことは、ロックが必要なため、最適ではありません。ログエントリキュー(ロックフリー?)とそれらをファイルに書き込む別のスレッド(Erlangプロセス?)を用意することをお勧めします。ところで、別の言語で外部スクリプトを実行する方が、ファイルにログレコードを書き込むよりもはるかに高速であると確信していますか?

Thriftが無料で提供しているよりも、独自のシリアル化ライブラリを使用した方がはるかに優れたパフォーマンスが得られるかどうかは疑わしいです。もう1つのオプションはGoogleProtocolBuffersで、誰かがそれがより速いと主張しました。

理論的には(!)Erlangソリューションが必要なパフォーマンスを提供しない可能性があります。この場合、C++などのコンパイル可能な言語とBoost.Asioなどの非同期ネットワークを検討してください。しかし、Erlangの方法よりもはるかに複雑であることを覚悟してください。

于 2011-04-02T17:25:34.063 に答える