للأسف لا يمكنني العثور على أي شيء مفيد بشكل خاص في /logs نفسها، ولكن عندما أقوم بإعادة إنتاج هذا محليًا، أرى الطلب الوارد ثم 404، ولكنه يحدث فقط عندما أقوم بتعيين أحدث إشعار لي بمعرف كبير (يعمل بشكل جيد عندما يكون ضمن نطاق int32)
ولكن، بمجرد أن أقوم بتمرير معلمة الاستعلام recent أي http://localhost/notifications.json?recent=true&limit=30 وهذا ما يتم استدعاؤه بواسطة قائمة الإشعارات؟
{
"errors": [
"The requested URL or resource could not be found."
],
"error_type": "not_found"
}
لاحظنا أننا بحاجة إلى ترحيل الأعمدة في جداول أخرى تشير إلى 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
لقد بدأنا بالتعامل مع #1 باستخدام أمر ALTER المقترح أعلاه، ولكن بعد ذلك، كما ذكرنا، اخترنا استخدام ترحيلات ActiveRecord، وبهذه الطريقة تضاف ملفات الترحيل إلى المخطط.
# frozen_string_literal: true
class ChangeNotificationsIdToBigint < ActiveRecord::Migration[6.1]
def change
change_column :notifications, :id, :bigint
end
end
# frozen_string_literal: true
class ChangeUserSeenNotificationIdToBigint < ActiveRecord::Migration[6.1]
def change
change_column :users, :seen_notification_id, :bigint
end
end
# frozen_string_literal: true
class ChangeUserBadgesNotificationIdToBigint < ActiveRecord::Migration[6.1]
def change
change_column :user_badges, :notification_id, :bigint
end
end
# 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 الخاص بنا أمرًا سهلاً.
بعد ذلك، تركنا rake db:migrate يتعامل مع الباقي. بمجرد إجراء إعادة تشغيل متدرجة لجميع وحدات discourse و sidekiq الخاصة بنا، كان كل شيء يعمل كما هو متوقع .
بيانات ممتازة، سنقوم بتحمل العبء وترحيل هذا في نواة Discourse إلى bigint. إنها خطوة مكلفة، لكن هذا بالتأكيد سيظهر مرة أخرى في المنتديات الكبيرة لذا من الأفضل إصلاحه.
ملاحظة… الموضوع الأصلي يدور حول post_id… تجاوز هذا سيكون أصعب بكثير من الإشعارات. 2.1 مليار مشاركة ستحدث بالتأكيد، لكن تكلفة تحويل post_id إلى bigint أكثر تكلفة بكثير من notification id. يمكننا الانتظار قليلاً بشأن هذه القنبلة الموقوتة.