5

aiohttpにはwebsocketsのサポートが組み込まれています。とてもシンプルでうまく機能します。

ドキュメントの例の簡略版は次のとおりです。

async def handler(request):
    ws = web.WebSocketResponse()
    await ws.prepare(request)

    # Async iterate the messages the client sends
    async for message in ws:
        ws.send_str('You sent: %s' % (message.data,))

    print('websocket connection closed')

この例でwsは、クライアントとの Websocket 接続への参照です。@Crandel がここで行っているrequest.appように (つまり、グローバル状態)、この参照を に簡単に入れることができますが、各アプリ サーバー (さらには各ワーカー) が独自のインスタンスを持つため、実稼働アプリではできません。app

これに受け入れられたパターンはありますか?別の方法はありますか?

注: セッションについて言及しているわけではありません。接続について言及しています。サーバー B のアプリケーション コードでイベントが発生したときに、サーバー A に接続しているクライアントにメッセージを送信したいなど。

4

3 に答える 3

1

更新 (2017 年 2 月)

Channels は (幸いなことに) Django にマージされませんでした。これはおそらく素晴らしいプロジェクトであり続けるでしょうが、実際には Django 自体に属していませんでした。

また、Postgres の比較的新しい pub/sub の組み込みサポートを確認することを強くお勧めします。それはおそらく他の何よりも優れており、Postgres をバッキング サービスとして使用して、aiohttp の上にカスタム ソリューションを構築するのが最善の策かもしれません。

オリジナル

aiohttp ではありませんが、Django 1.10にマージされる可能性が高いDjango Channelsは、この問題を非常に直感的な方法で解決します。これは、Django migrationsの著者であるAndrew Godwinによって書かれています。

Django Channels は、Django アプリの前にルーティング レイヤーを作成することで、「多数のサーバー上の多数のプロセス」の概念を抽象化します。このルーティング層は、プロセス間で共有可能な状態を維持するためにバックエンド (Redis など) と通信し、新しいASGIプロトコルを使用して HTTP 要求と WebSocket の両方の処理を容易にし、それぞれをそれぞれの「コンシューマー」に委譲します (たとえば、 HTTP リクエスト用の組み込みハンドラーであり、WebSocket 用に独自のハンドラーを作成できます)。

Django Channels にはGroupsと呼ばれる概念があり、これは問題の「ブロードキャスト」の性質を処理します。つまり、サーバー上で発生したイベントが、同じまたは異なるプロセスまたはサーバーに接続されているかどうかに関係なく、そのグループ内のクライアントへのメッセージをトリガーできるようにします。

IMHO、Django Channels は、より一般的な Python ライブラリに抽象化される可能性が非常に高いです。Go のようなチャネルを実現するPython ライブラリは他にもいくつか ありますが、この記事の執筆時点では、ネットワークの透過性を提供する注目に値するライブラリはありません。チャネルがプロセスとサーバー間で通信する機能。

于 2016-03-11T17:01:40.437 に答える