Уведомления некорректно создаются для старых постов

Вчера мой сайт внезапно начал генерировать уведомления для старых постов. Вот количество уведомлений типа «posted» (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. На данный момент я отключил уведомления по электронной почте.

Есть ли какие-то идеи, как это устранить? Я предполагаю, что это либо очередь, которая по какой-то причине забилась, либо что-то подобное. Можно ли узнать, что именно генерирует эти уведомления?

Мне кажется, что это задания Sidekiq, которые ранее не выполнялись по какой-то причине, и вы «исправили» что-то так, что эти уведомления теперь отправляются, а не тогда, когда должны были. Вы можете перейти в /sidekiq и посмотреть, есть ли там задания, которые можно удалить до их обработки.

Отличное предположение, Джей. Я вижу рост за последние несколько дней, когда пользователи сообщали о проблеме:

Я проверил очередь запланированных задач, и там, похоже, нет длинной очереди необработанных сообщений. Скорее, каждые 10 минут или около того добавляется несколько десятков таких устаревших уведомлений.

Можно ли отследить, что именно отправляет их в Sidekiq?

Проблема, к счастью, разрешилась сама собой через несколько дней, но более глубокое изучение помогло мне понять, что мой первоначальный SQL-запрос был неполным: поле notifications.post_number указывает на первый непрочитанный пост в конкретной теме, но каждый раз при создании нового поста значение notification.created_at обновляется до нового значения posts.created_at.

Это объясняло некоторые расхождения во времени, которые я наблюдал, но не тот неожиданный всплеск, который таинственно появился и исчез.

Чтобы исправить запрос, мне нужно сначала проверить таблицу post_timings, чтобы найти последние topic_id и post_number, которые видел данный пользователь, и использовать их created_at вместо значения из таблицы notifications.