مرحباً بالمجتمع،
نحن نستخدم واجهة برمجة تطبيقات Discourse في تثبيت ذاتي الاستضافة. حالة الاستخدام لدينا مكثفة للغاية من حيث التزامن، مع حوالي 100 طلب لواجهة برمجة التطبيقات في الثانية في المتوسط. نحن نستخدم أيضاً PostgreSQL+Patroni+HAProxy لتوفير إعداد قاعدة بيانات عالي التوفر. في بعض الأحيان، تتجمد قاعدة بيانات PostgreSQL لدينا وتقوم Patroni بإعادة تشغيل العقدة الرئيسية.
لقد قمنا بتنفيذ مهمة cron للتحقق من المعاملات المحظورة، وفي كل مرة تحدث فيها هذه المشكلة، نجد نفس النوع من العمليات:
blocked_pid | blocked_user | blocking_pid | blocking_user | blocked_statement | current_statement_in_blocking_process
-------------+--------------+--------------+---------------+------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------
297904 | discourse | 293083 | discourse | UPDATE "api_keys" SET "last_used_at" = '2024-07-16 16:38:16.822352' WHERE "api_keys"."id" = 21 | UPDATE "api_keys" SET "last_used_at" = '2024-07-16 16:34:48.163449' WHERE "api_keys"."id" = 21
296718 | discourse | 293083 | discourse | UPDATE "api_keys" SET "last_used_at" = '2024-07-16 16:34:50.900480' WHERE "api_keys"."id" = 21 | UPDATE "api_keys" SET "last_used_at" = '2024-07-16 16:34:48.163449' WHERE "api_keys"."id" = 21
293101 | discourse | 293083 | discourse | UPDATE "api_keys" SET "last_used_at" = '2024-07-16 16:34:49.485074' WHERE "api_keys"."id" = 21 | UPDATE "api_keys" SET "last_used_at" = '2024-07-16 16:34:48.163449' WHERE "api_keys"."id" = 21
كما ترون، تحاول العديد من الطلبات تحديث وقت آخر استخدام لنفس مفتاح واجهة برمجة التطبيقات.
حتى الآن، قمنا بزيادة عدد مفاتيح واجهة برمجة التطبيقات التي يستخدمها تطبيقنا لتقليل احتمالية حدوث تصادم. لاحظت أن هناك رمزاً موجوداً يتحقق مما إذا كان مفتاح واجهة برمجة التطبيقات قد تم تعديله في الدقيقة الأخيرة لتجنب التحديث. ومع ذلك، أفترض أنه بما أننا نستخدم أكثر من حاوية واحدة لمعالجة الطلبات، فإن هذا الحماية ليست فعالة.
أنا غير متأكد مما إذا كان ينبغي علينا الإبلاغ عن هذا كخطأ أو ما إذا كانت هناك أي معلمات لتجنب هذا النوع من التصادم (سواء في Discourse أو PostgreSQL). لاحظ أننا، بالنسبة لنا، المعلومات المتعلقة بآخر استخدام ذات صلة، ولكن دقة تصل إلى يوم واحد ستكون كافية.
أود أيضاً أن أعرف ما هو النهج المفضل لإدارة PostgreSQL HA مع الاستعادة التلقائية.
شكراً