Penerbit
Kode sumber lengkap: github.com/ThreeDotsLabs/watermill/message/pubsub.go
// ...
type Publisher interface {
// Publish menerbitkan pesan yang diberikan ke topik yang diberikan.
//
// Penerbitan dapat bersifat sinkron atau asinkron - itu tergantung pada implementasinya.
//
// Sebagian besar implementasi penerbit tidak mendukung penerbitan pesan atomik.
// Ini berarti bahwa jika penerbitan salah satu pesan gagal, pesan berikutnya tidak akan diterbitkan.
//
// Publish harus aman dalam thread.
Publish(topic string, messages ...*Message) error
// Jika penerbitnya asinkron, Close harus membuang pesan yang belum terkirim.
Close() error
}
// ...
Menerbitkan Beberapa Pesan
Sebagian besar implementasi penerbit tidak mendukung penerbitan pesan atomik. Ini berarti bahwa jika penerbitan salah satu pesan gagal, pesan berikutnya tidak akan diterbitkan.
Menerbitkan Secara Asynchronous
Penerbitan dapat bersifat sinkron atau asinkron - itu tergantung pada implementasinya.
Close()
Jika penerbitnya asinkron, Close
harus membuang pesan yang belum terkirim. Jangan lupa untuk menutup pelanggan. Sebaliknya, Anda mungkin kehilangan beberapa pesan.
Pelanggan
Kode sumber lengkap: github.com/ThreeDotsLabs/watermill/message/pubsub.go
// ...
type Subscriber interface {
// Subscribe mengembalikan saluran keluaran dengan pesan dari topik yang diberikan.
// Saluran akan ditutup ketika Close() pada pelanggan dipanggil.
//
// Untuk menerima pesan berikutnya, `Ack()` harus dipanggil pada pesan yang diterima.
// Jika pemrosesan pesan gagal dan pesan harus dikirim ulang, `Nack()` harus dipanggil.
//
// Saat ctx yang diberikan dibatalkan, pelanggan akan menutup langganan dan menutup saluran keluaran.
// Konteks yang diberikan diatur ke semua pesan yang dihasilkan.
// Saat Ack atau Nack dipanggil pada pesan, konteks pesan akan dibatalkan.
Subscribe(ctx context.Context, topic string) (
}
Mekanisme Ack/Nack
Pelanggan bertanggung jawab untuk menangani Ack
dan Nack
dari pesan. Implementasi yang tepat harus menunggu Ack
atau Nack
sebelum mengonsumsi pesan berikutnya.
Tips implementasi pelanggan penting: Sangat penting untuk mengirim Ack/offset ke penyimpanan/agen pesan setelah Ack dari pesan Watermill. Kecuali, jika proses mati sebelum memproses pesan, ada kemungkinan kehilangan pesan.
Close()
Close
akan menutup semua langganan dan saluran keluarannya, dan membuang offset jika diperlukan.
Setidaknya Pengiriman Sekali
Watermill dibangun menggunakan semantik setidaknya sekali pengiriman. Ini berarti bahwa jika terjadi kesalahan saat memproses pesan dan tidak mungkin untuk mengirimkan Ack
, pesan tersebut akan dikirim ulang.
Anda perlu mengingat ini dan membangun aplikasi Anda untuk memproses idempoten atau menerapkan mekanisme retry.
Sayangnya, membuat middleware retry generik tidak mungkin, jadi kami mendorong Anda untuk membangun implementasi sendiri.
Pengujian Generik
Setiap Pub/Sub mirip dalam sebagian besar aspek. Untuk menghindari menulis pengujian terpisah untuk setiap implementasi Pub/Sub, kami telah membuat rangkaian pengujian yang harus dilalui oleh setiap Pub/Sub.
Pengujian ini dapat ditemukan di pubsub/tests/test_pubsub.go
.
Implementasi Bawaan
Untuk memeriksa implementasi Pub/Sub yang tersedia, silakan lihat Pub/Sub yang didukung.
Mengimplementasikan Pub/Sub Kustom
Untuk petunjuk tentang memperkenalkan dukungan untuk Pub/Sub baru, silakan liujt "Mengimplementasikan Pub/Sub Kustom".