2

JSON データを返す Node.js RESTful API があります。API 呼び出しの 1 つが終了するまでに 10 ~ 20 秒かかることがあります (頻繁に発生します)。この長い RTT は、DiffBot、MailChimp、Facebook、Twitter などの外部 API に接続しているためです。API 呼び出しを短くできればいいのですが、できません。

もちろん、私はノード コードを適切な非同期方法で実装しましたが、問題は、サーバーが終了するのを待っている間、クライアントの (ノード アプリへの) インバウンド接続が有効であるため、パフォーマンスが低下する可能性があることです。実際、これがnode での長時間実行タイムアウトの問題を説明している可能性があると現在推測しています。

私はすでに maxSockets を膨大な数に増やしました...

require('http').globalAgent.maxSockets = 9999;

興味を引くために、新しい接続が確立されるたびにアクティブなソケットを出力しています (ここにコードがあります)。

次のような出力が得られます。

SOCKETS: {} { 'graph.facebook.com:443': 5, 'api.instagram.com:443': 1 }

そこにはあまりにも啓発的なものはありません。これまでに見た最大接続数は、すべてのホストで合計約 20 程度です。しかし、これは、着信接続について、またはそれらを最適化して、一度に多数の接続が存在する場合にサーバーが詰まらないようにする方法については何も教えてくれません (私はそうであると思います)。

4

1 に答える 1

0

コードだけでなく、アーキテクチャを最適化する必要があります。

まず、クライアント/サーバーが相互にやり取りする方法を変更します。サーバーは、受信時にリクエストを終了し、そのリクエストのすべてのタスクが本当に完了したら、クライアントに通知する必要があります。

それを達成するためのさまざまな方法があります。たとえば、クライアントは X 秒ごとに AJAX (ポーリング) を使用してリクエストの統計を照会できます。もう 1 つの例は、WebSocket を使用することです。

このアプローチを使用する場合は、Socket.IOを調べてください。同じ API で多くのトランスポートをサポートします。WebSocket が利用可能な場合はそれを使用します。それ以外の場合は、Flash Socket、ロングポーリングなどの他のトランスポートにフォールバックします。

第 2 に、このすべての作業を 1 つのプロセスで行うべきではありません。キュー (できればキューをサポートするメッセージング システム) を使用してから、ワーカー (個別のプロセス) を実行して「重い作業」を行う必要があります。

個人的には、機能と移植性 (オープン標準) のために AMQP を使用していますが、永続的なバックエンドを備えた他のキュー システムを自由に使用できます。

そうすれば、1 つ以上のプロセスがクラッシュし、適切なキューを使用しても、データ (言及した API タスクなど) が失われることはありません。

それが役に立てば幸い。

于 2012-11-16T03:53:09.697 に答える