11

私が作成したAndroidとiOSのネイティブモバイルアプリケーションがいくつかあり、ホストしているXMPPサーバーに直接接続します。XMPPを介してリアルタイムデータをプッシュおよびプルします。また、いくつかのXMPPXEP拡張機能を使用しています。他の操作については、すべてのモバイルアプリケーションがHTTPRESTインターフェイスを介して消費する同じサーバー上で実行されているdjangoアプリケーションがあります。django側でCeleryとRedisを使用して、いくつかの操作を非同期で実行します(データベースへの大量のバッチ書き込みを実行するなど)。

これはすべてうまく機能し、ダンディです。わーい。

しかし今、私はこれらすべてにWebフロントエンドを書きたいので、私は自分の選択肢を研究し始めました-猫の皮を剥ぐ方法はたくさんあるので、最初にSOコミュニティに確認したいと思いました。

ソケット通信用の統一されたAPIを提供する(つまり、Webソケットのさまざまな実装を試すか、フラッシュにフォールバックする)jsライブラリを用意するというアイデアは、私にとって魅力的です。そのため、SocketIOについて言及します。nodejsサーバーを実行する必要があるという考えは、それほど多くはありませんが(もう1つ学ぶべきことです)、必要な場合は間違いなく実行します。ノードサーバーの代わりにgeventを使用する人もいることを私は知っています。他の人は、スタックの残りの部分に接続する小さなnodejsを作成することにしました。私はおそらくこれを行うでしょう。

もう1つのオプションは、フラッシュフォールバックがないと思うStropheのようなjsXMPPライブラリを使用することです。また、これがサーバーにとって何を意味するのかを調査する必要があります。

コメットとジャンゴの実行方法に関するStackoverflowの回答をいくつか読んだので、いくつかのオプションがあるように思われるのはなぜですか。

質問は:

(フォールバックを使用して)Socket IOの動作を利用したい場合、リアルタイムデータをWebクライアント(XMPPを介してサーバーに供給されている)にプッシュし、Djangoを使用する場合の最善のオプションは何ですか?

更新:私が使用しているXMPPサーバーはejabberdで、 BOSHもサポートしています。Strophe.jsを使用できるため、通信はWebSocketではなく一種の長いポーリングhttp接続を経由することになります。私の知る限り、Websocketsオープンソースライブラリを介したXMPPがいくつかありますが、コミュニティはSocketIOほど活発ではありません。

アップデート2:サポートする必要のあるブラウザは最新のブラウザのみです。これは、Flashフォールバックがそれほど重要ではないことを意味していると思います。これにより、私はstrophe.jsに傾倒しています。

4

4 に答える 4

8

あるノードで手を汚すと、socket.ioのNodeから外れるのがはるかに難しくなることがわかると思います。すぐに使用できるノードには、非常に使いやすいxmppモジュールがあります(https://github.com/astro/node-xmppを参照)。ノードはすべてjavascriptであるため、おそらくすでにそのプログラミングに精通していることを忘れないでください。

個人的には、ノード0.6以降を使用するとメモリリークの問題が発生しました。ノード0.4はこれらの問題なしで動作しました。githubを初めて使用する場合(Nodeで遊ぶ前のように)、ノードサーバーを使用する方法は次のとおりです。

ノードの取得

  1. Linuxボックスとお気に入りのディレクトリにログインします(/と仮定します)
  2. git clone https://github.com/joyent/node.git
  3. cd / node
  4. git tag -l(これにより、利用可能なすべてのバージョンのノードが一覧表示されます)
  5. git checkout v0.6.16(これにより、ノードの0.6.16バージョンがチェックアウトされます。たとえば、メモリに問題がある場合は、v0.4.12に置き換えることができます)
  6. 。/構成、設定
  7. 作る
  8. インストールする

g ++などの特定の開発ツールが必要になりますが、この時点でnodeコマンドが機能します。

xmppなどのノードモジュールのインストール

Nodeには、ほとんどのものがすでに作成されているモジュールがたくさんあります。http://search.npmjs.orgに検索機能があります。または、npmコマンドを使用してシェルからすべてのモジュールに直接アクセスできます。NPMは、ノードモジュールをインストールおよび管理するためのノードツールです。npm search xmppたとえば、入力してすべてのxmppモジュールを検索できます。ノードの基本的なxmppライブラリをインストールするには、次のようにしますnpm install node-xmpp。ちなみに、ほとんどのgithubノードモジュールページには、フロントページのreadmeファイルに説明が含まれています。

ノードを本番環境で実行し続ける

私が最初に始めたとき、これは私を投げました。キャッチされないエラーがある場合、ノードは単に死にます。したがって、次のいずれかを実行できます。1.エラーがまったくないか、すべてキャッチされていることを確認します(ノード自体でもエラーが発生する可能性は低いです)。2。uncaughtExceptionハンドラーを使用してこれらの問題をキャッチします。プログラムではこのようなコードを使用します

process.addListener("uncaughtException", function (err) {
    util.log("Uncaught exception: " + err);
    console.log(err.stack);
    console.log(typeof(this));
    // maybe email me?

});

安全性を高め、永遠に使用する

uncaughtExceptionの問題があっても、本番環境のプログラムが停止する可能性があります。メモリが不足している、segfaults、誰が何を知っているか。そこで、「Forever」と呼ばれるすばらしいNodeモジュールのようなものを使用するのが得策です(https://github.com/nodejitsu/foreverを参照)。入力npm install forever -gして永久にインストールできます。GLOBALノードモジュールディレクトリに永久に配置される-gオプションに注意してください。-gを指定しないと、ノードモジュールが現在の作業ディレクトリに配置されます。次に、次のように入力できます(ノードプログラムがmy_program.jsと呼ばれていると仮定します)。forever start my_program.jsその後、Foreverプログラムは、停止した場合に再起動されることを確認します。

于 2012-05-01T00:52:33.493 に答える
5

strophe.js が行う BOSH ( XEP-0124XEP-0206 )を実行する場合、Flash フォールバックが必要な理由がわかりません。IE7 をサポートする必要がない場合は、strophe.js からCORSを実行できます。また、same-origin のプロキシも必要ありません。IE6 は安全ではないため動作しますが、IE8+ はかろうじて動作する形式の CORS をサポートしています。

Django から XMPP を介してクライアントに情報を取得するには、Django アプリのSleekXMPPなど、お気に入りのPython XMPP ライブラリを使用して、サーバーへのコンポーネント接続 ( XEP-0114 ) を作成します。パフォーマンスのために、その接続が比較的長く存続するように調整します (つまり、クライアント接続ごとに新しい接続を作成しないでください)。必要に応じてプロトコルを送信します。

使用している XMPP サーバーについては言及していません。BOSH をサポートしない XMPP サーバーは少なくなりつつありますが、所有している場合は、BOSH から XMPP へのプロキシとしてPunjabが必要になるか、 Prosodyなどの新しいサーバーに切り替える必要があるかもしれません。

于 2012-04-30T08:08:46.170 に答える
4

まず第一に、完全な開示: 私は PubNub という会社で働いています。

ホステッド双方向メッセージング サービス (IaaS - Infrastructure as a Service と呼ばれることもある) には、検討する価値があると思われるさまざまなものがあります。それらは、Pusher、Firebase、Flotype、PubNub などです。達成したい目的のためにそれらのいずれかを使用できると確信しています。Firebase には、サービスに直接接続する組み込みのデータベースがあります。これは非常に優れた機能ですが、特定のユース ケースにはおそらく役に立たないでしょう (バックエンドに既にデータベースがあると仮定します)。

競合他社についてあまり詳しく話すことはできませんが、Python バックエンドと通信するフロントエンドに JavaScript ライブラリが必要な限り、私たち (PubNub)は両方の言語で非常によく似た API を提供し、同じデータバスで通信します。クラウド。したがって、Python でメッセージを送信し、JavaScript でキャッチすることも、その逆も可能です。バニラの JavaScript API の代わりに使用できる、PubNub でホストされたバージョンの socket.ioも作成しましたが、約 10 行のコードで Django バックエンドに結び付けることができます。

最後に、IaaS (または少なくとも私たち; 他のものについてはよくわかりません) を使用することの良い点は、そのトリッキーなスケーリングの問題を処理することです。100 万人の同時ユーザーに到達し、それらにリアルタイムで何かをプッシュする必要がある場合、それは問題ではないことがわかります。

于 2012-05-01T19:50:14.880 に答える
2

Django と Celery でリアルタイム プッシュも使用しています。最初にアーキテクチャを作成したとき、オプションについても調査しました。最終的には、devops の作業をいじるよりも、アプリを適切に作成することに集中することにしました。任意のアプリと簡単に統合できる、ホストされたリアルタイム プッシュ テクノロジを提供するサービスがいくつかあります。

私はPubNubを選びましたが、これ以上ないほど幸せです。クライアント側の socket.io をサポートし、Django および Celery ワーカーから使用する Python lib を持っています。また、ネイティブ モバイル アプリから使用できる SDK もあります。

私は知っています、あなたはすでに作業用のセットアップを行っています。しかし、現在のセットアップをそのようなホストされたソリューションに置き換えるのにかかる時間は、探しているものに適したソリューションを見つけて実装するのにかかる時間よりも短いと確信しています. また、今後のメンテナンス コストにも注意してください (特に、十分にメンテナンスされていないライブラリを選択した場合)。

確かに、サービスの料金を支払うことになりますが、価格は非常にリーズナブルであり、コロケーションなどの素晴らしい特典を備えた堅実なサービスを利用できます.

私はその会社とは関係ありません。ただの幸せな顧客です。他にも同様のサービスがあります。

于 2012-05-01T09:03:29.327 に答える