드디어 해결되었습니다!
notifications.id 자체뿐만 아니라 notification_id를 참조하는 다른 테이블의 컬럼들도 마이그레이션해야 한다는 점을 인지했습니다. 그렇지 않으면 services/notifications.rb 또는 services/badge_granter.rb에서 오류가 발생했습니다.
향후 대용량(big) 포럼 환경에서 알림 관련 문제를 겪는 분들을 위해, 우리가 수행한 작업을 공유합니다.
총 4개 테이블의 4개 컬럼을 마이그레이션해야 했습니다:
notifications.iduser.seen_notification_iduser_badges.notification_idshelved_notifications.notification_id
처음에는 #1에 대해 위에서 제안된 ALTER 명령을 사용하려 했지만, 언급했듯이 마이그레이션 파일이 스키마에 누적되도록 하기 위해 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이 있습니다( Kubernetes에서 discourse와 sidekiq를 별도의 리소스에서 실행할 수 있도록 이미지를 빌드합니다). 따라서 Dockerfile의 일부로 이 파일들을 /db/migrate로 복사하는 작업은 간단했습니다.
그 후, rake db:migrate를 실행하여 나머지를 처리하도록 두었습니다. 모든 discourse와 sidekiq 포드에 롤링 재시작을 수행한 후, 모든 것이 예상대로 작동하기 시작했습니다
.