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".