5

SSE (サーバー送信イベント) 接続の数を制限するものは何ですか?

私はdjango/gunicorn/django-sseを使ったプロジェクトに取り組んでいます。

私のプロジェクトは、ページへの sse 接続の数を制限するとうまく機能します (5 で 6 がハングします)。これは大きな問題ではありません。しかし、私は好きなだけ持つことができることを好みます。

私の質問は、速度が低下しているのは接続の数ですか、それとも転送されるデータの量ですか?

最初の問題は接続を共有することで解決できると思いますが、2番目の問題はおそらくもう少し制限があります。

それが考えられるアイデアはありますか?

編集:

クライアント側の JS SSE コード:

function event(url, resource_name, yes, no, audio_in, audio_out, current_draw){
    /**
     * Listens for events posted by the server
     * 
     * Useful site for understanding Server Sent Events:
     *    http://www.w3.org/TR/eventsource/
     */
    var source = new EventSource(url);
    source.addEventListener("message", function(e) {
        resetTime(resource_name);
        data = updateStatus(e.data, yes, no, audio_in, audio_out, current_draw);
        document.getElementById(resource_name+"-in").src = data.audio_in_src
        document.getElementById(resource_name+"-in").alt = data.audio_in_alt
        document.getElementById(resource_name+"-out").src = data.audio_out_src
        document.getElementById(resource_name+"-out").alt = data.audio_out_alt
        document.getElementById(resource_name+"-current").innerHTML = data.current_draw + " A"
    });
}

views.pyで

class ServerSentEvent(RedisQueueView):

    def get_redis_channel(self):
        """
        Overrides the RedisQueueView method to select the channel to listen to
        """
        return self.kwargs["resource_name"]

urls.pyで

urlpatterns = patterns('',
                       url(r'^$',
                           views.Resources_page.as_view(),
                           name='resources_page'),
                       url(r'^(?P<resource_name>\w+)/$',
                           views.StatusPage.as_view(),
                           name='status_page'),
                       url(r'^(?P<resource_name>\w+)/sse/$',
                           views.ServerSentEvent.as_view(),
                           name='sse'),)
4

3 に答える 3

0

syncワーカーをgunicorn(デフォルト)に使用している場合、サーバーへの同時接続は、ワーカープロセスと同じ数だけにすることができます。

syncワーカーはCPUにバインドされたタスク用に設計されているため、ワーカーを使用することをお勧めします(2N + 1Nは使用可能なコアの数です)。SSEエンドポイントがこれと論理的に同等である場合...

while True:
    msg = "foo"
    yield msg
    sleep(1)

...次に、I/Oバウンドビューがあります。そのコードブロックでどれだけのCPU時間を投入しても、それは決して終わらないように設計されています。プロジェクトを使用する場合、これはSSEビューが実行していることdjango_sseとほぼ同じです。

解決策は、gunicornに非同期ワーカークラスを使用することです。オプションをインストールしてgunicornにgevent渡すと、非同期のユートピアに向かっています。--worker-class=gevent

于 2013-02-23T00:30:17.107 に答える
0

私はまったく同じ問題を抱えていました。gevent をワーカーとして使用していることは確かでしたが、約 6 つの接続しか取得できませんでした。

解決策は愚かでした。これはブラウザの制限でした。次の人がこれに出くわして見ることができるように、ここに書き留めておきます..

Firefox では、network.http.max-persistent-connections-per-serverこれを制御する名前の about:config にパラメーターがあります。したがって、私の場合の解決策は、その数を 6 (デフォルト) から増やすか、複数のブラウザーを使用することでした..

于 2013-08-12T10:36:48.633 に答える