Interface Personalizado de Publicador/Assinante
Para adicionar suporte para um publicador/assinante personalizado, é necessário implementar as interfaces message.Publisher
e message.Subscriber
.
Código-fonte completo: github.com/ThreeDotsLabs/watermill/message/pubsub.go
// ...
type Publisher interface {
// Publish publica as mensagens fornecidas no tópico especificado.
//
// A publicação pode ser executada de forma síncrona ou assíncrona, dependendo da implementação.
//
// A maioria das implementações de publicadores não suporta publicação atômica de mensagens.
// Isso significa que, se uma mensagem não conseguir ser publicada, a próxima mensagem não será publicada.
//
// Publish deve ser thread-safe.
Publish(topic string, messages ...*Message) error
// Se o publicador for assíncrono, Close deve descarregar mensagens não enviadas.
Close() error
}
// O Assinante é a parte consumidora do publicador/assinante.
type Subscriber interface {
// Subscribe retorna um canal de saída para mensagens recebidas do tópico fornecido.
// O canal será fechado quando Close() for chamado no assinante.
//
// Para receber a próxima mensagem, Ack() deve ser chamado na mensagem recebida.
// Se o processamento da mensagem falhar e a mensagem deve ser rediferida, Nack() deve ser chamado.
//
// Quando o ctx fornecido for cancelado, o assinante fechará a assinatura e o canal de saída.
// O ctx fornecido é definido em todas as mensagens geradas.
// Quando o Nack ou Ack é chamado na mensagem, o contexto da mensagem é cancelado.
Subscribe(ctx context.Context, topic string) (
Lista de Tarefas
Aqui estão alguns pontos que não se deve esquecer:
- Registro (mensagens claras e níveis apropriados).
- Codificadores de mensagens substituíveis e configuráveis.
- Implementação de
Close()
para publicadores e assinantes deve ser:- Idempotente
- Capaz de funcionar adequadamente quando o publicador ou assinante está bloqueado (por exemplo, esperando por Ack)
- Capaz de funcionar adequadamente quando o canal de saída do assinante está bloqueado (porque não há ninguém ouvindo).
- Suporte para
Ack()
eNack()
para mensagens consumidas. - Suporte para redistribuição de mensagens consumidas usando
Nack()
. - Utilização de testes genéricos de publicador/assinante. Deve-se consultar o guia de solução de problemas de teste para dicas de depuração.
- Otimização de desempenho.
- GoDocs, documentação em Markdown e exemplos introdutórios.