2012-10-22 11 views
5

ので、セッションのXHRポーリング輸送で失敗します。私はWebSocketを使用しています。それ以外の場合は、XHRポーリング(IEなど)を強制しています。複数の労働者は、私は現在、労働者<strong>socketio.sgunicorn.GeventSocketIOWorker</strong>を使用してgunicornサーバで複数の労働者間<a href="https://github.com/abourget/gevent-socketio" rel="nofollow">gevent-socketio</a>を拡張しようとしている

XHRポーリングでは、次のポーリングを追跡するためのセッションが必要ですが、1人から2人以上の作業者になるとすぐに要求が広がり始め、状態が失われ、すべてが故障します。

私は、次のコード行が関連していると思う: https://github.com/abourget/gevent-socketio/blob/master/socketio/handler.py#L104-106 私は私が定期のpubsub-アクションのために使用していますが、これは実際のライブラリの奥深くである例のRedisのために、いくつかの他のストレージエンジンを必要とします。

私の質問は、メモリ内のセッションストレージからアプリケーション内のグローバルに別のバックエンドエンジンに移動する方法です(上のリンクのセッションコードを上書きします)ライブラリ自体を変更する必要はありませんか? Something like PHP's session directives in php.ini。私は、これが非常に一般的なpythonの質問であるとの議論ができたと思いますが、私は関連情報を見つけるのに苦労しています。また、このライブラリでもうまくいくかどうかはわかりません。

代わりに、gevent-socketioのxhrポーリング転送を別のワーカーとサーバー間で(スティッキーなしで)使用するにはどうすればよいですか?

ありがとうございます!

+0

ちょっとしたアイデア:セッション固有の情報をクッキーに保存していますか? RESTの一種。 –

+0

@moodhこれを解決しましたか?とにかく、複数の労働者が本当に助けてくれますか? Gevent自体は、すでに1つのイベントループで多くの呼び出しを処理するのに優れています。 – pors

+0

いいえ、私はあきらめて、代わりにhttp://pusher.com/を使い始めました。この問題に関しては、gevent-socketio(https://github.com/abourget/gevent-socketio/issues/112)にいくつかのチケットがありますが、どのくらい来たのか分かりません。申し訳ありません:) – moodh

答えて

3

これは明らかにsocketioの制限です。私がWeb上で見ることができることから、セッション処理は通常、WebサーバーのレイヤーではなくWebフレームワークレイヤーで行われます。 socketioはそれ自身で、下層でそれをやろうとしますが、それは限られた方法で行います。私は著者が本格的な解決策が過度のものになると思ったと思います。あなたの場合、彼らは間違っていることが判明しました。

論理変更が必要な制限を克服するには、実行時にソースとパッチを適用する2つの方法しかありません。あなたが一番気に入っているものを選んでください(または、うんざりします:^))。 2番目のオプションについては、request_tokensおよび/またはそれを作成するコードを、同じインターフェイスを持つ別のエンティティに置き換えることをお勧めします。第1段落で述べた理由から、socketioの作者は、あなたが提案した外部セッション処理メカニズムを利用できるソースパッチを受け入れる可能性が高いと私は思っています。

セッション情報の標準的な場所は、共有メモリ、ファイル、データベースです。私はsocketioがあなたのWebフレームワーク(またはページを構成するもの)と同じメカニズムを使用するような方法でロジックを変更することをお勧めします。ここでの例で

+0

返信いただきありがとうございます!それは解決策ではありませんが、私はあなたの情報の賞金を引き続き授与します。私は実際の解決策を待つつもりですが、あなたの返信は私が問題をもっと理解するのを助けました。私はあなたが提案したようにrequest_tokensを置き換えることによって解決することになると確信しています。お返事をありがとうございます! – moodh

+0

2moodh:「あなたのWebフレームワークと同じメカニズムを使用する」という修正を提案しました。だから、この仕組みが何であるか知らなくても書くことは不可能です。 –

+0

私はredisを使用して、作業者とサーバーの間のセッションを維持します。フラスコ(私が使用しているフレームワーク)に特有のものは何もありません。 FlaskにRedisを使用させることは可能かもしれませんが、私はそれをまだ見ていません。 :) – moodh

0

ルック:

https://github.com/abourget/gevent-socketio/tree/master/examples/pyramid_backbone_redis_chat_persistence

それは私が同じ問題を抱えていて、分散メッセージキュー

+0

私は既にアプリケーション自体の内部でredisを使用していますが、正常に動作します。あなたは私の問題を理解していないようです。これは実際の長いポーリングソケットであり、ライブラリ自体の深いところに問題があります。 :) – moodh

0

だけの思考としてのRedisを使用する方法を示します。 gunicornをfork(-wフラグ付き)するのではなく、別のポートにgunicornの複数のプロセスを起動させてから、"upstream" block with "sticky" sessionを使ってnginxを使ってバランスをとることができます。 Redisと状態を共有していないときにnodejs実装がワーカーのマルチプロセッシングをどのように処理するかは、私が信じています。

関連する問題