هل هناك طريقة لإرسال إشعارات البريد الإلكتروني بشكل أسرع؟

لدينا فئة #Announcements يتم فيها اشتراك جميع أعضائنا تلقائيًا لمشاهدة المنشور الأول.

يتيح لنا ذلك جدولة نشر المنشورات في تلك الفئة في أوقات/تواريخ محددة.

بدوره، يتم إرسال الإعلان عبر البريد الإلكتروني إلى حوالي 25 ألف عضو.

المشكلة التي نواجهها هي أن رسائل البريد الإلكتروني تستغرق أكثر من ساعة لإرسالها، وهو أمر غير مثالي للإعلانات ذات الأهمية الزمنية.

إذا قمت بمراقبة Sidekiq، يمكنني رؤية عداد “Scheduled” يجمع كل رسائل البريد الإلكتروني الفردية واحدة تلو الأخرى، وبمجرد وصوله إلى حوالي 20 ألفًا، يقوم بنقلها إلى علامة التبويب “Enqueued”، ثم تبدأ في الإرسال في النهاية.

هل يمكنني تسريع هذه العملية بأي شكل من الأشكال؟ :thinking:

بالنسبة لرسائل البريد الإلكتروني ذات الأهمية الزمنية، سيكون من الجيد إرسالها أسرع بحوالي 100 مرة مما هي عليه حاليًا :blush:

قد يساعدك هذا النقاش، حيث يشرح كيفية تعيين DISCOURSE_MAX_DIGESTS_ENQUEUED_PER_30_MINS_PER_SITE، والذي يحدد الحد العام للملخصات.

إعجابَين (2)

لقد قمت بتوقيت ذلك هذا المساء.

قمت بجدولة منشور للنشر في فئة #Announcements في الساعة 18:30.


في الساعة 18:40، كان هناك 15,000 بريد إلكتروني في قائمة الانتظار “المجدولة”.


في الساعة 18:45، أي بعد 15 دقيقة من النشر، كان هناك 22,000 بريد إلكتروني في قائمة الانتظار “المجدولة”.


في الساعة 18:48، بدأت رسائل البريد الإلكتروني هذه تدريجيًا في الانتقال إلى قائمة الانتظار “المُدرجة في قائمة الانتظار”:


في الساعة 18:51، كانوا لا يزالون ينتقلون:


في الساعة 19:03، كانت رسائل البريد الإلكتروني في طريقها للخروج:


بحلول الساعة 19:10، كان هناك 10,000 بريد إلكتروني متبقٍ فقط:


في الساعة 19:27، كان هناك 569 بريدًا إلكترونيًا متبقيًا فقط:


وفي الساعة 19:29، تم إرسال جميع رسائل البريد الإلكتروني:


إذًا، ها هو ذا، ساعة كاملة لإرسال 22,000 إشعار عبر البريد الإلكتروني.

هل يمكن لأي شخص مساعدتي في تحديد عنق الزجاجة هنا؟

أود بشدة أن أتمكن من إرسال رسائل البريد الإلكتروني هذه بمعدل أسرع من معدلها الحالي البالغ 22000 في الساعة.

إطلاق النار من الورك،
هل من الممكن أن تكون مشكلة في حمل البنية التحتية؟

إعجاب واحد (1)

ربما؟

أنا حقًا لا أعرف :person_shrugging:
ارتفعت وحدة المعالجة المركزية إلى حوالي 44٪ على الخادم:

وأنا أستخدم AWS SES لـ SMTP.

هناك شيئان يحدثان هنا:

  • تأخير أثناء إدراج وظائف البريد الإلكتروني في قائمة الانتظار
  • وقت المعالجة لإرسال البريد الإلكتروني الفعلي

بالنسبة للأول، لست متأكدًا بنسبة 100% من هذا، لكن أعتقد أن تقليل email_time_window_mins يعني أن الإشعارات يتم إدراجها في قائمة الانتظار في وقت أقرب.

بمجرد جدولة وظائف البريد الإلكتروني، تعمل عوامل Sidekiq الخاصة بك على معالجتها واحدة تلو الأخرى. زيادة عوامل Sidekiq (اضبط DISCOURSE_SIDEKIQ_WORKERS من 5 إلى 10 أو 15 أو 20 حسب سعة الخادم) يعني معالجة المزيد من المهام في نفس الوقت، وبالتالي يتم إفراغ قائمة الانتظار بشكل أسرع بمرتين/3 مرات/4 مرات.

4 إعجابات

لا أعرف كيف يعمل الواجهة الخلفية بأدق التفاصيل، ولكن email_time_window_mins هو مجرد إعداد تأخير قبل إرسال البريد الإلكتروني الأول. خلال هذا الوقت، قد “يتنازل” أي مستخدم تم تعيينه لتلقي البريد الإلكتروني عن البريد الإلكتروني إذا كان نشطًا في غضون فترة النافذة (المصطلح الرسمي: تم تخطي البريد الإلكتروني؛ سبب التخطي: شوهد المستخدم مؤخرًا).
التأخير الافتراضي هو 10 دقائق، مما يعني أن المنشور يجب أن يكون مباشرًا لمدة 10 دقائق، وبعد ذلك فقط سيتم إرسال رسائل البريد الإلكتروني.
مشكلة ريتشي هي الفارق الزمني بين البريد الإلكتروني الأول والأخير… تأخير لمدة ساعة. هذا ربما بسبب الكم الهائل من رسائل البريد الإلكتروني التي تحتاج إلى إرسالها، على الرغم من أنني لا أستطيع الجزم بذلك أيضًا.
تغيير الإعداد أعلاه سيسرع فقط إرسال البريد الإلكتروني الأول، ولكنه لن يعالج مدة اكتمال الدفعة الكاملة البالغة 22000 بريد إلكتروني.


ما هو الإعداد الموصى به، بالاعتماد الواضح على قدرة البنية التحتية؟
هل يمكن أن يؤدي الإعداد العالي إلى مشاكل في الخادم من حيث الحمل أو غير ذلك؟

إعجاب واحد (1)

“بقدر ما يمكن للخادم التعامل معه”.

يعتمد هذا بنسبة 100٪ على سعة الخادم لدى OP - الكثير جدًا سيؤدي إلى إبطاء الأمور، والقليل جدًا سيستغرق وقتًا أطول للمعالجة.

بالنظر إلى أن رسم بياني لوحدة المعالجة المركزية يصل إلى 40٪ (هل هذا من وحدة معالجة مركزية واحدة أم من السعة الإجمالية؟) ربما أبدأ بزيادته إما بمقدار الضعف (محافظ) أو 3 أضعاف (عدواني) وأرى ما يحدث، اعتمادًا على مدى تحمل المخاطر للتباطؤ.

إعجاب واحد (1)

رؤية رائعة، شكرًا لك :slight_smile:

هل يجب أن يكون DISCOURSE_SIDEKIQ_WORKERS مضاعفًا للعدد 5؟ هل يمكنني تعيينه إلى 7 على سبيل المثال؟

ليس لدي هذا الإعداد للمعامل في ملف app.yml الخاص بي، لذا سأفترض أنه افتراضيًا عند 5 في مكان ما.

هل يمكنني فقط إنشاء هذا الإعداد ضمن إعداد عمال unicorn الحالي، ثم إعادة البناء؟

على سبيل المثال:

expose:
  - “443:443”

env:
    UNICORN_WORKERS: 8
    DISCOURSE_SIDEKIQ_WORKERS: 7

هل الأمر بهذه البساطة؟ :thinking:

هل يمكن لأي شخص تأكيد أن هذا هو التغيير الصحيح الذي يجب إجراؤه على ملف app.yml الخاص بي عندما لا يكون المعلمة DISCOURSE_SIDEKIQ_WORKERS موجودة حاليًا؟

إعجاب واحد (1)

أعتقد نعم، بالنظر إلى استفسار موجز لروبوت الذكاء الاصطناعي.

إعجاب واحد (1)

شكرا @TempAccount

ومن المثير للاهتمام أن DISCOURSE_SIDEKIQ_WORKERS تظهر إحدى عشرة مرة فقط في جميع أنحاء meta:

https://meta.discourse.org/search?q=%22DISCOURSE_SIDEKIQ_WORKERS%22%20order%3Alatest_topic

… وأحد هذه الظهورات في هذا الموضوع :flushed_face:

نعم، هذا صحيح.

يمكن تجاوز أي إعداد (معظمها؟) بهذه الطريقة. القيمة الافتراضية تأتي من discourse_defaults.conf.

إعجابَين (2)

شكرا @supermathie

app.yml الخاص بي يقرأ الآن:

env:
  LANG: en_US.UTF-8
  # DISCOURSE_DEFAULT_LOCALE: en

  ## كم عدد طلبات الويب المتزامنة المدعومة؟ يعتمد على الذاكرة وأنويتها.
  ## سيتم تعيينه تلقائيًا بواسطة bootstrap بناءً على وحدات المعالجة المركزية المكتشفة، أو يمكنك تجاوزها
  UNICORN_WORKERS: 8

  ## تمت إضافة هذا السطر في 04/10/25
  ## REF: https://meta.discourse.org/t/is-there-a-way-i-can-send-email-notifications-faster/383103/12
  DISCOURSE_SIDEKIQ_WORKERS: 7

سأقوم بإعادة البناء لاحقًا هذا الأسبوع وتوقيت إرسال رسائل البريد الإلكتروني :smiley:

فقط حتى أعرف أن تغييري قد تم تطبيقه، هل أفكر بشكل صحيح في أن قيمة Threads هذه يجب أن تزيد من 5 إلى 7؟

إعجابَين (2)

نعم، مؤكد:

إعجابَين (2)

@Richie هل تمكنت من حل مشكلتك؟

شكراً للمتابعة.

لا، للأسف لا.

لقد زدت عدد الخيوط من 5 إلى 8 ولكن لا تزال رسائل البريد الإلكتروني تستغرق ما يقرب من ساعة لإرسالها من البداية إلى النهاية.

أتوقع زيادة بنسبة 40٪ في الإنتاجية الإجمالية.

عندما تكون المهام في قائمة الانتظار، هل ترى استخدامًا بنسبة 7/7؟

أيضًا، انظر إلى حمل الخادم عند معالجتها، وإذا كان بإمكانك زيادته أكثر، فأنا أوصي بذلك.

أوههههه انتظر لحظة. هل يحد ديسكورس من نفسه بطريقة ما؟

هل فاتني إعداد يقيّد استخدامه لوحدة المعالجة المركزية؟ :scream:

إنه لا يحد من نفسه بحد ذاته ولكن كل عامل sidekiq سيعالج وظيفة واحدة في كل مرة، لذلك إذا كان لديك 22000 بريد إلكتروني في انتظار الإرسال، فسيتم معالجة سبعة منها في وقت واحد.

من ناحية الأشياء السخيفة، من المحتمل أن الخادم لن يتمكن من مواكبة الأمر إذا قمت بتعيين العدد إلى 1000 عامل متوازي. لذا فالأمر يتعلق بإيجاد رقم يناسب جميع احتياجاتك:

  • معالجة أكبر عدد ممكن من المهام في نفس الوقت لتجاوز الـ 22000 بريد إلكتروني بشكل أسرع
  • ولكن لا تستهلك كل موارد الخادم مما لا يترك شيئًا لمستخدمي الموقع
إعجابَين (2)