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 :
- Journalisation (bons messages et niveaux appropriés).
- Encodeurs de messages remplaçables et configurables.
- 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)
- Prise en charge d'
Ack()
etNack()
pour les messages consommés. - Prise en charge de la redistribution des messages consommés en utilisant
Nack()
. - 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.
- Optimisation des performances.
- GoDocs, documentation Markdown et exemples d'introduction.