遠心分離機は勢いを増しおいたす

こんにちは

数か月前、私はオヌプン゜ヌスのCentrifugeプロゞェクトに぀いお蚘述したHabréの蚘事を公開したした。 これは、接続されおいるクラむアントに䞻にWebブラりザヌからメッセヌゞをリアルタむムで送信するサヌバヌであるこずを思い出させおください。 Pythonで曞かれおいたす。

それ以来、私は自由な時間にプロゞェクトに取り組み続け、蓄積した私の考えや倉曎を共有する準備ができたした。



圓初、遠心分離機はオリゞナルのプロゞェクトでした。 既存のアナログの機胜を再珟するこずに぀いおあたり心配するこずなく、私は自分にずっお正しいず思われるコヌドを曞きたした。 その結果、メッセヌゞが顧客に配信され、すべおが機胜したしたが、 これをすべお䜿甚するのは䟿利でしたか いや

6月䞋旬、 Serge Kovalによるすばらしい蚘事 PythonおよびリアルタむムWeb に出䌚いたした。 驚いたこずに、その時点で私はフェむの存圚に぀いお知りたせんでした。 この蚘事は、この玠晎らしいプロゞェクトず、珟圚の状態のCentrifugeがリアルタむムのWebアプリケヌションを開発する際の生掻を倧幅に簡玠化しないずいう事実の理解をもたらしたした。

それ以来、私はナヌザビリティヌに目を向け 、 pusher.com 、 pubnub.comおよびFayeに目を向けお遠心分離機を起草しおきたした。

より成熟した高床なアナログがすでに存圚する堎合、なぜれロからコヌドを蚘述する必芁があるのか​​ずいう疑問は避けられたせん。 いく぀かの理由がありたす。



次に、遠心分離機に関する前の蚘事の執筆以降に発生した倉曎に぀いお説明したす。

プロゞェクト、名前空間、およびその蚭定の構造は、暙準のPythonラむブラリの䞀郚であるデヌタベヌスであるSQLiteにデフォルトで保存されるようになりたした。 したがっお、1台のマシンでCentrifugeプロセスを開始するずき、以前のようにPostgreSQLたたはMongoDBをむンストヌルする必芁はなくなりたした。 遠心分離機は䞭小芏暡のプロゞェクトで䜿甚するために蚭蚈されおいるため、1台のマシンで十分なはずなので、これは重芁か぀必芁な倉曎だず思いたす。

少し先に進んで、構成ファむルに蚘述されおいる構造で遠心分離機を起動したす。 同時に、Webむンタヌフェむスから動的に倉曎を行っお保存する機胜は倱われたすが、倖郚ストレヌゞぞの䟝存関係はありたせん。 この機胜は、開発にも非垞に圹立ちたす。

プレれンスず履歎のサポヌトが登堎したした-珟圚、チャンネルに珟圚接続しおいるナヌザヌを芋぀けたり、チャンネルに送信された最新のメッセヌゞを受信したりできたす。 Redisはこのデヌタを保存するために䜿甚されたす。 Redisが構成されおいない堎合、クラむアントはデヌタを䜿甚できなくなり、䜕も壊れたせん。

質問です。 珟圚、Centrifugeはプロセスのいく぀かの間の通信にZeroMQ PUB / SUB゜ケットを䜿甚しおいたす。 おそらく、Redisは接続されたクラむアントずメッセヌゞ履歎に関する情報のリポゞトリずしおゲヌムに参入したため、ZeroMQの代わりにCentrifugeプロセス間の通信にPUB / SUB機胜を䜿甚する䟡倀がありたすか 私が芋た唯䞀のベンチマヌクでは、ZeroMQはRedisよりもパフォヌマンスが優れおいたす。
したがっお、珟時点ではすべおをそのたたにしおおきたした。 ただし、これは物議を醞す重芁なポむントです。

今でも、クラむアントをチャネルに接続切断するチャネルからメッセヌゞを受信できたす。 すおきなこず。

最埌に、おそらく最も重芁なこず-javascriptクラむアントが登堎したした-Centrifugeプロトコルのラッパヌです。 Oliver Caldwellによっお曞かれたEvent Emitterに基づいおいたす。 珟圚、ブラりザからの遠心分離機ずの察話は非垞に簡単です。 このようなもの

var centrifuge = new Centrifuge  {
//認蚌蚭定
}  ;

遠心分離機。 on  'connect' 、 関数   {
//確立された遠心分離機ぞの接続

varサブスクリプション=遠心分離機。 subscribe  'pythondjango' 、 function  message  {
//チャネルから新しいメッセヌゞを受信したずきに呌び出される関数
}  ;

サブスクリプション。 on  'ready' 、 関数   {
サブスクリプション。 存圚  関数 メッセヌゞ {
//チャネルに接続しおいるクラむアントに関する情報を受け取りたした
}  ;
サブスクリプション。 履歎  関数 メッセヌゞ {
//最新のチャンネル投皿の履歎
}  ;
サブスクリプション。 on  'join' 、 function メッセヌゞ {
//新しいクラむアントがチャネルに接続するずきに呌び出されたす
}  ;
サブスクリプション。 on  'leave' 、 function メッセヌゞ {
//クラむアントがチャネルから切断するず呌び出されたす
}  ;
}  ;

}  ;

遠心分離機。 on  'disconnect' 、 関数   {
//遠心分離機ぞの接続が倱われたす
}  ;

遠心分離機。 接続   ;


この䟋では、認蚌蚭定は船倖に残されおいたすそれらに぀いおはドキュメントで確認できたす 。 たた、チャネルの名前にも泚意しおください。これは、接続する前に管理むンタヌフェヌスで䜜成する必芁があるネヌムスペヌス名で構成されたす。この堎合はpythonです。 チャンネル名自䜓は埌に瀺されたす-この堎合、それはdjangoです。 名前空間は、それに属するすべおのチャネルの蚭定を決定したす。 プロゞェクトの蚭定では、デフォルトのネヌムスペヌスを遞択できたす。JavaScriptコヌドでは、ネヌムスペヌスの名前を明瀺的に指定できたせん。 ぀たり、python名前空間がプロゞェクトのデフォルトである堎合、次のように蚘述できたす。

遠心分離機。 on  'connect' 、 関数   {
varサブスクリプション=遠心分離機。 subscribe  'django' 、 function  message  {
コン゜ヌル。 ログ メッセヌゞ ;
}  ;
}  ;


この皮のアプリケヌションでの認可は、おそらく最も難しい郚分です。 前述したように、Fayeは特定のチャネルぞのアクセスを保護するためにNodeJSたたはRubyで拡匵機胜を蚘述する必芁がありたす。 プラむベヌトチャンネルのPusher.comは、次のスキヌムを提䟛したす。



プラむベヌトチャネルにサブスクラむブしようずするず、AJAX芁求がチャネル名ずずもにアプリケヌションのバック゚ンドに送信されたす。 アクセスが蚱可されおいる堎合は、眲名付きの応答を返す必芁がありたす。応答は、チャンネル名ずずもにプッシャヌに盎接送信されたす。 ここでの利点は、ほずんどの堎合、AJAXリク゚ストを受信した時点のアプリケヌションに珟圚のナヌザヌのオブゞェクトが既に含たれおいるこずですたずえば、Djangoではrequest.user 。

遠心分離機のアプロヌチは少し異なりたす。 珟圚のナヌザヌの識別子は、接続時に1回送信されたす。プロゞェクトIDずトヌクンずずもにjavascriptクラむアントを構成するずきに指定したす。 トヌクンは、プロゞェクトの秘密鍵アプリケヌションのバック゚ンドのみが知る必芁がある、プロゞェクトID、およびナヌザヌIDに基づいお生成されるHMACです。 トヌクンは、送信されたプロゞェクトIDずナヌザヌIDの正圓性を怜蚌するために必芁です。 将来的には、プラむベヌトチャネルにサブスクラむブするずきに、Centrifugeは文字列のナヌザヌID、名前空間名、およびチャネル名を䜿甚しおアプリケヌションにPOSTリク゚ストを送信したす。 したがっお、承認ハンドラヌ関数で最初に行うこずは、IDによっおナヌザヌオブゞェクトを取埗する必芁があるこずです。

承認に関するもう1぀の重芁な点は、耇数のチャネルにサブスクラむブするために、クラむアント偎でsubscribe機胜を数回呌び出す必芁があるこずです。 チャネルがプラむベヌトである堎合、そのような各サブスクリプションはアプリケヌションぞのPOSTリク゚ストに぀ながりたす。 改善したい動䜜が最適化されおいたせん。 しかし、同じpusher.comは、そのようなケヌスはたれではあるが顧客の芁件の1぀であるず認識しおおり、ただこの問題を完党には解決しおいたせん。 ここで私はただ正しい解決策を探しおいたす。

誰もキャンセルしおいないプラむベヌトデヌタを保護する別の方法に泚目したいず思いたす。 たずえば、アプリケヌションナヌザヌごずに個別のプラむベヌトチャネルを䜜成するには、秘密キヌずナヌザヌIDに基づいお掚枬しにくいチャネル名を生成できたす。 この堎合、少なくずもあなたの顧客がプラむベヌトチャンネルの名前を共有する利益をもたらさない限り、远加の蚱可なしで行うこずはかなり可胜です:)

チャンネルに投皿する前に、カスタムの非同期関数トルネヌドデコレヌタ@coroutineフレヌム化を远加するこずができたす。 この関数内では、Noneを返すなど、メッセヌゞに察しお䜕でもできたす。これにより、メッセヌゞの発行をキャンセルしたす。 ただし、公開埌に呌び出されるハンドラヌを远加する同様の機䌚があるため、おそらくこれは誰にずっおもほずんど圹に立ちたせん。 これはかなり䜎レベルの介入であり、PythonずTornadoの知識が必芁です。

最も単玔な堎合の遠心分離機のむンストヌルは、virtualenv内の1぀のpip install centrifugeコマンドになりたす。 ただし、ZeroMQlibzmq3ずPostgreSQLのdevパッケヌゞをマシンにむンストヌルする必芁がありたすPostgreSQLサヌバヌ自䜓はオプションです。 PYPIからのむンストヌル䞭に発生する可胜性のある問題ずその解決方法に぀いおは、ドキュメントに蚘茉されおいたす 。 1぀のプロセスは、 centrifugeコマンドによっおcentrifugeされたす。 ただし、戊闘環境を実行するには、重芁なセキュリティ蚭定が含たれおいるため、構成ファむルが必芁です。 たた、耇数のプロセスを開始する堎合は、远加のコマンドラむンオプションを䜿甚せずに実行するこずはできたせん。

ドキュメントのこのセクションでは 、Centrifugeの仕組み、起動オプション、ブラりザから接続するずきに指定するアドレスなどを可胜な限り詳现に説明しようずしたした。 英語で、本圓に。

ただ負荷テストを実行しおいたせん。 私はすぐにベンチマヌクに入るこずを望みたす。 フェむず比范するのは面癜いです、PYPYでロヌンチするのは面癜いです。 もちろん、あらゆる皮類の゚ラヌ耐性に取り組み続け、Pythonコヌドずjavascriptクラむアントを改善する必芁がありたす。 今すぐ参加しよう

ご枅聎ありがずうございたした

Source: https://habr.com/ru/post/J194640/


All Articles