Interface personnalisée Éditeur/Abonné

Pour ajouter la prise en charge de l'interface Éditeur/Abonné personnalisée, vous devez implémenter les interfaces message.Éditeur et message.Abonné.

Code source complet : github.com/ThreeDotsLabs/watermill/message/pubsub.go

// ...
type Éditeur interface {
    // Publish publie les messages fournis sur le sujet spécifié.
    //
    // La publication peut être exécutée de manière synchrone ou asynchrone, en fonction de l'implémentation.
    //
    // La plupart des implémentations d'éditeur ne prennent pas en charge la publication de messages atomiques.
    // Cela signifie que si la publication d'un message échoue, le message suivant ne sera pas publié.
    //
    // Publish doit être thread-safe.
    Publish(topic string, messages ...*Message) error
    // Si l'éditeur est asynchrone, Close doit vider les messages non envoyés.
    Close() error
}

// L'Abonné est la partie consommant de l'éditeur/abonné.
type Abonné interface {
    // Subscribe renvoie un canal de sortie pour les messages reçus du sujet fourni.
    // Le canal se fermera lorsque Close() est appelé sur l'abonné.
    //
    // Pour recevoir le message suivant, Ack() doit être appelé sur le message reçu.
    // Si le traitement du message échoue et que le message doit être redistribué, Nack() doit être appelé.
    //
    // Lorsque le ctx fourni est annulé, l'abonné fermera l'abonnement et le canal de sortie.
    // Le ctx fourni est défini sur tous les messages générés.
    // Lorsque Nack ou Ack est appelé sur le message, le contexte du message est annulé.
    Subscribe(ctx context.Context, topic string) (

Liste de tâches

Voici quelques points à ne pas oublier :

  1. Journalisation (bons messages et niveaux appropriés).
  2. Encodeurs de messages remplaçables et configurables.
  3. Implémentation de Close() pour les éditeurs et les abonnés devrait être :
    • Idempotente
    • Capable de fonctionner correctement lorsque l'éditeur ou l'abonné est bloqué (par exemple, en attendant l'Ack)
    • Capable de fonctionner correctement lorsque le canal de sortie de l'abonné est bloqué (parce qu'il n'y a personne qui l'écoute)
  4. Prise en charge d'Ack() et Nack() pour les messages consommés.
  5. Prise en charge de la redistribution des messages consommés en utilisant Nack().
  6. Utilisez des tests généraux pour les éditeurs/abonnés. Vous devriez vous référer au guide de dépannage des tests pour des conseils de débogage.
  7. Optimisation des performances.
  8. GoDocs, documentation Markdown et exemples d'introduction.