Publicador

Código fonte completo: github.com/ThreeDotsLabs/watermill/message/pubsub.go

// ...
type Publicador interface {
	// Publicar publica as mensagens fornecidas no tópico dado.
	//
	// A publicação pode ser síncrona ou assíncrona - depende da implementação.
	//
	// A maioria das implementações de publicadores não oferecem suporte a publicação atômica de mensagens.
	// Isso significa que, se a publicação de uma das mensagens falhar, a próxima não será publicada.
	//
	// A publicação deve ser segura para threads.
	Publicar(tópico string, mensagens ...*Mensagem) error
	// Se o publicador for assíncrono, Fechar deve descartar mensagens não enviadas.
	Fechar() error
}
// ...

Publicação de Múltiplas Mensagens

A maioria das implementações de publicadores não oferecem suporte a publicação atômica de mensagens. Isso significa que, se a publicação de uma das mensagens falhar, a próxima não será publicada.

Publicação Assíncrona

A publicação pode ser síncrona ou assíncrona - depende da implementação.

Fechar()

Se o publicador for assíncrono, Fechar deve descartar mensagens não enviadas. Não se esqueça de fechar os assinantes. Caso contrário, você pode perder algumas mensagens.

Assinante

Código fonte completo: github.com/ThreeDotsLabs/watermill/message/pubsub.go

// ...
type Assinante interface {
	// Inscrever retorna um canal de saída com mensagens do tópico fornecido.
	// O canal será fechado quando Close() for chamado no assinante.
	//
	// Para receber a próxima mensagem, é necessário chamar `Ack()` na mensagem recebida.
	// Se o processamento da mensagem falhar e a mensagem precisar ser redistribuída, é necessário chamar `Nack()`.
	//
	// Quando o ctx fornecido for cancelado, o assinante fechará a inscrição e o canal de saída.
	// O ctx fornecido é atribuído a todas as mensagens geradas.
	// Quando Ack ou Nack é chamado na mensagem, o contexto da mensagem será cancelado.
	Inscrever(ctx context.Context, tópico string) (
}

Mecanismo Ack/Nack

Assinantes são responsáveis por lidar com Ack e Nack das mensagens. Uma implementação adequada deve aguardar Ack ou Nack antes de consumir a próxima mensagem.

Dica importante de implementação de assinante: É crucial enviar Ack/offset para o armazenamento/agente da mensagem após o Ack da mensagem do Watermill. Caso contrário, se o processo falhar antes de processar a mensagem, há a possibilidade de perder a mensagem.

Fechar()

Fechar fechará todas as inscrições e seus canais de saída, e descartará os offsets, se necessário.

Pelo Menos Uma Vez de Entrega

O Watermill é construído usando a semântica de pelo menos uma vez de entrega. Isso significa que, se ocorrer um erro ao processar uma mensagem e não for possível enviar Ack, a mensagem será redistribuída.

É necessário ter isso em mente e desenvolver sua aplicação para processamento idempotente ou implementar um mecanismo de tentativa.

Infelizmente, criar um middleware de tentativa genérico não é possível, então encorajamos você a construir sua própria implementação.

Teste Genérico

Cada Publicador/Assinante é semelhante na maioria dos aspectos. Para evitar escrever testes separados para cada implementação de Publicador/Assinante, criamos uma suíte de testes que qualquer Publicador/Assinante deve passar.

Esses testes podem ser encontrados em pubsub/tests/test_pubsub.go.

Implementação Incorporada

Para verificar as implementações de Publicador/Assinante disponíveis, consulte os Publicadores/Assinantes compatíveis.

Implementação Personalizada de Publicador/Assinante

Para obter instruções sobre como introduzir suporte para um novo Publicador/Assinante, consulte "Implementando Publicador/Assinante Personalizado".