web-dev-qa-db-ja.com

Django /コメット(プッシュ):すべての悪の最小化?

DjangoおよびHTTPプッシュに関して見つけることができるすべての質問と回答を読みました。しかし、基本的な「Hello World」を達成する方法について明確で簡潔な最初から最後までのソリューションを提供するものはありません"いわゆる"彗星 "機能の。

最初の質問(1):HTTPがこれに対して(少なくとも今のところ)単純に作られていないという問題はどの程度ですか?すべての潜在的なソリューションは本質的にハッキングですか?

2)現在利用可能な最良のソリューションは何ですか?

  • 軌道に乗った?
  • 他のTwistedベースのソリューションはありますか?
  • 竜巻?
  • node.JS?
  • XMPP w/BOSH?

他の解決策はありますか?

3)nginxプッシュモジュールはどのようにこのディスカッションに参加しますか?

4)これらのソリューションのうち、典型的なmod_wsgi/nginx(またはApache)デプロイメントモデルの交換が必要なものはどれですか。なぜこれが必要なのですか?いずれにしても、これは好ましい移行ですか?

5)すでにPythonに含まれているソリューションを使用する利点はどのくらい重要ですか?

私がblip.tvで見たばかりのPyCon 2010からのAlex Gaynorのプレゼンテーションは素晴らしくて有益ですが、DjangoのHTTPプッシュの現在の状態についてはそれほど具体的ではありません。彼が私にある程度の自信を与えたと言った一つのことはこれでした:Orbitedはネットワークソケットの概念を抽象化してシミュレートするのに優れています。したがって、WebSocketが実際に着陸すると、移行に適した場所になります。

6)HTML5 WebSocketは現在のソリューションとどう違うのですか?ゲイナーのOrbitedからの移行のしやすさの評価は正確ですか?

53
jMyles

この質問をしてから6年以上が経過したとは思えません。

Django(および関連するネットワークトラフィック、たとえばwebsockets)との非同期)は、コミュニティの多くの私たちにとって悩みの種です。私はこの数年、とりわけこの悩みを掻き立てました。

hendrix

hendrixはTwistedで実行されるWSGI/ASGI conatinerです。これは、いくつかのビジョナリー組織からの支援と資金提供を受けて、主に5人の愛好家によって推進されているプロジェクトです。現在、数十社ではなく数十社で生産されています。

ドキュメントを読んで、なぜこの問題の最善の解決策であるかを確認するのはあなたにお任せしますが、いくつかの簡単なハイライト:

  • twistedに基づいており、Twistedの内部に関する知識や使用法は必要ありませんが、すべてを利用可能のままにします
  • Django(またはPyramid、またはFlask)アプリ内から非同期およびソケットトラフィックを実行するために特別なサーバーまたはプロセス構成を必要としないという意味で、「機能する」だけです
  • ASGI、Django Channels標準)との上位互換性があり、いくつかの意味のある最初のASGIコンテナです。
  • ビューロジックのフローを維持し、ユニットテストが容易なシンプルなAPIが同梱されています。

これがこの質問に対する最良の答えであると思う理由の詳細については、Django-NYC(Buzzfeedのオフィス)で行った この講演 を参照してください。

1
jMyles

コメットが必要な場合は、evserver(http://code.google.com/p/evserver/)を見てみます。

「ほとんど知られていない非同期WSGI拡張機能をサポートし」、libeventを中心に構築されています。チャームのように動作し、Djangoをサポートします。実際のハンドラーコードは少し見苦しいですが、実際には非同期ioであるので、適切にスケーリングされます。

私はevserverを使用しており、evserver offsersより少しだけ多くが必要なため、現在サイクロン(ねじれの竜巻)に移動しています。私は真の双方向io(socket.io(http://socket.io/)を考える)が必要であり、evserverはそれをサポートできますが、サイクロンで tornado's socket.io を再実装する方が簡単だと思いました(私は竜巻ではなくサイクロンの場合、サイクロンはツイスト上に構築されるため、ツイスト(ic zeromq)で実装されていないトランスポートが多くなります。ほとんどの実際的な状況では、WebSocket + FlashベースのWebSocketで99%をサポートするのに十分だと思います(Adobe Flashの普及率は約99%(http://www.Adobe.com/products/player_census/flashplayer/version_penetration.html)によると) Webサイト訪問者の(フラッシュを使用していない人だけが、socket.ioの(パフォーマンスとリソースの消費が少ない)バックアップトランスポートの1つにフォールバックする必要があります)

ただし、websocketはhttpトランスポートではないため、httpベースのプロキシ(httpモードのhaproxyなど)の背後に置くと接続が切断されます。 tcpモードでプロキシできるように(たとえば、tcpモードでhaproxy)、代替IPまたはポートでそれらを提供することをお勧めします。

質問に答えるには:(1)双方向トランスポートが必要ない場合は、ロングポーリングベースのソリューションで十分です(接続を開いたままにしておくだけです)。接続をステートフルにする必要がある場合、またはデータの送信と受信の両方を行うことができる必要がある場合、事態は不明瞭になります。後者の場合、socket.ioが役立ちます。ただし、WebSocketはこのシナリオ用に作成されており、フラッシュのサポートにより、ほとんどのWebサイトのビジターが利用できます(socket.ioまたはスタンドアロン経由。ただし、socket.ioには、フラッシュをインストールしたくない人のためにバックアップトランスポートの利点があります)。

(2)必要なものがすべてPushの場合、evserverが最善の策です。クライアント側では、オービットと同じJavaScriptを使用します。そうでない場合はsocket.ioを見てください(これにはサポートサーバーも必要です。python利用できるのは竜巻だけです)。

(3)これは他の1つのサーバー実装にすぎません。私がそれを正しく読んだ場合、それはプッシュのみです。データをクライアントにプッシュするには、アプリからnginxサーバーにhttp equestを実行します。 (その後、nginxはクライアントに到達するように注意します)。これに興味がある場合は、mongrel2(http://mongrel2.org/home)を見てください。ロングポーリング用のハンドラーだけでなく、websocketsのハンドラーもあります(mongrelにhttpリクエストを送信する代わりに、今回はzeromqハンドラーを使用してmongrelサーバーにデータを取得します)(websocketおよびフラッシュベースのwebsocketに対する開発者の熱意の欠如に注意してください。特に、websocketプロトコルが進化する傾向があることを考慮すると、ある時点で、mongrel2のwebsocketサポートを自分でコーディングし直す必要があるかもしれません。 WebSocketをサポートしている)

(4)evserverを除くすべてのソリューションは、wsgiを別のものに置き換えます。ほとんどのサーバーには、この「何か他のもの」の上にいくつかのwsgiサポートがあります。どのソリューションを選択する場合でも、1つのCPUを集中的に使用するか、それ以外の場合はioブロック要求がサーバーをブロックしないように注意してください。 (複数のインスタンスまたはスレッドが必要です)。

(5)それほど重要ではない。すべてのソリューションは、クライアントにデータをプッシュ(該当する場合は受信)するために、いくつかのカスタムハンドラーに依存しています。私が言及したすべてのソリューションでは、これらのハンドラーをPythonで作成できます。完全に異なるフレームワーク(node.js)を使用したい場合は、node.jsの使いやすさ(簡単だと想定されていますが、かなり実験的であり、実際に安定しているライブラリはほとんどないことがわかっています)を比較検討する必要があります。既存のコードベースと利用可能なライブラリを使用することの利便性(たとえば、アプリにブログが必要な場合は、そこに十分にDjangoブログをプラグインできますが、node.jsにはありません)。パフォーマンス統計に目を凝らします。ダムの定義済みデータ(すべてのベンチマークが行うこと)をクライアントにプッシュする予定がない限り、データの実際の処理によってオーバーヘッドが大幅に増加することがわかります最悪の非同期io実装よりも(ただし、多数の同時クライアントを計画している場合でも、非同期ioベースのサーバーを使用したい場合、スレッド化は何千もの接続を維持することを意図したものではありません)

(6)WebSocketは双方向通信を提供し、ロングポーリング/ Cometはデータをプッシュするだけで書き込みを受け入れません。 (Socket.ioは、2つのhttpリクエストを使用して、この2つのHTTPリクエストをシミュレートします。フラッシュベースのWebソケットは、実際のWebソケットに似ています(違いは、実装がブラウザーではなくswfにあることです)。また、websocketsプロトコルはhttpプロトコルに従いません。 longpolling/cometは行います(技術的には、websocketクライアントがアップグレード要求をwebsocketサーバーに送信し、アップグレードされたプロトコルはhttpではなくなります)

24
Aliquip

Django-websocket を使用したWebSocketsのサポートがありますが、動作させるために残念ながら大きな問題があります。ここにそのページからの引用があります:

免責事項(Django-websocketを使用するときに知っておくべきこと)

BIG FAT DISCLAIMER-現時点では技術的に[〜#〜]ではない[〜#〜]WSGIでWebSocketを使用する方法は何でも可能です。これは既知の問題ですが、WSGI規格が作成されている間に行われた設計上の決定により、クリーンな方法で回避することはできません。現時点では、WebSocketなどは存在せず、予測もできませんでした。

...

しかし、WSGIだけが制限要因ではありません。 Django自体は、WebSocketを考慮しない単純な要求から応答のシナリオを中心に設計されています。これは、現在のDjangoで標準準拠のWebSocket実装を提供することは不可能であることを意味します。しかし、 -so pretty way。したがって、Django-websocketの使用中にtcpソケットが拷問される可能性があることに注意してください。

したがって、現時点では、WSGI:行きません。 Django:Django-websocketsを使用しても、ほとんど何も起こりません。著者のコメントも参照 元の発表

これは良い考えのようには思えません。スレッド化を必要とするような方法で、長寿命の接続を行っています。 Django-websocketにはスレッド設定が必要であり、プロセスが多すぎると(プロセスが多すぎるため)機能しませんが、同時に多くの接続に対してスレッドがスケーリングされないため、誤った安全。長寿命の非同期プラットフォームが必要です。これを行うには、Djangoでアプリを実行し、Node.jsでコメットとWebソケットを使用します

個人的にWebSocket(来年になると予想しています)を使用する場合は、最初に TwistedCyclone の組み合わせを試します。それらはWebSocketに対応し、適切に拡張できるように設計されています。コードを適切に記述してDjangoへの不要な依存関係を削除すると、Twistedベースのシステムでコードの多くを使用できるようになります。これは、Node.js、Comet、または他の言語のシステムを使用する場合と比べて非常に明確な利点です。シンプルなプッシュを作成することもできます

最後に、難しいと判断して、外部サービスを使用してプッシュサポートを提供することもできます。これは、接続を確立する方法や同時実行がどのように機能するかなどを心配するのではなく、サーバーに単純なJSONリクエストを送信するという問題になります。もちろん、あなたはそれを支払う必要があります(現在はベータ版の間は無料の場合があります)が、実装の詳細について心配する必要はありません。ただし、WebSocketの全機能をそのまま使用することはできません-プッシュサポートのみです。

7
Chris Morgan

質問2について、最近、Djangoコメットを多用するアプリの内部のツアーが提供され、Orbitedが選択したソリューションでした。

1
Paul Bissex