14

まず、これがすべてを生み出した私の最初の質問です

私はAppceleratorTitaniumを使用してiPhoneアプリ(最終的にはAndroidも)を開発しています。TitaniumのTitanium.Network.TCPSocketオブジェクトを使用して、CouchDBのポートに直接接続しています。AppleSDKのCFSocket/NSStreamクラスを利用していると思います。

接続したら、次のように記述します。

'GET /mydb/_changes?filter=app/myfilter&feed=continuous&gameid=4&heartbeat=30000 HTTP/1.1\r\n\r\n'

ソケットに直接。「永久に」開いたままにし、データベースが更新されてフィルターと変更のリクエストに一致するたびにJSONデータを返します。涼しい。

このようにCouchDBのソケットに直接接続しても大丈夫ですか、それとも代わりにnode.jsへのソケットを開いて、このCouchDBnode.jsモジュールを使用してnode.jsを介してCouchDBプロキシを処理する方がよいでしょうか。 ?

私の主な関心事はパフォーマンスです。私はCouchDBについて十分な経験がなく、ソケットにアクセスして偽のHTTPリクエストを直接渡すことが良い習慣であるかどうかを知ることができません。影響や代替案に関する経験や意見を探しています。

4

1 に答える 1

13

また私です。:-)

CouchDBは、それが記述された言語であるErlangから超同時実行処理を継承します。Erlangは軽量プロセスとそれらのプロセス間のメッセージパッシングを使用して、高い同時負荷の下で優れたパフォーマンスを実現します。すべてのCPUコアも利用します。

Nodejsは単一のプロセスを実行し、基本的にそのプロセス内で一度に1つのことだけを実行します。そのイベントベースの非ブロッキングIOアプローチでは、IOのチャンクを待機している間、マルチタスクを実行できますが、それでも一度に1つのことしか実行しません。

どちらも数万の接続を簡単に処理できるはずですが、CouchDBはNodeよりも並行性をより適切に(そしてより少ない労力で)処理できると思います。また、ノードをCouchDBの前に配置すると、ノードに遅延が追加されることに注意してください。ただし、これは、別のマシンにある場合にのみ顕著になる可能性があります。

TCPSocketを介してCouchに直接書き込むことは、仕様に従った整形式のHTTPリクエストを書き込む限り問題ありません。(偽のリクエストを渡していない...これは、他のリクエストと同じように送信している実際のHTTPリクエストです。)

注:HTTP 1.1では、リクエストにHostヘッダーを含める必要があるため、それを反映するようにコードを修正するか、単純にするためにHTTP1.0を使用する必要があります。(なぜTitanium.Network.HTTPClientを使用していないのか知りたいのですが、リクエストが終了した後などにのみリクエストの本文が表示されますか?)

とにかく、CouchDBは直接接続を完全に処理でき、ノードプロキシに多大な労力を費やさない限り、一度に10万人のユーザーがゲームをプレイすることで、ユーザーのエクスペリエンスが向上する可能性があります。

編集:Nodeを使用する場合は、実際のHTTPプロキシを記述します。これは、提供したモジュールを使用するよりもはるかに高速に実行され、実装が簡単になります。(Couchにリクエストを送信する独自​​のAPIを定義するのではなく、セキュリティ上の理由から、特定のリクエストをCouchDBに渡して、他のリクエストをブロックすることができます。

また、「マルチノード」がどのように機能するかを確認してください: http ://www.sitepen.com/blog/2010/07/14/multi-node-concurrent-nodejs-http-server/

于 2010-09-01T17:26:02.033 に答える