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:

  1. Registro (mensagens claras e níveis apropriados).
  2. Codificadores de mensagens substituíveis e configuráveis.
  3. 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).
  4. Suporte para Ack() e Nack() para mensagens consumidas.
  5. Suporte para redistribuição de mensagens consumidas usando Nack().
  6. 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.
  7. Otimização de desempenho.
  8. GoDocs, documentação em Markdown e exemplos introdutórios.