الجلسات اللاصقة مع Apache APISIX - النظرية
July 27, 2023
الجلسات اللاصقة، المعروفة أيضًا باسم تقارب الجلسات، هي آلية يتم من خلالها توجيه مكون التوجيه الذي يعمل كواجهة دائمًا إلى نفس العقدة الأساسية. في هذه المقالة، سأشرح السبب وراء الجلسات اللاصقة، البدائل المتاحة، وكيفية تنفيذها عبر Apache APISIX.
لماذا الجلسات اللاصقة؟
أصبحت الجلسات اللاصقة شائعة عندما كنا نخزن الحالة على العقدة الأساسية، وليس في قاعدة البيانات. سأستخدم مثال متجر إلكتروني مبسط لشرح المزيد.
يمكن أن تتكون الأسس الأساسية لموقع تجارة إلكترونية صغير من تطبيق ويب وقاعدة بيانات.
إذا نجح العمل، سينمو، وستحتاج إلى توسيع هذه الهندسة في مرحلة ما. بمجرد أن لا تتمكن من التوسع رأسيًا (آلات أكبر)، يجب عليك التوسع أفقيًا (المزيد من العقد). مع عقد تطبيق إضافية، ستحتاج أيضًا إلى آلية موازنة تحميل أمام عقد تطبيق الويب لتوزيع الحمل بينها.
الذهاب إلى قاعدة البيانات في كل مرة هو عملية مكلفة. هذا مقبول للبيانات التي يتم الوصول إليها بشكل غير متكرر. ومع ذلك، نريد عرض محتوى عربة التسوق لكل طلب. هناك بعض البدائل المتاحة لتسريع الأمور. إذا افترضنا أن تطبيق الويب يستخدم التصيير من جانب الخادم، فإن الحل الكلاسيكي هو الاحتفاظ ببيانات عربة التسوق في الذاكرة على عقدة تطبيق الويب.
ومع ذلك، إذا قمنا بتخزين عربة المستخدم X على العقدة 1، نحتاج إلى التأكد من أننا نوجه كل طلب للمستخدم X إلى نفس العقدة. وإلا، سيشعرون وكأنهم فقدوا محتوى عربة التسوق الخاصة بهم. الجلسات اللاصقة، أو تقارب الجلسات، هي الآلية التي توجه نفس المستخدم باستمرار إلى نفس العقدة.
قيود الجلسات اللاصقة
قبل المضي قدمًا، يجب أن أشرح قيدًا كبيرًا للجلسات اللاصقة. إذا تعطلت عقدة تطبيق الويب التي تخزن البيانات لأي سبب، فإن البيانات تُفقد بشكل لا رجعة فيه. بالنسبة لسيناريو التجارة الإلكترونية أعلاه، هذا يعني أن المستخدمين سيخسرون عربة التسوق الخاصة بهم أحيانًا، وهو أمر غير مقبول من وجهة نظر الأعمال.
لهذا السبب، يجب أن تسير الجلسات اللاصقة جنبًا إلى جنب مع تكرار الجلسات: يجب نسخ البيانات المخزنة على عقدة واحدة والاحتفاظ بها متزامنة مع جميع العقد الأخرى.
بينما يوجد تكرار الجلسات في جميع أكوام التقنيات، لا يوجد مواصفات ذات صلة. أنا على دراية بـ JVM، لذا إليك بعض الخيارات:
- يقدم Tomcat تكرار الجلسات بشكل افتراضي
- يقدم Hazelcast حلًا في الذاكرة الموزعة يمكنك دمجه على مستويات مختلفة
- Spring Session هي طبقة تجريد فوق حلول محددة
عندما يتم تكرار البيانات على جميع العقد (أو مجموعة عنقودية بعيدة)، قد تعتقد أنك لم تعد بحاجة إلى الجلسات اللاصقة. هذا صحيح إذا كنت تأخذ في الاعتبار فقط التوفر وليس الأداء. الأمر يتعلق بمحلية البيانات: جلب البيانات على العقدة الحالية أسرع من جلبها من مكان آخر عبر الشبكة.
الجلسات اللاصقة على Apache APISIX
الجلسات اللاصقة هي ميزة أساسية لأي موازن تحميل، وكيل عكسي، وبوابة API تستحق اسمها. ومع ذلك، يجب أن أعترف أن وثائق Apache APISIX تحتاج إلى نقطة دخول سهلة إلى الموضوع.
يقوم Apache APISIX بربط مسار بـ عقدة علوية. تتكون العقدة العلوية من عقدة واحدة أو أكثر. عندما يتطابق طلب مع المسار، يجب على Apache APISIX الاختيار من بين جميع العقد المتاحة لتوجيه الطلب إليها. بشكل افتراضي، الخوارزمية هي التناوب الدوري الموزون. يستخدم التناوب الدوري عقدة واحدة تلو الأخرى، وبعد الأخيرة، يعود إلى الأولى. مع التناوب الدوري الموزون، يؤثر الوزن على عدد الطلبات التي يوجهها Apache APISIX إلى عقدة قبل أن ينتقل إلى التالية.
ومع ذلك، تتوفر خوارزميات أخرى:
- التجزئة المتسقة
- مخطط المتوسط المتحرك الأسي الموزون
- أقل اتصال
- خوارزمية مخصصة
تسمح التجزئة المتسقة بالتوجيه إلى نفس العقدة اعتمادًا على بعض القيم: متغير NGINX، رأس HTTP، ملف تعريف ارتباط، إلخ.
تذكر أن HTTP هو بروتوكول عديم الحالة، لذا تقوم خوادم التطبيقات بتعيين ملف تعريف ارتباط في الاستجابة الأولى لتتبع المستخدم عبر طلبات HTTP. هذا ما نسميه "جلسة". نحتاج إلى معرفة اسم ملف تعريف ارتباط الجلسة الأساسي. تقوم خوادم التطبيقات المختلفة بتوزيع ملفات تعريف ارتباط مختلفة:
JSESSIONID
لخوادم تعتمد على JVMPHPSESSID
لـ PHPASPSESSIONID
لـ ASP.Net- إلخ.
سأستخدم Tomcat عادي، لذا فإن ملف تعريف ارتباط الجلسة هو JSESSIONID
. وبالتالي، فإن وثائق Apache APISIX لعقدتين هي كما يلي:
routes:
- uri: /*
upstream:
nodes:
"tomcat1:8080": 1 #1
"tomcat2:8080": 1 #1
type: chash #2
hash_on: cookie #3
key: cookie_JSESSIONID #4
- تعريف العقد العلوية
- اختيار خوارزمية التجزئة المتسقة
- التجزئة على ملف تعريف ارتباط
- تعريف أي ملف تعريف ارتباط للتجزئة عليه
الخلاصة
في هذه المقالة، قمنا بتفصيل الجلسات اللاصقة، وأنه يجب دائمًا استخدام تكرار الجلسات مع الجلسات اللاصقة، وكيفية تنفيذ الجلسات اللاصقة على Apache APISIX.
للمزيد من المعلومات: