5

私はリアルタイム通知システムを構築しています。これは Web アプリケーションの一部ですが、イベントは発生したらすぐに表示される必要があります。長時間のポーリングはオプションではありませんでした。イベントが利用できない場合に Web サーバーが接続を保持するとコストがかかるため、短時間のポーリングを使用する必要がありました。

各クライアントは、たとえば 2 秒ごとに Web サーバーにアクセスします (これはかなり高いレートです)。イベントが利用可能になると、JSON として JavaScript クライアントに送信されます。現在、これには、多数の短期間の接続を処理するためのサーバーのセットアップが必要です。Yaws Web サーバーを使用して、そのようなシステムの 1 つを実装しました。ただし、Yaws は他にも多くのサービスを開始するため、接続が 30,000 を超えると負荷が高くなり、接続が拒否または中止され始めます (おそらく、Yaws が実行されているのと同じ Erlang VM でいくつかの ETS テーブルを実行しているためです [これらを分離するために が必要rpc:call/4になる場合があります。オペレーティング システム固有の調整が必要であることは承知しており、それらは既に完了しています。

複数の Yaws インスタンスを簡単にクラスター化できる場合、これは問題になりません。Yaws では、いくつかの appmod を使用しており、RESTful な作業を行っています。Cowboy の Web サーバーが、ここでの機能を少し強化するのではないかと考えていました。カウボーイは使ったことがありませんが、ミスルティンは使ったことがあります。Cowboy を見ると、これは本格的な OTP アプリケーションであり、クラスタ化が容易で、軽量であるため、システム全体で処理できるクライアントの数が増える可能性があります。ストレージは Mnesia 上にあり、簡単に配布してノードを追加することができます (おそらくレプリケーションによって)。そのため、すべての Mnesia インスタンスの前に Cowboy インスタンスが存在します。

私の質問は次のとおりです。

  1. Yaws から Cowboy に切り替えた場合、パフォーマンスが大幅に向上する可能性があるという私の推測は正しいですか?

  2. AppmodsYaws には、#arg{}レコードを介したクリーンな API があります。カウボーイには、これら 2 つのものに相当するものがありますか (図を示してください)?

  3. Cowboyファイルのアップロードを処理できますか? もしそうなら、頻繁にファイルをアップロードする場合、どちらのサーバー (Yaws または Cowboy) を使用するのが良いと思いますか? Cowboy でファイルのアップロードがどのように行われるかを説明します。

  4. 複数の Yaws インスタンスを同じマシンで実行することができます。サーバー (物理ボックス) ごとに多くの Yaws インスタンスを作成し、クライアントの負荷をこれらに分散させることは役立つと思いますか? これを行うために何を知る必要がありますか?

  5. yaws.confパラメータを設定するmax_connections = nolimitと、カウボーイで同じものをどのように指定しますか?

今、私はカウボーイの著者とのインタビューをたどり、カウボーイがヨーズよりも軽量である理由について議論しています. 彼はこう言った

最大の違いは、リストの代わりにバイナリを使用することです。ジェネリック アクセプター プールは別のものです。他にも多くの小さな違いを挙げることができますが、これらは最も興味深いものではないと思います.

Cowboy はリスナー プール ライブラリRanchを使用しているため、どういうわけか、より多くの接続を処理する能力が高くなり、リストではなくバイナリを使用することになります。

同じインタビューからの別の引用:

接続ごとに 2 つではなく 1 つのプロセスを使用し、リストの代わりにバイナリを使用するため、ユーザーの介入なしでは、他のプロジェクトよりもはるかに少ないメモリを使用することになります。カウボーイも怠け者で、必要な場合以外は何もしません。そのため、ユーザーが関数の呼び出しを開始するまで、メモリはあまりありません。

yaws はこのケースをどのように処理するのだろうか。どういうわけか、問題のドメインには軽量の HTTP 処理が必要です。Mochiweb、Misultin、Cowboy などと比較して、Yaws がより多くのメモリを消費することは事実です。私の最大の懸念は、Yaws が最も優れた/最もクリーンな API を備えていることです。これにより、Erlang レコードとして必要なものすべてを含むものにアクセス#arg{}できるようになり、外部のものを抽出するための多数の機能を備えた他のものよりも自分でそれらを取得できるようになります。ドキュメンテーションでさえ: Yaws のドキュメンテーションは非常に優れており、簡単です。GETおそらく、ファイルのアップロードや単純なPOSTリクエスト処理などについて、Cowboy コードをもっと調べる必要があります。

そうでなければ、私が以前に尋ねた質問は差し迫った懸念として残っています. ヨーズはかなり良いですが、この高速で軽量で短期間の高率の世論調査の状況ではやり過ぎのようです。どう思いますか?

4

1 に答える 1

4

あなたの 30000 拒否制限は、どこかで 32k 制限のように聞こえます。デフォルトのプロセス数 (32k) か、ファイル記述子のシステム制限などです。制限がカーネル側にある可能性を排除すべきではありません。カーネル構成が非常に扱いにくいために、システムが非常に簡単に限界に達するのを見てきました。

于 2012-10-18T21:36:08.903 に答える