3 votes

Cosmos DB Mongo API Comment gérer la condition "Le taux de demande est grand"

J'ai le code suivant..

async function bulkInsert(db, collectionName, documents) {
  try {
    const cosmosResults = await db.collection(collectionName).insertMany(documents);
    console.log(cosmosResults);
    return cosmosResults
  } catch (e) {
    console.log(e)
  }

}

Si je l'exécute avec un grand tableau de documents, je reçois (comme prévu)

{ MongoError: Message: {"Errors":["Request rate is large"]}
  ActivityId: b3c83c38-0000-0000-0000-000000000000, 
  Request URI: /apps/DocDbApp/services/DocDbServer24/partitions/a4cb4964-38c8-11e6-8106-8cdcd42c33be/replicas/1p/, 
  RequestStats: , SDK: Microsoft.Azure.Documents.Common/1.19.102.5
    at G:\Node-8\NodeExample\node_modules\oracle-movie-ticket-demo\node_modules\mongodb-core\lib\connection\pool.js:596:61
at authenticateStragglers (G:\Node-8\NodeExample\node_modules\oracle-movie-ticket-demo\node_modules\mongodb-core\lib\connection\pool.js:514:16)
at Connection.messageHandler (G:\Node-8\NodeExample\node_modules\oracle-movie-ticket-demo\node_modules\mongodb-core\lib\connection\pool.js:550:5)
at emitMessageHandler (G:\Node-8\NodeExample\node_modules\oracle-movie-ticket-demo\node_modules\mongodb-core\lib\connection\connection.js:309:10)
at TLSSocket. (G:\Node-8\NodeExample\node_modules\oracle-movie-ticket-demo\node_modules\mongodb-core\lib\connection\connection.js:452:17)
at emitOne (events.js:116:13)
at TLSSocket.emit (events.js:211:7)
at addChunk (_stream_readable.js:263:12)
at readableAddChunk (_stream_readable.js:250:11)
at TLSSocket.Readable.push (_stream_readable.js:208:10)
name: 'MongoError',
message: 'Message: {"Errors":["Request rate is large"]}\r\nActivityId: b3c83c38-0000-0000-0000-000000000000, 
Request URI: /apps/DocDbApp/services/DocDbServer24/partitions/a4cb4964-38c8-11e6-8106-8cdcd42c33be/replicas/1p/, RequestStats: , SDK: Microsoft.Azure.Documents.Common/1.19.102.5',
_t: 'OKMongoResponse',
ok: 0,
code: 16500,
errmsg: 'Message: {"Errors":["Request rate is large"]}\r\nActivityId:      b3c83c38-0000-0000-0000-000000000000, 
Request URI: /apps/DocDbApp/services/DocDbServer24/partitions/a4cb4964-38c8-11e6-8106-8cdcd42c33be/replicas/1p/, 
RequestStats: , 
SDK: Microsoft.Azure.Documents.Common/1.19.102.5',
 '$err': 'Message: {"Errors":["Request rate is large"]}\r\nActivityId: b3c83c38-0000-0000-0000-000000000000, 
 Request   URI: /apps/DocDbApp/services/DocDbServer24/partitions/a4cb4964-38c8-11e6-8106-8cdcd42c33be/replicas/1p/, RequestStats: , 
SDK: Microsoft.Azure.Documents.Common/1.19.102.5' }

Il semble qu'environ 165 des 740 enregistrements que je traitais ont été chargés. Tous semblent avoir été affectés d'attributs '_id'.

Est-ce que quelqu'un a une idée de comment gérer cela (ou au moins dire quels enregistrements ont été insérés et lesquels n'ont pas été traités)...

-2voto

Jay Gong Points 11648

Les requêtes avec cosmosdb doivent consommer des RUs. Évidemment, votre demande d'insertion a dépassé le débit RU et le code d'erreur 16500 s'est produit.

Les applications qui dépassent les unités de demande provisionnées pour une collection seront ralenties jusqu'à ce que le taux tombe en dessous du niveau réservé. Lorsqu'une limitation se produit, l'arrière-plan mettra fin préventivement à la demande avec un code d'erreur 16500 - Trop de demandes. Par défaut, l'API pour MongoDB retentera automatiquement jusqu'à 10 fois avant de renvoyer un code erreur Trop de demandes.

Vous pourriez trouver plus d'instructions dans le document officiel.

Vous pourriez suivre les solutions ci-dessous pour essayer de résoudre le problème:

  1. Importer vos données par lots pour réduire le débit.

  2. Ajouter votre propre logique de réexécution dans votre application.

  3. Augmenter le débit réservé pour la collection. Bien sûr, cela augmente vos coûts.

Vous pourriez vous référer à cet article.

J'espère que cela vous aidera.


Mise à jour de la réponse:

Il semble que vos documents ne soient pas directement identifiables. Je pense que l'attribut "_id" qui est automatiquement généré par Cosmos DB ne peut pas déterminer quels documents ont été insérés et lesquels n'ont pas été insérés.

Je vous suggère d'augmenter les paramètres de débit, de vider la base de données et ensuite d'importer les données en masse.

En tenant compte des coûts, veuillez consulter ce document pour définir les RU appropriés.

Ou vous pourriez tester l'opération d'importation en masse localement via Cosmos DB Emulator.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X