2017-07-04 2 views
0

私のデータベースには2000人以上のユーザーがいますが、すべてのユーザーにメッセージをブロードキャストしようとすると約200リクエストを送信してサーバーが停止し、エラー以下のように:Node.jsからAPIに多くのリクエストを送信するとエラーが発生する

function callSendAPI(messageData) { 
    request({ 
    uri: 'https://graph.facebook.com/v2.6/me/messages', 
    qs: { access_token: '#####' }, 
    method: 'POST', 
    json: messageData 

    }, function (error, response, body) { 
    if (!error && response.statusCode == 200) { 
     var recipientId = body.recipient_id; 
     var messageId = body.message_id; 

     if (messageId) { 
     console.log("Successfully sent message with id %s to recipient %s", 
      messageId, recipientId); 
     } else { 
     console.log("Successfully called Send API for recipient %s", 
     recipientId); 
     } 
    } else { 
     console.error("Failed calling Send API"); 
     console.log(error) 
    } 
    }); 
} 
:これは私の要求である

Error!: Error: socket hang up 

:たまに

{ Error: connect ETIMEDOUT 31.13.88.4:443 
at Object.exports._errnoException (util.js:1026:11) 
at exports._exceptionWithHostPort (util.js:1049:20) 
at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1090:14) 
code: 'ETIMEDOUT', 
errno: 'ETIMEDOUT', 
syscall: 'connect, 
address: '31.13.88.4', 
port: 443 } 

私は言い、別のエラーが出ます

私はしばらくの間、待機を呼び出すAPIを作るために

setTimeoutを試してみました:彼/彼女は、同様のエラーに直面した場合

setTimeout(function(){callSendAPI(data)},200); 

誰でも助けることができますか?

私は送信APIへの呼び出しの高いレートをサポートし、それが200回のコールと限定されるものではなく、メッセンジャープラットフォームを使用してい

編集しました。

+0

最初にエラーをGoogleで検索してください。https://www.google.com/search?q=ETIMEDOUT+node.js – mplungjan

+1

@mplungjan私はしましたが、http.requestに関連する回答は見つかりませんでした –

+0

q = ETIMEDOUT + node.js + POST + facebook – mplungjan

答えて

-1

レート制限を超えているようです。 Facebook documentationから

アプリが集約で、ユーザーあたり1時間あたり200本の電話をかけることができます。

dashboardをチェックすると、これらの場合にレート制限が適用されているかどうかを確認できます。

+0

ご意見ありがとうございます。Messenger Platformは、Send APIへの呼び出しの速度が高いので、制限はありません。 https://developers.facebook.com/docs/messenger-platform/send-api-reference –

1

あなたはFacebook APIの制限を打つかもしれません。リクエストを抑制するには、前のリクエストから間隔を置いてリクエストを送信する必要があります。あなたはすべてのユーザーに対して繰り返している場所は含めませんでしたが、おそらくループで実行すると思われます。setTimeoutを使用してすべての要求を200ms遅延させて遅延させた場合、すべての要求が同時に実行されます前に - ちょうど200ms後。

何ができることは次のとおりです。

  1. あなたがのsetTimeoutを使用し、すべての要求(推奨されません)のための可変遅延を追加することができます
  2. あなたは(コールバックを使用して)非同期モジュールのseriesparallelLimitを使用することができます
  3. あなたはconcurrency限界(使用約束)

1であるとブルーバードのPromise.mapSeries又はPromise.mapを使用することができ(複雑さを増やさない限り)やはり火災や忘れがちですが、並行性があまりにも高くなりすぎて、依頼が開始された時点を制御するだけで、未処理の要求の数ある。

2と3はほとんど同じですが、コールバックまたは約束を使用して異なります。あなたの例ではコールバックを使用していますが、callSendAPIは、オプション2を動作させたい場合は自分自身のコールバックを取らず、オプション3を動作させたい場合は約束を返すべきです。詳細情報については

は、ドキュメントを参照してください。もちろん

そこにそれを行うにはより多くの方法があるが、それらはほとんどあり簡単。

理想的には、毎時200回のリクエストを完全に利用する場合は、自分でリクエストをキューに入れ、その制限に対応する一定の間隔でリクエストを行う必要があります。場合によっては1時間以内に多くのリクエストをしなかった場合、遅れは必要ありません。ここで実際にすべきことは、すべてのリクエストを集中的にキューに入れ、既に使用されている部分に対応する間隔でキューを空にすることです。

+0

ありがとうございますコメント、メッセンジャープラットフォームは、Send APIへの高い呼び出し速度をサポートしています。制限はありません。 https://developers.facebook.com/docs/messenger-platform/send-api-reference 私は直接グラフAPI、私はメッセンジャーAPIを呼び出す、それはAPI呼び出しのための制限がありません –

関連する問題