Antarmuka Penerbit/Pelanggan Kustom

Untuk menambahkan dukungan untuk penerbit/pelanggan kustom, Anda perlu mengimplementasikan antarmuka message.Publisher dan message.Subscriber.

Kode sumber lengkap: github.com/ThreeDotsLabs/watermill/message/pubsub.go

// ...
type Publisher interface {
    // Publish menerbitkan pesan yang disediakan ke topik yang ditentukan.
    //
    // Publish dapat dieksekusi secara sinkron atau asinkron, tergantung pada implementasinya.
    //
    // Sebagian besar implementasi penerbit tidak mendukung penerbitan pesan atomik.
    // Ini berarti jika satu pesan gagal untuk diterbitkan, pesan berikutnya tidak akan diterbitkan.
    //
    // Publish harus aman untuk penggunaan dalam thread.
    Publish(topic string, messages ...*Message) error
    // Jika penerbitnya asinkron, Close harus membuang pesan yang belum dikirim.
    Close() error
}

// Subscriber adalah bagian pengonsumsi dari penerbit/pelanggan.
type Subscriber interface {
    // Subscribe mengembalikan saluran keluaran untuk pesan yang diterima dari topik yang disediakan.
    // Saluran akan ditutup ketika Close() dipanggil pada pelanggan.
    //
    // Untuk menerima pesan berikutnya, Ack() harus dipanggil pada pesan yang diterima.
    // Jika pemrosesan pesan gagal dan pesan harus dikirim ulang, harus dipanggil Nack().
    // 
    // Ketika ctx yang diberikan dibatalkan, pelanggan akan menutup langganan dan saluran keluaran.
    // ctx yang diberikan diatur pada semua pesan yang dihasilkan.
    // Ketika Nack atau Ack dipanggil pada pesan, konteks pesan tersebut dibatalkan.
    Subscribe(ctx context.Context, topic string) (

Daftar Tugas

Berikut adalah beberapa hal yang tidak boleh Anda lupakan:

  1. Logging (pesan yang baik dan tingkat yang sesuai).
  2. Pemutar ulang dan pengkode pesan yang dapat dikonfigurasi.
  3. Implementasi Close() untuk penerbit dan pelanggan harus:
    • Idempoten
    • Dapat bekerja dengan benar ketika penerbit atau pelanggan terblokir (misalnya, menunggu Ack)
    • Dapat bekerja dengan benar ketika saluran keluaran pelanggan terblokir (karena tidak ada yang mendengarkannya)
  4. Mendukung Ack() dan Nack() untuk pesan yang dikonsumsi.
  5. Mendukung pengiriman ulang pesan yang dikonsumsi menggunakan Nack().
  6. Gunakan pengujian penerbit/pelanggan generik. Anda harus merujuk ke panduan perbaikan masalah pengujian untuk tips debugging.
  7. Optimisasi kinerja.
  8. GoDocs, dokumentasi Markdown, dan contoh pengantar.