Yayıncı
Tam kaynak kodu: github.com/ThreeDotsLabs/watermill/message/pubsub.go
// ...
type Publisher interface {
// Publish, verilen mesajları belirtilen konuya yayınlar.
//
// Yayınlama senkron veya asenkron olabilir - uygulamaya bağlıdır.
//
// Çoğu yayıncı uygulaması, atomik mesaj yayınlamayı desteklemez.
// Bu, mesajlardan birinin yayınlanmaması durumunda diğerinin yayınlanmayacağı anlamına gelir.
//
// Yayınlama işlemi çoklu ipliklere karşı güvenli olmalıdır.
Publish(topic string, messages ...*Message) error
// Eğer yayıncı asenkronsa, Close kullanılmamış mesajları gönderebilir.
Close() error
}
// ...
Birden Fazla Mesaj Yayınlama
Çoğu yayıncı uygulaması, atomik mesaj yayınlamayı desteklemez. Bu, eğer mesajlardan birinin yayınlanmaması durumunda diğerinin yayınlanmayacağı anlamına gelir.
Asenkron Yayınlama
Yayınlama işlemi senkron veya asenkron olabilir - uygulamaya bağlıdır.
Close()
Eğer yayıncı asenkronsa, Close
kullanılmamış mesajları gönderebilir. Aboneleri kapatmayı unutmayın. Aksi halde bazı mesajları kaybedebilirsiniz.
Abone
Tam kaynak kodu: github.com/ThreeDotsLabs/watermill/message/pubsub.go
// ...
type Subscriber interface {
// Subscribe, belirtilen konudan gelen mesajlarla çıkış kanalı döndürür.
// Kanal, abone üzerinde Close() çağrıldığında kapanacaktır.
//
// Bir sonraki mesajı almak için alınan mesaj üzerinde `Ack()` çağrılmalıdır.
// Eğer mesaj işleme başarısız olursa ve mesajın yeniden iletilmesi gerekiyorsa, `Nack()` çağrılmalıdır.
//
// Sağlanan ctx iptal edildiğinde, abone aboneliği kapatır ve çıkış kanalını kapatır.
// Sağlanan ctx, tüm oluşturulan mesajlara ayarlanır.
// Ack veya Nack mesajda kullanıldığında, mesajın bağlamı iptal edilecektir.
Subscribe(ctx context.Context, topic string) (
}
Ack/Nack Mekanizması
Aboneler, mesajlardan gelen Ack
ve Nack
işlemlerinden sorumludur. Uygun bir uygulama, bir sonraki mesajı tüketmeden önce Ack
veya Nack
işlemlerinin tamamlanmasını beklemelidir.
Önemli abone uygulama ipucu: Su mesajından Ack aldıktan sonra, Ack/offset'i mesajın depolama/cihazına göndermek son derece önemlidir. Aksi takdirde, mesajın işlenmeden önce işlem ölürse, mesajın kaybolma olasılığı vardır.
Close()
Close
, tüm abonelikleri ve çıkış kanallarını kapatır ve gerekliyse ofsetleri gönderir.
En Az Bir Kez Teslim
Watermill, en az bir kez teslim semantiği kullanılarak oluşturulmuştur. Bu, bir mesajı işlerken bir hata meydana gelirse ve Ack
göndermek mümkün değilse, mesajın yeniden iletilmesi gerekir.
Bu durumu akılda tutmalı ve uygulamanızı idempotent işleme için oluşturmalı veya bir yeniden deneme mekanizması uygulamalısınız.
Maalesef, genel bir yeniden deneme ara yazılımı oluşturmak mümkün değildir, bu yüzden kendi uygulamanızı oluşturmanızı teşvik ederiz.
Genel Test
Her Yayın/Abonelik, çoğu yönüyle benzerdir. Her Yayın/Abonelik uygulaması için ayrı testler yazmaktan kaçınmak için her Yayın/Abonelik uygulamasının geçmesi gereken bir test süiti oluşturduk.
Bu testler, pubsub/tests/test_pubsub.go
içinde bulunabilir.
Dahili Uygulama
Kullanılabilir Yayın/Abonelik uygulamalarını kontrol etmek için lütfen desteklenen Yayın/Aboneliklere başvurun.
Özel Yayın/Abonelik Uygulama
Yeni bir Yayın/Abonelik için destek eklemek için talimatlar için lütfen "Özel Yayın/Abonelik Uygulama" bölümüne başvurun.