هل تستخدم الإشعارات الفورية وسطاء طرف ثالث؟

مرحبًا @featheredtoast، أنا أيضًا فضولي بشأن هذا. هل تقصد أن إشعارات الويب على سطح المكتب لا تستخدم وسيطًا تابعًا لجهة خارجية مثل GCM أو FCM أو APNs، وبدلاً من ذلك، تنشأ رسائل الإشعارات من نقطة النهاية الخاصة بك — المتصلة بـ Redis أو ما شابه — وأن إشعارات الدفع على الأجهزة المحمولة فقط هي التي تستخدم مثل هؤلاء الوسطاء التابعين لجهات خارجية؟

الإجابة المختصرة: لا، فإشعارات الدفع تُقدَّم من خلال التكاملات الخاصة بالمتصفح، لذا لا يوجد وسيط طرف ثالث مشارك.

من الناحية التقنية، هناك خادم (في مكان ما، وليس خادم Discourse الخاص بك) مسؤول عن تسليم الرسائل إلى جهازك — فتطبيقنا مدعوم من جميع المتصفحات التي تطبق بروتوكول VAPID (Sending VAPID identified WebPush Notifications via Mozilla’s Push Service | Mozilla Services). وخوادم VAPID الخاصة بمصنّعي المتصفحات هي التي تقوم فعليًا بإرسال البيانات إلى جهازك.

آسف على تكرار هذا، لكن بحثي قادني إلى هنا وأنا غير متأكد مما إذا كان الأمر مرتبطًا.

ملفات /logs لدينا مليئة بالرسالة التالية:

فشل إرسال إشعار الدفع : host: fcm.googleapis.com, #<Net::HTTPForbidden 403 Forbidden readbody=true> body: المفتاح الموجود في رأس التفويض لا يتطابق مع معرف المرسل المستخدم للاشتراك من قبل هذا المستخدم. يرجى التأكد من استخدام معرف المرسل ومفتاح الخادم الصحيحين من وحدة تحكم Firebase.

مسار التتبع
webpush-1.1.0/lib/webpush/request.rb:175:in `verify_response'

webpush-1.1.0/lib/webpush/request.rb:34:in `perform'

webpush-1.1.0/lib/webpush.rb:44:in `payload_send'

/var/www/discourse/app/services/push_notification_pusher.rb:79:in `send_notification'

/var/www/discourse/app/services/push_notification_pusher.rb:25:in `block in push'

activerecord-6.0.3.3/lib/active_record/relation/delegation.rb:87:in `each'

activerecord-6.0.3.3/lib/active_record/relation/delegation.rb:87:in `each'

/var/www/discourse/app/services/push_notification_pusher.rb:23:in `push'

/var/www/discourse/app/jobs/regular/send_push_notification.rb:7:in `execute'

/var/www/discourse/app/jobs/base.rb:232:in `block (2 levels) in perform'

rails_multisite-2.5.0/lib/rails_multisite/connection_management.rb:76:in `with_connection'

/var/www/discourse/app/jobs/base.rb:221:in `block in perform'

/var/www/discourse/app/jobs/base.rb:217:in `each'

/var/www/discourse/app/jobs/base.rb:217:in `perform'

sidekiq-6.1.2/lib/sidekiq/processor.rb:196:in `execute_job'

sidekiq-6.1.2/lib/sidekiq/processor.rb:164:in `block (2 levels) in process'

sidekiq-6.1.2/lib/sidekiq/middleware/chain.rb:138:in `block in invoke'

/var/www/discourse/lib/sidekiq/pausable.rb:138:in `call'

sidekiq-6.1.2/lib/sidekiq/middleware/chain.rb:140:in `block in invoke'

sidekiq-6.1.2/lib/sidekiq/middleware/chain.rb:143:in `invoke'

sidekiq-6.1.2/lib/sidekiq/processor.rb:163:in `block in process'

sidekiq-6.1.2/lib/sidekiq/processor.rb:136:in `block (6 levels) in dispatch'

sidekiq-6.1.2/lib/sidekiq/job_retry.rb:111:in `local'

sidekiq-6.1.2/lib/sidekiq/processor.rb:135:in `block (5 levels) in dispatch'

sidekiq-6.1.2/lib/sidekiq.rb:38:in `block in <module:Sidekiq>'

sidekiq-6.1.2/lib/sidekiq/processor.rb:131:in `block (4 levels) in dispatch'

sidekiq-6.1.2/lib/sidekiq/processor.rb:257:in `stats'

sidekiq-6.1.2/lib/sidekiq/processor.rb:126:in `block (3 levels) in dispatch'

sidekiq-6.1.2/lib/sidekiq/job_logger.rb:13:in `call'

sidekiq-6.1.2/lib/sidekiq/processor.rb:125:in `block (2 levels) in dispatch'

sidekiq-6.1.2/lib/sidekiq/job_retry.rb:78:in `global'

sidekiq-6.1.2/lib/sidekiq/processor.rb:124:in `block in dispatch'

sidekiq-6.1.2/lib/sidekiq/logger.rb:10:in `with'

sidekiq-6.1.2/lib/sidekiq/job_logger.rb:33:in `prepare'

sidekiq-6.1.2/lib/sidekiq/processor.rb:123:in `dispatch'

sidekiq-6.1.2/lib/sidekiq/processor.rb:162:in `process'

sidekiq-6.1.2/lib/sidekiq/processor.rb:78:in `process_one'

sidekiq-6.1.2/lib/sidekiq/processor.rb:68:in `run'

sidekiq-6.1.2/lib/sidekiq/util.rb:15:in `watchdog'

sidekiq-6.1.2/lib/sidekiq/util.rb:24:in `block in safe_thread'

نلاحظ الآلاف من هذه الرسائل. هل هذا… طبيعي؟

يبدو أن هناك خطأً؛ فمعرفات المرسل غير المتطابقة يجب أن تؤدي إلى إلغاء اشتراك العميل تلقائيًا، لكن يبدو أن هناك خطأً ما في مكان ما عند اكتشاف رسالة الخطأ من FCM.

بالتأكيد هذا ليس شيئًا موجهًا للعملاء، لكن نعم، هذا ضجيج لا ينبغي أن يكون موجودًا.

أظن أننا يجب أن نتعامل مع استثناءات Webpush::InvalidSubscription و Webpush::Unauthorized عن طريق إلغاء الاشتراك. يبدو أنها لم تكن موجودة عندما قمنا آخر مرة بتحديث معالجة الأخطاء لإشعارات الدفع.

كما ذكرت، نحصل على هذا بالآلاف:

لقد أبلغت سابقًا عن هذا هنا في حال رغبتكم في إبقاء هذا الموضوع ضمن نطاقه. لا تترددوا في دمجه أو حذفه أو غير ذلك.