古い投稿に対して通知が誤って作成されています

昨日、私のサイトが突然、過去の投稿に対して通知を生成し始めました。これが過去数日間に作成された「投稿済み」通知(notification_type = 9)で、作成時刻が1時間以上前であるものの数です:

この表を生成するために使用したクエリ
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 を実行して取得):

最初のハイライトされた行は12月8日に作成されましたが、そのカテゴリを監視しているユーザーは12月25日に通知を受け取りました(他のユーザーの話によれば、すでに閲覧済みの投稿についても通知されているそうです)。

2番目のハイライトされた行は9月29日に作成され、翌日に修正され、12月25日に通知されました。

私はコンテナを再構築したため、Discourse の最新バージョンを実行しています。現時点ではメール通知を無効にしています。

この問題をトラブルシューティングする方法についてご存知でしょうか?何らかの理由でキューが詰まっているか、それに類する問題だと推測しています。これらの通知を生成している原因を特定する方法はありますか?

「いいね!」 1

私の推測では、これらは過去に何らかの理由で失敗した Sidekiq ジョブであり、あなたが何かを修正したため、本来のタイミングではなく現在通知が送信されているのだと思います。/sidekiq を確認し、処理される前に削除できるジョブがないか確認してください。

「いいね!」 2

良い推測ですね、ジェイ。ユーザーが問題を報告した過去数日間で増加傾向が見られます:

スケジュールキューを確認しましたが、未処理のメッセージが長く溜まっている様子はありません。むしろ、数十分おきに数十件の古い通知が追加されているようです。

これらが Sidekiq に送信されている原因を特定することは可能でしょうか?

「いいね!」 1

幸運なことに、この問題は数日後に自然に解決したようですが、さらに詳しく調べてみると、初期の SQL クエリが不完全だったことに気づきました。notifications.post_number フィールドは、特定のトピック内の最初の未読ポストを指しますが、新しいポストが作成されるたびに、その notification.created_at が新しい posts.created_at に更新されてしまいます。

これにより、私が観察していた時間の不一致の一部は説明がつきましたが、謎のうちに現れて消えた急増については説明できませんでした。

クエリを修正するには、まず post_timings を確認して、該当するユーザーが最後に閲覧した topic_id/post_number を特定し、notifications から取得するものではなく、その created_at を使用する必要があります。

「いいね!」 1