web-dev-qa-db-fra.com

Qu'est-ce que la clé de partition dans AWS Kinesis?

Je lisais sur AWS Kinesis. Dans le programme suivant, j'écris des données dans le flux nommé TestStream. J'ai exécuté ce morceau de code 10 fois, en insérant 10 enregistrements dans le flux.

var params = {
    Data: 'More Sample data into the test stream ...',
    PartitionKey: 'TestKey_1',
    StreamName: 'TestStream'
};

kinesis.putRecord(params, function(err, data) {
   if (err) console.log(err, err.stack); // an error occurred
   else     console.log(data);           // successful response
});

Tous les enregistrements ont été insérés avec succès. Qu'est-ce que partition key signifie vraiment ici? Que fait-il en arrière-plan? J'ai lu son documentation mais je n'ai pas compris ce que cela signifiait.

24
Suhail Gupta

Les clés de partition ne comptent que lorsque vous avez plusieurs fragments dans un flux (mais ils sont toujours requis). Kinesis calcule le hachage MD5 d'une clé de partition pour décider sur quel fragment pour stocker l'enregistrement (si vous décrivez le flux, vous verrez la plage de hachage dans le cadre de la description des fragments).

Alors, pourquoi est-ce important?

Chaque fragment ne peut accepter que 1 000 enregistrements et/ou 1 Mo par seconde (voir PutRecord doc). Si vous écrivez sur un seul fragment plus rapidement que ce taux, vous obtiendrez un ProvisionedThroughputExceededException.

Avec plusieurs fragments, vous modifiez cette limite: 4 fragments vous donne 4 000 enregistrements et/ou 4 Mo par seconde. Bien sûr, il y a des mises en garde.

Le plus important est que vous devez utiliser différentes clés de partition. Si tous vos enregistrements utilisent la même clé de partition, vous écrivez toujours sur un seul fragment, car ils auront tous la même valeur de hachage. La façon dont vous résolvez cela dépend de votre application: si vous écrivez à partir de plusieurs processus, il peut être suffisant d'utiliser l'ID de processus, l'adresse IP du serveur ou le nom d'hôte. Si vous écrivez à partir d'un seul processus, vous pouvez soit utiliser les informations contenues dans l'enregistrement (par exemple, un ID d'enregistrement unique) ou générer une chaîne aléatoire.

La deuxième mise en garde est que la clé de partition compte par rapport à la taille d'écriture totale et est stockée dans le flux. Ainsi, bien que vous puissiez probablement obtenir un bon caractère aléatoire en utilisant un composant textuel dans l'enregistrement, vous perdriez de l'espace. D'un autre côté, si vous avez un composant textuel aléatoire, vous pouvez calculer votre propre hachage à partir de celui-ci, puis le stringifier pour la clé de partition.

Enfin, si vous utilisez PutRecords (ce que vous devriez, si vous écrivez beaucoup de données), les enregistrements individuels de la demande peuvent être rejetés tandis que d'autres sont acceptés. Cela se produit car ces enregistrements sont allés à un fragment qui était déjà à ses limites d'écriture, et vous devez les renvoyer (après un certain délai).

35
kdgregory

La réponse acceptée explique ce que sont les clés de partition et à quoi elles servent dans Kinesis (pour décider à quel fragment envoyer les données). Malheureusement, cela n'explique pas pourquoi les clés de partition sont nécessaires en premier lieu.

En théorie, AWS pourrait créer une clé de partition aléatoire pour chaque enregistrement, ce qui entraînera une propagation presque parfaite.

La vraie raison pour laquelle les partitions sont utilisées est pour "commander/diffuser". Kinesis maintient l'ordre (numéro de séquence) pour chaque fragment.

En d'autres termes, en diffusant X et ensuite Y vers le fragment Z, il est garanti que X sera extrait du flux avant Y (lors de l'extraction des enregistrements de tous les fragments). D'autre part, en diffusant X sur Z1 partagé et ensuite Y sur le fragment Z2, il n'y a aucune garantie sur la commande (lors de l'extraction des enregistrements de tous les fragments). Y peut certainement être tiré avant X.

La capacité de "streaming" d'éclats est utile dans de nombreux cas.

(Par exemple, un service vidéo diffusant un film à un utilisateur en utilisant le nom d'utilisateur et le nom du film comme clé de partition).

(Par exemple, travailler sur un flux d'événements à partir d'un groupe d'utilisateurs et appliquer l'agrégation).

Dans les cas où la commande (streaming) n'est pas requise, la génération d'une clé de partition aléatoire suffira.

0
Tomer