خطأ: عدد صحيح خارج النطاق

لقد نجح هذا في إجراء post_actions، شكرًا على الاقتراح!

نحن نرى الآن بشكل أساسي فشلين لا يزالان قائمين:

  1. GET https://devforum.roblox.com/notifications يُرجع 404 للمستخدمين الذين لديهم إشعارات بمعرفات bigInt.

  2. فشل مهمة Jobs::GrantAnniversaryBadges المجدولة.

هل من الممكن أن يكون نموذج/وحدة تحكم/خدمة الإشعارات لا يزال مبرمجًا بشكل ثابت لتعريف حقل notifications.id كرقم صحيح؟

غير مرجح للغاية… 404 لا يبدو صحيحًا، هل هناك أي شيء في /logs يصف المشكلة؟

للأسف لا يمكنني العثور على أي شيء مفيد بشكل خاص في /logs نفسها، ولكن عندما أقوم بإعادة إنتاج هذا محليًا، أرى الطلب الوارد ثم 404، ولكنه يحدث فقط عندما أقوم بتعيين أحدث إشعار لي بمعرف كبير (يعمل بشكل جيد عندما يكون ضمن نطاق int32)

بالبحث، لاحظت أنني أحصل على استجابة صالحة عند استدعاء http://localhost/notifications.json?limit=30:

{
  "notifications": [
    {
      "id": 2148935910,
      "user_id": 2,
      "notification_type": 5,
      "read": true,
      "high_priority": false,
      "created_at": "2023-02-16T00:50:53.135Z",
      "post_number": 2,
      "topic_id": 8,
      "fancy_title": "Welcome to the Lounge",
      "slug": "welcome-to-the-lounge",
      "data": {
        "topic_title": "Welcome to the Lounge",
        "original_post_id": 13,
        "original_post_type": 1,
        "original_username": "blarouche",
        "revision_number": null,
        "display_username": "blarouche"
      }
    }
  ],
  "total_rows_notifications": 1,
  "seen_notification_id": 1001,
  "load_more_notifications": "/notifications?offset=60&username=bjlarouche"
}

ولكن، بمجرد أن أقوم بتمرير معلمة الاستعلام recent أي http://localhost/notifications.json?recent=true&limit=30 وهذا ما يتم استدعاؤه بواسطة قائمة الإشعارات؟

{
  "errors": [
    "The requested URL or resource could not be found."
  ],
  "error_type": "not_found"
}

تعديل: نعتقد أن السبب هو أن current_user.seen_notification_id لا يزال عددًا صحيحًا :thinking:

أعتقد أننا تجاوزنا الخطر الآن!

لاحظنا أننا بحاجة إلى ترحيل الأعمدة في جداول أخرى تشير إلى notification_id بالإضافة إلى notifications.id نفسه. وإلا، فإن services/notifications.rb أو services/badge_granter.rb ستُصدر أخطاء.


بالنسبة لأي إعدادات منتديات كبيرة أخرى تواجه هذا في المستقبل مع الإشعارات، إليك ما فعلناه…

إجمالاً، كان علينا ترحيل أربعة أعمدة في أربعة جداول:

  1. notifications.id
  2. user.seen_notification_id
  3. user_badges.notification_id
  4. shelved_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 مخصص في إعدادنا (نقوم ببناء صور حتى نتمكن من تشغيل discourse و sidekiq على موارد منفصلة في Kubernetes) لذا كان نسخ هذه الملفات إلى /db/migrate كجزء من Dockerfile الخاص بنا أمرًا سهلاً.

بعد ذلك، تركنا rake db:migrate يتعامل مع الباقي. بمجرد إجراء إعادة تشغيل متدرجة لجميع وحدات discourse و sidekiq الخاصة بنا، كان كل شيء يعمل كما هو متوقع :crossed_fingers:.

3 إعجابات

بيانات ممتازة، سنقوم بتحمل العبء وترحيل هذا في نواة Discourse إلى bigint. إنها خطوة مكلفة، لكن هذا بالتأكيد سيظهر مرة أخرى في المنتديات الكبيرة لذا من الأفضل إصلاحه.

ملاحظة… الموضوع الأصلي يدور حول post_id… تجاوز هذا سيكون أصعب بكثير من الإشعارات. 2.1 مليار مشاركة ستحدث بالتأكيد، لكن تكلفة تحويل post_id إلى bigint أكثر تكلفة بكثير من notification id. يمكننا الانتظار قليلاً بشأن هذه القنبلة الموقوتة.

4 إعجابات

براندون،

أعتقد أننا قد ننتهي بالذهاب مع:

الموازنة هنا هي أنني لا أريد “معاقبة” 40 ألف مثيل ديسكورس بسبب المنتديات الاستثنائية القليلة التي حققت الإنجاز المذهل البالغ 2.5 مليار إشعار.

ما رأيك؟

(ملاحظة: سيشمل أيضًا واحدًا على الأقل فاتك - توجد أيضًا جداول دردشة)

3 إعجابات

سيكون هذا رائعًا ويبدو حلاً ذكيًا :slight_smile:

للعودة إلى هذا الموضوع - لقد تم دمج هذا الآن. :partying_face:

5 إعجابات

تم إغلاق هذا الموضوع تلقائيًا بعد 4 أيام. لم تعد الردود الجديدة مسموحًا بها.