هل تفكر في استخدام Postgres كـ «قائمة انتظار رسائل»؟ قد ترغب في إعادة التفكير. فبينما يبدو حلًا بسيطًا، فإن الاعتماد على Postgres لهذه المهمة يمكن أن يخلق نقطة فشل حرجة واحدة ستطاردك لاحقًا، خاصة عندما يكون نظامك تحت الضغط الشديد. وما يعنيه هذا لك هو أن البساطة الظاهرة قد تكلفك الكثير من النوم والجهد عندما تتعطل الأمور.

ينجذب العديد من المطورين في البداية إلى فكرة استخدام Postgres لجميع احتياجاتهم. تبدو نصيحة 'فقط استخدم Postgres' رائعة في البداية، لأنها تتجنب الإعدادات المعقدة التي تحتوي على العديد من الخدمات المختلفة. يمكنك نشر نظام متكامل واحد وتنام بهدوء، أو هكذا يبدو الأمر. يأتي هذا الجاذبية من ميزات مثل 'SELECT ... FOR UPDATE SKIP LOCKED' التي تسمح لك بحجز المهام دون الحاجة إلى بنية تحتية إضافية، ولا وسطاء منفصلين، فقط سطر واحد من التعليمات البرمجية. يبدو الأمر وكأنك تبسّط الأمور، ولكنك في الواقع تخفي مكونًا حرجًا داخل أهم قاعدة بيانات لديك وأقلها قابلية للاستبدال.

مع ذلك، تأتي هذه الراحة بثمن. يستخدم Postgres نظامًا يسمى MVCC، مما يعني أنه ينشئ صفًا جديدًا لكل تحديث. قائمة انتظار الرسائل تعدّل جدولها باستمرار: حجز مهمة، إكمالها، أو محاولة إعادة تشغيلها – كل إجراء ينشئ المزيد من البيانات. هذا التعديل المستمر يؤدي إلى 'تضخم الجدول' و 'تجزئة الفهرس'. عملية التنظيف التلقائي لقاعدة البيانات (autovacuum) تكافح لمواكبة هذه التغييرات. وقد أبرز خبراء مثل براندور ليتش (مهندس سابق في Stripe) وغونار مورلينغ هذه المشكلات. يشيرون إلى أن المعاملات الطويلة الأمد للمستهلكين ومعدلات التغيير العالية تؤدي حتمًا إلى تضخم MVCC وتراكم سجلات المعاملات (WAL pile-up)، وغالبًا ما تخسر عملية التنظيف (vacuum) السباق.

بشكل أساسي، تقوم قائمة انتظار الرسائل الخاصة بك بإتلاف قاعدة البيانات التي تُخزّن فيها ببطء. يحد هذا الإعداد أيضًا من إنتاجية نظامك. تظهر الاختبارات المعيارية أن Postgres، عند استخدامه كقائمة انتظار، يواجه صعوبة كبيرة. على سبيل المثال، أشار اختبار في 15 مايو 2023، إلى أنه وصل إلى الحد الأقصى عند حوالي 660 رسالة في الثانية فقط باستخدام حمولة بحجم 1 كيلوبايت، مع زمن استجابة نشر P95 يبلغ 38 مللي ثانية. على النقيض، يمكن لوسطاء الرسائل المخصصة مثل RabbitMQ معالجة عدد أكبر بكثير من الرسائل.

لذا، بينما تبدو بساطة 'فقط استخدم Postgres' جذابة، إلا أنها غالبًا ما تخلق عنق زجاجة ونقطة فشل واحدة داخل أهم نظام لديك. عندما تتراكم قائمة انتظارك، تكون قاعدة بياناتك بأكملها في خطر – وكلاهما مشكلة واحدة. لأي شيء حرج أو يتطلب حجمًا كبيرًا، من الأفضل استخدام أدوات مخصصة لقوائم انتظار الرسائل، لتجنب تنبيه مؤلم في الساعة 3 صباحًا.