2017-08-14 3 views
2

Je cherche à utiliser Google Protobuffers pour la messagerie delta. Signification Je veux seulement envoyer les valeurs modifiées de mon objet de domaine.Utilisation de google protobuffer pour les messages delta

Mais cela expose un problème avec le protocole à cet effet. Je peux facilement omettre les propriétés qui n'ont pas changé, et cela nous présentera un message compact.

Mais qu'en est-il des propriétés qui changent la valeur de _something_ à null? Il n'y a aucun moyen de distinguer entre ces deux scénarios dans un tampon de protocole.

Qu'ont fait les autres ici? Je cherche à quelques solutions différentes:

  1. Ajouter une propriété méta à tous les objets, qui est un tableau de int. Dans le cas où l'une des propriétés devrait passer à null, incluez le numéro de champ dans ce tableau. Si aucune propriété ne change, la propriété meta est simplement omise et n'occupe pas la bande passante dans le message.

  2. Ajoutez une propriété meta qui est un masque de bits, mais qui fonctionne comme le tableau mentionné dans l'option 1. Cela peut être plus difficile à comprendre pour les clients.

  3. Utilisez un moyen standard que je n'ai pas encore trouvé.

BR Jay

Répondre

0

Protobuf 3 n'est pas très bien adapté pour cela. Mais dans protobuf 2, vous pouvez avoir un champ qui est présent mais qui a la valeur null.

Parce que protobuf 2 ne va pas disparaître de sitôt, je suggère de l'utiliser pour ce genre de choses.

0

Je voulais juste poster un suivi à ce sujet et expliquer ce que j'ai fait. Comme @jpa a correctement souligné que les protobuffers ne sont pas faits pour delta-compression. Donc, la façon dont je l'ai résolu consistait à utiliser certaines propriétés méta et à me fier à cette convention. J'ai un partenariat étroit avec les personnes qui consomment les données, de sorte que les conventions peuvent être convenues.

  1. valeurs qui sont définies spécifiquement à null

    I ont ajouté un tableau d'int pour les messages. Ce tableau int est vide la plupart du temps et n'a pas d'impact sur la taille du message. Quand une propriété est définie sur null, j'ajouterai la balise de propriété à ce tableau et ainsi indiquer qu'elle a été spécifiquement définie sur null dans cette mise à jour de message.

  2. Les tableaux qui sont vidées

    Cela fonctionne de la même manière que le tableau les valeurs NULL. J'ai ajouté un tableau int aux messages. Ce tableau int est vide la plupart du temps et n'a pas d'impact sur la taille du message. Quand un tableau est vidé, je vais ajouter la balise de propriété à ce tableau et ainsi indiquer qu'il a spécifiquement été vidé cette mise à jour du message.

  3. objets qui sont supprimés

    Pour indiquer qu'un objet a été supprimé, j'ai ajouté une propriété booléenne indiquant que l'objet a été supprimé. Lorsque l'objet est supprimé, je vais mettre cette valeur à true, et sinon null, donc il ne prend pas de place dans le message. Le message résultant est l'identificateur de clé pour cet objet et le booléen indiquant qu'il est supprimé.

Il faut que la convention soit comprise par les clients mais sinon cela fonctionne plutôt bien.