2017-10-16 25 views
0

Je souhaite écrire le dernier enregistrement sur db avec une clé spécifique. Ce serait facile si j'avais un horodatage avec le dossier. Mais j'ai le numéro de séquence de l'enregistrement au lieu de l'horodatage.Ecriture des dernières données sans utilisation d'horodatage

En outre, les numéros de séquence sont remis à 0 après avoir atteint une valeur élevée (2^16). Le numéro de séquence peut cependant être réinitialisé à tout moment même s'il n'atteint pas 2^16.

J'ai la possibilité d'ajouter tous les enregistrements et de lire celui qui a le plus grand numéro de séquence. Mais cela causera des problèmes après une réinitialisation (puisque la réinitialisation peut se produire à tout moment).

L'autre option consiste à utiliser des transactions Lightweight mais je ne suis pas sûr que cela garantisse la simultanéité. Les performances peuvent également être grandement affectées.

Comment puis-je faire cela. J'utilise Cassandra DB.

Répondre

0

Pour la dernière valeur, cela est généralement effectué en conservant le journal des événements et en lisant le premier enregistrement. Vous pouvez toujours générer un nouvel horodatage (ou timeuuid) lorsque vous l'insérez. Quelque chose comme:

CREATE TABLE record (
    id text, 
    bucket text, 
    created timeuuid, 
    info blob, 
    PRIMARY KEY ((id, bucket), created) 
) WITH CLUSTERING ORDER BY (created DESC) 

Alors SELECT * FROM record WHERE id = 'user1' AND bucket = '2017-09-10' LIMIT 1; où seau est « aujourd'hui » pour éviter les partitions devient trop grande. Vous avez 10k écrit par ms par hôte avec timeuuid avant que vous ayez à vous soucier des collisions. Si vous avez une exigence de cohérence linéarisable, vous devrez utiliser des paxos (transactions légères, qui garantiront une utilisation appropriée) ou un système de verrouillage externe comme zookeeper. Dans un système distribué ce genre de chose est plus complexe et vous n'obtiendrez jamais le même débit que vous écrivez normalement.