واجهة الناشر/المشترك المخصصة

لإضافة دعم لواجهة الناشر/المشترك المخصصة، يجب عليك تنفيذ واجهات 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) (

قائمة الأعمال

إليك بعض النقاط التي يجب عليك ألا تنساها:

  1. السجل (رسائل جيدة ومستويات مناسبة).
  2. مُشفرات الرسائل القابلة للتعويض والتكوين.
  3. تنفيذ Close() للناشرين والمشتركين يجب أن يكون:
    • متماثل
    • قادر على العمل بشكل صحيح عندما يتم حظر الناشر أو المشترك (مثل الانتظار لـ Ack)
    • قادر على العمل بشكل صحيح عندما يتم حظر قناة الإخراج للمشترك (لأنه لا يوجد من يستمع إليها)
  4. دعم Ack() و Nack() للرسائل المستهلكة.
  5. دعم إعادة توصيل الرسائل المستهلكة باستخدام Nack().
  6. استخدام اختبار جرد/مشترك جنريكي. يجب عليك الرجوع إلى دليل استكشاف الأخطاء في الاختبار للحصول على نصائح تصحيح الأخطاء.
  7. تحسين الأداء.
  8. GoDocs، وثائق Markdown، وأمثلة تمهيدية.