واجهة الناشر/المشترك المخصصة
لإضافة دعم لواجهة الناشر/المشترك المخصصة، يجب عليك تنفيذ واجهات message.Publisher
و message.Subscriber
.
الشيفرة الكاملة: github.com/ThreeDotsLabs/watermill/message/pubsub.go
// ...
type Publisher interface {
// Publish يقوم بنشر الرسائل المقدمة إلى الموضوع المحدد.
//
// يمكن تنفيذ Publish بشكل متزامن أو غير متزامن، اعتمادًا على التنفيذ.
//
// معظم تنفيذات الناشر لا تدعم النشر الذري للرسالة.
// هذا يعني أنه إذا فشلت رسالة واحدة في النشر، فلن يتم نشر الرسالة التالية.
//
// يجب أن يكون Publish متزامن مع الخيوط.
Publish(topic string, messages ...*Message) error
// إذا كان الناشر غير متزامن، يجب على Close أن يوشِّح الرسائل غير المرسلة.
Close() error
}
// المشترك هو الجزء الاستهلاكي في الناشر/المشترك.
type Subscriber interface {
// Subscribe يعيد قناة الإخراج للرسائل المستلمة من الموضوع المقدم.
// سيتم إغلاق القناة عند استدعاء Close() على المشترك.
//
// لاستقبال الرسالة التالية، يجب أن يتم استدعاء Ack() على الرسالة المستلمة.
// إذا فشلت معالجة الرسالة ويجب توصيلها مرة أخرى، يجب استدعاء Nack().
//
// عندما يتم إلغاء ctx المقدم، سيقوم المشترك بإغلاق الاشتراك وقناة الإخراج.
// يتم تعيين ctx المقدم على جميع الرسائل المُولدة.
// عندما يتم استدعاء Nack أو Ack على الرسالة، يتم إلغاء سياق الرسالة.
Subscribe(ctx context.Context, topic string) (
قائمة الأعمال
إليك بعض النقاط التي يجب عليك ألا تنساها:
- السجل (رسائل جيدة ومستويات مناسبة).
- مُشفرات الرسائل القابلة للتعويض والتكوين.
- تنفيذ
Close()
للناشرين والمشتركين يجب أن يكون:- متماثل
- قادر على العمل بشكل صحيح عندما يتم حظر الناشر أو المشترك (مثل الانتظار لـ Ack)
- قادر على العمل بشكل صحيح عندما يتم حظر قناة الإخراج للمشترك (لأنه لا يوجد من يستمع إليها)
- دعم
Ack()
وNack()
للرسائل المستهلكة. - دعم إعادة توصيل الرسائل المستهلكة باستخدام
Nack()
. - استخدام اختبار جرد/مشترك جنريكي. يجب عليك الرجوع إلى دليل استكشاف الأخطاء في الاختبار للحصول على نصائح تصحيح الأخطاء.
- تحسين الأداء.
- GoDocs، وثائق Markdown، وأمثلة تمهيدية.