Editore
Codice sorgente completo: github.com/ThreeDotsLabs/watermill/message/pubsub.go
// ...
type Publisher interface {
// Publish pubblica i messaggi forniti nell'argomento specificato.
//
// La pubblicazione può essere sincrona o asincrona, a seconda dell'implementazione.
//
// La maggior parte delle implementazioni dell'editore non supporta la pubblicazione atomica dei messaggi.
// Ciò significa che se la pubblicazione di uno dei messaggi fallisce, il successivo non verrà pubblicato.
//
// La pubblicazione deve essere thread-safe.
Publish(topic string, messages ...*Message) error
// Se l'editore è asincrono, Close dovrebbe svuotare i messaggi non inviati.
Close() error
}
// ...
Pubblicazione di Più Messaggi
La maggior parte delle implementazioni dell'editore non supporta la pubblicazione atomica dei messaggi. Ciò significa che se la pubblicazione di uno dei messaggi fallisce, il successivo non verrà pubblicato.
Pubblicazione Asincrona
La pubblicazione può essere sincrona o asincrona, a seconda dell'implementazione.
Close()
Se l'editore è asincrono, Close
dovrebbe svuotare i messaggi non inviati. Non dimenticare di chiudere i sottoscrittori. Altrimenti, potresti perdere alcuni messaggi.
Sottoscrittore
Codice sorgente completo: github.com/ThreeDotsLabs/watermill/message/pubsub.go
// ...
type Subscriber interface {
// Subscribe restituisce un canale di output con messaggi dall'argomento fornito.
// Il canale verrà chiuso quando verrà chiamato Close() sul sottoscrittore.
//
// Per ricevere il prossimo messaggio, è necessario chiamare `Ack()` sul messaggio ricevuto.
// Se il processo di elaborazione del messaggio fallisce e il messaggio deve essere nuovamente consegnato, bisogna chiamare `Nack()`.
//
// Quando il contesto fornito viene annullato, il sottoscrittore chiuderà la sottoscrizione e il canale di output.
// Il contesto fornito viene impostato su tutti i messaggi generati.
// Quando viene chiamato Ack o Nack sul messaggio, il contesto del messaggio verrà annullato.
Subscribe(ctx context.Context, topic string) (
}
Meccanismo di Ack/Nack
I sottoscrittori sono responsabili del trattamento di Ack
e Nack
dai messaggi. Una corretta implementazione dovrebbe attendere Ack
o Nack
prima di consumare il messaggio successivo.
Importante suggerimento sull'implementazione del sottoscrittore: è cruciale inviare Ack/offset allo storage/agent dei messaggi dopo l'Ack dal messaggio di Watermill. Altrimenti, se il processo muore prima di elaborare il messaggio, c'è la possibilità di perdere il messaggio.
Close()
Close
chiuderà tutte le sottoscrizioni e i relativi canali di output e, se necessario, svuoterà gli offset.
Almeno Una Volta la Consegna
Watermill è costruito utilizzando la semantica di almeno una volta la consegna. Ciò significa che se si verifica un errore durante l'elaborazione di un messaggio e non è possibile inviare Ack
, il messaggio verrà nuovamente consegnato.
È necessario tenere presente questo e costruire l'applicazione per un'elaborazione idempotente o implementare un meccanismo di riprova.
Sfortunatamente, non è possibile creare un middleware di riprova generico, quindi vi incoraggiamo a costruire la vostra implementazione.
Test Generico
Ogni pubblicazione/sottoscrizione è simile per la maggior parte degli aspetti. Per evitare di scrivere test separati per ciascuna implementazione di pubblicazione/sottoscrizione, abbiamo creato un insieme di test che ogni pubblicazione/sottoscrizione dovrebbe superare.
Questi test possono essere trovati in pubsub/tests/test_pubsub.go
.
Implementazione Integrata
Per verificare le implementazioni disponibili di pubblicazione/sottoscrizione, fare riferimento alla pubblicazione/sottoscrizione supportata.
Implementazione di Pubblicazione/Sottoscrizione Personalizzata
Per istruzioni su come introdurre il supporto per una nuova pubblicazione/sottoscrizione, fare riferimento a "Implementazione di Pubblicazione/Sottoscrizione Personalizzata".