خادمان للتطبيق في منطقتين، وعميل واحد يكتب عبر VPN، وسؤال لم يكتبه أحد: أي مكوّن يقرر أن الكتابة قد حدثت؟ التوجيه يوصل الطلب إلى عملية. وحد المعاملة يقرر متى يصبح التغيير دائمًا ومرئيًا. تلك مهمتان مختلفتان تؤديهما أنظمة مختلفة، والفجوة بينهما هي حيث تسكن معظم أخطاء الكتابة متعددة المناطق.

ابدأ من قاعدة العمل لا من الخريطة

ابدأ بجملة عن قاعدة العمل لا عن الجغرافيا: أي القراءات والكتابات يجب أن تنجح معًا، وأي التغييرات المتزامنة يجب أن تكون مستحيلة أثناء ذلك. في حجز المخزون يعني ذلك أن فحص المخزون والحجز إما أن يسريا معًا أو لا يسري أي منهما، وألا يستهلك طلب ثانٍ الوحدة نفسها في الأثناء.

RequirementWhat satisfies itWhat does not
All-or-nothing applicationA transaction inside one owning systemA VPN path between regions
No double spendIsolation strong enough to exclude the conflictAtomicity alone
Survive a region lossReplication the database itself documentsTwo independent databases behind one client

هذا الصف الأوسط هو الذي تتخطاه الفرق. الذرية دون عزل كافٍ تسمح لمعاملتين بأن تُثبَّتا بشكل صحيح وكلٌّ منهما على حدة، ومع ذلك تنتجان حالة تعتبرها الأعمال مستحيلة، ولا تصلح أي كمية من منطق إعادة المحاولة ذلك لاحقًا.

حد واحد موثوق أفضل من خادمين إقليميين

يمكن لخوادم التطبيق الإقليمية أن تبقى في مكانها، ما دامت تُرسل العملية إلى خدمة تؤديها داخل حد معاملة واحد مدعوم. تصبح طبقة التطبيق موجّهًا للنية؛ وتملك طبقة البيانات الحقيقة.

أبقِ ذلك الحد قصيرًا وقريبًا من البيانات التي يمسها. المعاملة التي تبقى مفتوحة بينما يجيب إنسان عن سؤال، أو بينما يعبر نداء منطقتين، تقضي وقتها في إمساك الأقفال وزيادة احتمال أن ينتهي وقت شيء آخر خلفها. ذلك الفشل يبدو مشكلة قاعدة بيانات، وهو في الحقيقة مشكلة تصميم ترتدي زيّها. ونقل القرار إلى طبقة البيانات يزيله عادةً تمامًا.

BEGIN;
UPDATE inventory SET reserved = reserved + 1
 WHERE sku = 'A-100' AND available >= 1;
INSERT INTO reservation (sku, order_id) VALUES ('A-100', 'ord-9f');
COMMIT;

اقرأ ذلك الرسم كحدّ، لا كتوصية أداء. النقطة هي أن الفحص والإدراج يتشاركان تثبيتًا واحدًا، لذا فإن طلبًا متزامنًا إما يرى المخزون مستهلكًا أو لا يراه إطلاقًا.

ما تمنحه قاعدة البيانات المنسوخة وما لا تمنحه

يمكن لقاعدة بيانات منسوخة أن توفر حدًا أوسع عندما يدعم نموذج معاملاتها ذلك. توثّق Spanner معاملات قراءة وكتابة ذرية داخل قاعدة بيانات واحدة عبر الجداول، بعزل وسلوك إعادة محاولة محددين. ذلك ضمان تقرؤه وتختبره وتعتمد عليه عن قصد.

وهو أيضًا ضمان يأتي من المنتج لا من المسار. فـ VPN بين منطقتين يغيّر كيفية انتقال الحزم وكيفية ظهور الأعطال. ولا يمدّ حد المعاملة بصف واحد، مهما بدا النفق سليمًا. والخلط بين الاثنين ينتج معماريات ينجح فيها كل مكوّن في فحصه الخاص ومع ذلك تبقى البيانات متعارضة.

قاعدتا بيانات لا تصبحان نظامًا واحدًا

قاعدتا بيانات تُداران باستقلال لا تكتسبان مدير معاملات مشتركًا لأن العملاء يستطيعون الوصول إلى كلتيهما. وإذا كانت الأعمال تحتاج حقًا التزامًا ذريًا عبر الاثنتين، فيجب اختيار آلية التنسيق والمشاركين وعملية التعافي وتأهيلها بدلًا من افتراضها.

فكّر في اللحظة التي يختفي فيها مشارك أو رابط بعد تجهيز العمل. الالتزام الموزع المدعوم يمكن أن يترك حالة معلّقة تحتاج إجراء تعافٍ وقرارًا بشريًا، ويأتي بلا وعد بأن تبقى كل منطقة قابلة للكتابة عبر كل انقسام.

إذا كان التنسيق غير المتزامن مقبولًا بدلًا من ذلك، فصرّح بذلك واكتب الحالات التجارية الوسيطة وقواعد التسوية. سلسلة من خطوات مثبَّتة محليًا مع تعويض هي تصميم مشروع؛ لكنها ببساطة ليست معاملة ذرية واحدة ترتدي اسمًا آخر.

صمّم إعادة المحاولة قبل أول انقطاع

قد يفقد العميل الاستجابة بعد تثبيت العملية، لذا لا يستطيع المستدعي اعتبار المهلة فشلًا. احفظ هوية طلب دائمة واستخدم نتيجة الخدمة أو آلية عدم التكرار قبل إعادة محاولة تعديل، وإلا صارت إعادة المحاولة كتابة ثانية.

يمكن أيضًا تنفيذ عمليات الاستدعاء التلقائية للمعاملات أكثر من مرة بعد إحباط قابل لإعادة المحاولة، وهذا يجعلها موطنًا سيئًا للآثار الخارجية غير القابلة للعكس. أبقِ تلك خارج الاستدعاء ما لم يحدد سير العمل بروتوكولًا آمنًا صريحًا لها. وينطبق التحذير نفسه على أي شيء يكلف مالًا أو يرسل رسالة. فالخصم المكرر محادثة أصعب بكثير من سطر سجل مكرر.

ينبغي أن تعيد القبول تشغيل أربعة سيناريوهات: عميلان يتسابقان على الصف نفسه، وإحباط تقول الخدمة إنه قابل لإعادة المحاولة، وتثبيت لا تصل إجابته أبدًا، وفقدان منطقة أو الرابط بينهما. سجّل نتيجة العمل المثبَّتة والحالات غير المحلولة إلى جانب تصميم التوجيه، حتى لا يظن أحد أن الشبكة هي المكوّن الذي يقدم الضمان.

مقالات ذات صلة