الإشعارات يتم إنشاؤها بشكل غير صحيح للمنشورات القديمة

في اليوم السابق، بدأ موقعي في إرسال إشعارات لمنشورات قديمة فجأة. هذا هو عدد إشعارات “النشر” (notification_type = 9) التي تم إنشاؤها بعد مرور ساعة خلال الأيام القليلة الماضية:

الاستعلام الذي استخدمته لتوليد الجدول
WITH pre AS (
	SELECT
		p.id as post_id,
		to_char(n.created_at,
			'YYYY-MM-DD') AS notified_day,
		p.topic_id,
		round(least(EXTRACT(EPOCH FROM n.created_at - p.created_at)::numeric, EXTRACT(EPOCH FROM n.created_at - p.updated_at)::numeric) / 3600)  AS hours_diff,
		p.created_at,
		p.updated_at,
		n.created_at,
		u.username
	FROM
		notifications n
	LEFT JOIN posts p ON p.post_number = n.post_number
		AND p.topic_id = n.topic_id
	left join users u on u.id = n.user_id
WHERE
	round(least(EXTRACT(EPOCH FROM n.created_at - p.created_at)::numeric, EXTRACT(EPOCH FROM n.created_at - p.updated_at)::numeric) / 3600) > 0
	AND n.notification_type = 9
ORDER BY
	n.created_at DESC
LIMIT 400
)
SELECT
	count(*), 
	notified_day
FROM
	pre
GROUP BY
	notified_day
ORDER BY
	notified_day DESC

إليك بعض الأمثلة (من تشغيل CTE في الاستعلام أعلاه):

الصف المظلل الأول تم إنشاؤه في 8 ديسمبر، لكن مستخدمًا يراقب تلك الفئة تلقى إشعارًا في 25 ديسمبر (ومن ما أخبرتني به مستخدمون آخرون، فإنهم يتلقون إشعارات بشأن منشورات سبق لهم رؤيتها).

الصف المظلل الثاني تم إنشاؤه في 29 سبتمبر، وتم تعديله بعد يوم، وتم إرسال إشعار عنه في 25 ديسمبر.

أعدت بناء الحاوية للتو، لذا أعمل الآن على أحدث إصدار من Discourse. حاليًا، قمت بتعطيل إشعارات البريد الإلكتروني.

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

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

تخميني هو أن هذه وظائف Sidekiq فشلت في الماضي لسبب ما، وأنك “أصلحت” شيئًا ما بحيث تُرسل هذه الإشعارات الآن بدلاً من الوقت الذي كان من المفترض أن تُرسل فيه. يمكنك زيارة /sidekiq والتحقق مما إذا كانت هناك مهام يمكنك حذفها قبل معالجتها.

إعجابَين (2)

هذا تخمين رائع يا جاي. يمكنني رؤية زيادة في الأيام القليلة الماضية منذ أن أبلغ المستخدمون عن المشكلة:

لقد تفقدت طابور المهام المجدولة، ولا يبدو أن هناك طابورًا طويلًا من الرسائل غير المعالجة. بل يبدو أن عشرات من هذه الإشعارات القديمة تُضاف كل 10 دقائق تقريبًا.

هل من الممكن تتبع مصدر إرسال هذه الإشعارات إلى Sidekiq؟

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

يبدو أن المشكلة قد حُلّت من تلقاء نفسها (لحسن الحظ) بعد بضعة أيام، لكن الغوص في التفاصيل ساعدني على إدراك أن استعلام SQL الأولي كان غير مكتمل: فالحقل notifications.post_number يشير إلى أول منشور غير مقروء في موضوع معين، ولكن في كل مرة يُنشَأ فيها منشور جديد، يتم تحديث notification.created_at ليصبح مساويًا لـ posts.created_at الجديد.

هذا يفسّر بعض التناقضات الزمنية التي كنت ألاحظها، لكنه لا يفسّر الارتفاع الغامض الذي ظهر ثم اختفى.

لإصلاح الاستعلام، يتعيّن عليّ أولًا فحص جدول post_timings للعثور على آخر topic_id/post_number الذي رآه المستخدم المعني، واستخدام قيمة created_at الخاصة به بدلًا من القيمة القادمة من جدول notifications.

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