Я думаю, что мы теперь в безопасности!
Мы заметили, что нам нужно было мигрировать столбцы в других таблицах, которые ссылаются на notification_id, а не только на notifications.id. В противном случае services/notifications.rb или services/badge_granter.rb вызывали бы ошибки.
Для любых других крупных форумов, которые в будущем столкнутся с этой проблемой в уведомлениях, вот что мы сделали…
Всего нам пришлось мигрировать четыре столбца в четырех таблицах:
notifications.id
user.seen_notification_id
user_badges.notification_id
shelved_notifications.notification_id
Изначально мы использовали команду ALTER для пункта #1, предложенную выше, но затем, как упоминалось, решили использовать миграции ActiveRecord, чтобы файлы миграций добавлялись в схему.
20230215070319_change_notifications_id_to_bigint.rb
# frozen_string_literal: true
class ChangeNotificationsIdToBigint < ActiveRecord::Migration[6.1]
def change
change_column :notifications, :id, :bigint
end
end
20230215070320_change_user_seen_notification_id_to_bigint.rb
# frozen_string_literal: true
class ChangeUserSeenNotificationIdToBigint < ActiveRecord::Migration[6.1]
def change
change_column :users, :seen_notification_id, :bigint
end
end
20230215070321_change_user_badges_notification_id_to_bigint.rb
# frozen_string_literal: true
class ChangeUserBadgesNotificationIdToBigint < ActiveRecord::Migration[6.1]
def change
change_column :user_badges, :notification_id, :bigint
end
end
20230215070322_change_shelved_notifications_notification_id_to_bigint.rb
# frozen_string_literal: true
class ChangeShelvedNotificationsNotificationIdToBigint < ActiveRecord::Migration[6.1]
def change
change_column :shelved_notifications, :notification_id, :bigint
end
end
В нашей настройке используется кастомный Dockerfile (мы собираем образы, чтобы запускать Discourse и Sidekiq на отдельных ресурсах в Kubernetes), поэтому копирование этих файлов в /db/migrate в рамках нашего Dockerfile было straightforward.
Затем мы просто позволили rake db:migrate обработать остальное. После того как мы выполнили rolling restart всех наших подов Discourse и Sidekiq, всё заработало как ожидалось
.