توسيع نطاق دعم خدمات App Engine المجمّعة: الجزء 1 (الوحدة 17)

1. نظرة عامة

تهدف سلسلة البرامج التعليمية حول Serverless Migration Station (برامج تعليمية ذاتية السرعة وعملية) ومقاطع الفيديو ذات الصلة إلى مساعدة مطوّري الحوسبة بدون خادم على Google Cloud في تحديث تطبيقاتهم من خلال إرشادهم خلال عملية نقل واحدة أو أكثر، مع التركيز بشكل أساسي على التخلّي عن الخدمات القديمة. يؤدي ذلك إلى زيادة قابلية نقل تطبيقاتك ويمنحك المزيد من الخيارات والمرونة، ما يتيح لك الدمج مع مجموعة أكبر من منتجات Cloud والوصول إليها، كما يسهّل عليك الترقية إلى أحدث إصدارات اللغة. على الرغم من أنّ هذه السلسلة تركّز في البداية على أوائل مستخدمي Cloud، وخاصةً مطوّري App Engine (البيئة العادية)، إلا أنّها واسعة النطاق بما يكفي لتشمل منصات أخرى بلا خادم، مثل Cloud Functions وCloud Run، أو في أي مكان آخر إذا كان ذلك منطبقًا.

في السابق، كان على المطوّرين نقل البيانات من "الخدمات المجمّعة" القديمة في App Engine، مثل Datastore وMemcache، قبل أن يتمكّنوا من ترقية إصدارات اللغات، وهما مهمّتان قد تكونان صعبتين متتاليتين. من خلال إتاحة العديد من الخدمات الرئيسية المجمّعة في الجيل الثاني من خدمة App Engine، يمكن للمطوّرين الآن نقل تطبيقاتهم إلى أحدث أوقات التشغيل مع مواصلة استخدام (معظم) الخدمات المجمّعة. يرشدك هذا الدرس التطبيقي حول الترميز إلى كيفية ترقية نموذج تطبيق من Python 2 إلى 3 مع الحفاظ على استخدام خدمة مخزن البيانات المجمّعة (من خلال مكتبة NDB في App Engine). لا يتطلّب استخدام معظم الخدمات المجمّعة سوى إجراء تعديل بسيط على الرمز كما سيتم توضيحه في هذا الدليل التوجيهي/التعليمي، ولكن هناك خدمات أخرى تتطلّب تغييرات أكثر شمولاً، وسيتم تناولها في "الجزء 2"، وهو وحدة ومتابعة ودرس تطبيقي حول الترميز.

ستتعرَّف على كيفية إجراء ما يلي:

  • نقل نموذج تطبيق App Engine من Python 2 إلى 3
  • تعديل إعدادات التطبيق لتضمين حزمة تطوير البرامج (SDK) في App Engine
  • إضافة رمز حزمة تطوير البرامج (SDK) إلى التطبيق الذي يتيح الخدمات المجمّعة في أوقات التشغيل من الجيل الثاني، مثل Python 3

المتطلبات

استطلاع

كيف ستستخدم هذا البرنامج التعليمي؟

قراءة المحتوى فقط قراءة المحتوى وإكمال التمارين

كيف تقيّم تجربتك مع Python؟

مبتدئ متوسط متمكّن

ما هو تقييمك لتجربة استخدام خدمات Google Cloud؟

مبتدئ متوسط متقدّم

2. الخلفية

تم إطلاق خدمة App Engine الأصلية في عام 2008، وكانت تتضمّن مجموعة من واجهات برمجة التطبيقات القديمة (المعروفة الآن باسم الخدمات المجمّعة) لتسهيل عملية إنشاء التطبيقات ونشرها على مستوى العالم للمطوّرين. وتشمل هذه الخدمات Datastore وMemcache وTask Queue. على الرغم من أنّ هذه الطريقة كانت مريحة، بدأ المستخدمون يشعرون بالقلق بشأن إمكانية نقل تطبيقاتهم عند استخدام واجهات برمجة التطبيقات الخاصة التي تربطهم بخدمة App Engine، وأرادوا أن تكون تطبيقاتهم أكثر قابلية للنقل. وقد أدّى ذلك إلى جانب حقيقة أنّ العديد من هذه الخدمات المجمّعة أصبحت منتجات Cloud مستقلة، إلى إطلاق فريق App Engine للجيل التالي من المنصة في عام 2018 بدونها.

ننتقل سريعًا إلى اليوم، حيث يتوق مطوّرو Python 2 إلى الترقية إلى Python 3. كان يتطلب تطبيق 2.x الذي يستخدم خدمات مجمّعة نقل البيانات من هذه الخدمات قبل أن يتم نقل تطبيقاته إلى الإصدار 3.x، ما يمثّل عمليتَي نقل إجباري متتاليتَين، وربما كانتا عمليتَي نقل صعبة أيضًا. للمساعدة في عملية الانتقال هذه، قدّم فريق App Engine في خريف 2021 "ثقبًا دوديًا" إلى الماضي، ما يتيح للتطبيقات التي تعمل على أوقات التشغيل من الجيل التالي الوصول إلى العديد من تلك الخدمات المجمّعة. على الرغم من أنّ هذا الإصدار لا يتضمّن جميع الخدمات المتوفّرة في أوقات التشغيل الأصلية، إلا أنّ الخدمات الرئيسية، مثل Datastore وTask Queue وMemcache، متوفّرة.

يوضّح هذا الدرس التطبيقي حول الترميز التغييرات اللازمة لترقية تطبيقك إلى الإصدار 3 من Python مع الحفاظ على استخدام الخدمات المجمّعة. والهدف من ذلك هو تشغيل تطبيقاتك على أحدث أوقات التشغيل، ما يتيح لك بعد ذلك نقل البيانات من الخدمات المجمّعة إلى الخدمات المستقلة المكافئة على السحابة الإلكترونية أو البدائل التابعة لجهات خارجية في الجداول الزمنية الخاصة بك، بدلاً من أن يكون ذلك عائقًا أمام الترقية إلى الإصدار 3.x. مع أنّ نقل البيانات من الخدمات المجمّعة لم يعُد مطلوبًا، إلا أنّ إجراء ذلك يمنحك المزيد من إمكانية النقل والمرونة من حيث الأماكن التي يمكن استضافة تطبيقاتك فيها، بما في ذلك الانتقال إلى منصات قد تخدم أحمال العمل بشكل أفضل، أو البقاء على App Engine مع الترقية إلى إصدار لغة أحدث كما هو موضح للتو.

يستخدم نموذج تطبيق Python 2 في الوحدة 1 خدمة مخزن البيانات المجمّعة من خلال App Engine NDB. وقد سبق أن نقل التطبيق الأُطر من webapp2 إلى Flask، وتمّت هذه العملية في الدرس التطبيقي حول الترميز في الوحدة 1، ولكن مع الحفاظ على استخدام مخزن البيانات.

يتضمّن هذا الدليل التعليمي الخطوات التالية:

  1. الإعداد/العمل التحضيري
  2. تعديل الإعدادات
  3. تعديل الرمز البرمجي للتطبيق

3- الإعداد/العمل التحضيري

يوضّح هذا القسم كيفية تنفيذ ما يلي:

  1. إعداد مشروعك على السحابة الإلكترونية
  2. الحصول على نموذج تطبيق أساسي
  3. (إعادة) نشر تطبيق أساسي وإثبات صحته

تضمن لك هذه الخطوات البدء برمز برمجي صالح.

1. إعداد المشروع

إذا أكملت الدرس العملي الخاص بالوحدة 1، ننصحك بإعادة استخدام المشروع (والرمز) نفسه. بدلاً من ذلك، يمكنك إنشاء مشروع على السحابة الإلكترونية جديد تمامًا أو إعادة استخدام مشروع حالي آخر. تأكَّد من أنّ المشروع يتضمّن حساب فوترة نشطًا تم تفعيل خدمة App Engine فيه.

2. الحصول على نموذج تطبيق أساسي

من المتطلبات الأساسية لهذا الدرس التطبيقي حول الترميز أن يكون لديك تطبيق يعمل على الوحدة 1 من App Engine: أكمل الدرس التطبيقي حول الترميز الخاص بالوحدة 1 (يُنصح بذلك) أو انسخ تطبيق الوحدة 1 من المستودع. سواء استخدمت رمزك أو رمزنا، سيكون رمز الوحدة 1 هو المكان الذي سنبدأ منه. يرشدك هذا الدرس التطبيقي حول الترميز خلال كل خطوة، وينتهي برمز يشبه الرمز الموجود في مجلد المستودع "FINISH" في الوحدة 7.

بغض النظر عن تطبيق الوحدة 1 الذي تستخدمه، من المفترض أن يبدو المجلد كما هو موضّح أدناه، وربما يتضمّن مجلد lib أيضًا:

$ ls
README.md               appengine_config.py     requirements.txt
app.yaml                main.py                 templates

3- (إعادة) نشر التطبيق الأساسي

نفِّذ الخطوات التالية لإعادة نشر تطبيق الوحدة 1:

  1. احذف المجلد lib إذا كان متوفّرًا ونفِّذ الأمر: pip install -t lib -r requirements.txt لإعادة ملء lib. قد تحتاج إلى استخدام الأمر pip2 بدلاً من ذلك إذا كان لديك كل من Python 2 و3 مثبّتَين.
  2. تأكَّد من أنّك ثبَّت وبدأت استخدام أداة سطر الأوامر gcloud وراجعت طريقة استخدامها.
  3. اضبط مشروعك على Cloud باستخدام gcloud config set project PROJECT_ID إذا كنت لا تريد إدخال PROJECT_ID مع كل أمر gcloud يتم إصداره.
  4. نشر نموذج التطبيق باستخدام gcloud app deploy
  5. تأكَّد من أنّ تطبيق الوحدة 1 يعمل على النحو المتوقّع بدون أي مشاكل في عرض أحدث الزيارات (كما هو موضّح أدناه).

a7a9d2b80d706a2b.png

4. تعديل الإعدادات

بعد تنفيذ هذه الخطوات بنجاح والتأكّد من أنّ تطبيق الويب يعمل، يمكنك نقل هذا التطبيق إلى Python 3، بدءًا من ملف الإعداد.

إضافة حزمة SDK إلى ملف requirements.txt

تقلّل بيئة وقت تشغيل Python 3 في App Engine بشكل كبير من النفقات العامة لاستخدام مكتبات تابعة لجهات خارجية. كل ما عليك فعله هو إدراجها في requirements.txt. لاستخدام الخدمات المجمّعة في Python 3، أضِف حزمة App Engine SDK، appengine-python-standard، إليها. تنضم حزمة SDK إلى Flask من الوحدة 1:

flask
appengine-python-standard

تعديل ملف app.yaml

اتّبِع الخطوات التالية لتطبيق تغييرات الإعداد على ملف app.yaml:

  1. استبدِل التوجيه runtime بإصدار Python 3 المتوافق، مثلاً حدِّد python310 للإصدار 3.10 من Python.
  2. احذف التوجيهين threadsafe وapi_version لأنّهما غير مستخدَمَين في Python 3.
  3. احذف القسم handlers بالكامل لأنّ هذا التطبيق يحتوي فقط على معالِجات النصوص البرمجية. إذا كان تطبيقك يتضمّن معالِجات ملفات ثابتة، اترِكها كما هي في handlers.
  4. لا يتيح وقت تشغيل Python 3 استخدام مكتبات مدمجة تابعة لجهات خارجية، كما هو الحال في وقت تشغيل Python 2. إذا كان تطبيقك يحتوي على قسم libraries في app.yaml، احذف القسم بالكامل. (يجب إدراج الحِزم المطلوبة فقط في requirements.txt، مثل المكتبات غير المضمّنة). لا يتضمّن نموذج تطبيقنا قسم libraries، لذا انتقِل إلى الخطوة التالية.
  5. أنشئ توجيه app_engine_apis تم ضبطه على true لاستخدامه، ويتوافق ذلك مع إضافة حزمة App Engine SDK إلى requirements.txt أعلاه.

في ما يلي ملخّص للتغييرات المطلوبة في app.yaml:

قبل:

runtime: python27
threadsafe: yes
api_version: 1

handlers:
- url: /.*
  script: main.app

بعد:

runtime: python310
app_engine_apis: true

ملفات الإعداد الأخرى

بما أنّه يجب إدراج جميع الحِزم التابعة لجهات خارجية في requirements.txt فقط، ما لم يكن لديك شيء خاص في appengine_config.py، لن تحتاج إليه، لذا احذفه. وبالمثل، بما أنّه يتم تثبيت جميع المكتبات التابعة لجهات خارجية تلقائيًا أثناء عملية الإنشاء، لن تحتاج إلى نسخها أو توفيرها، ما يعني عدم الحاجة إلى الأمر pip install أو المجلد lib، لذا احذفهما. تلخيص:

  • حذف ملف appengine_config.py
  • حذف مجلد lib

بهذا تنتهي جميع تغييرات الإعدادات الضرورية.

5- تعديل الرمز البرمجي للتطبيق

يتطلّب الوصول إلى معظم الخدمات المتاحة ضمن الحزمة في بيئة وقت التشغيل Python 3 جزءًا قصيرًا من الرمز البرمجي يغلّف عنصر تطبيق واجهة بوابة خادم الويب (WSGI) في main.py. دالة التغليف هي google.appengine.api.wrap_wsgi_app()، ويمكنك استخدامها من خلال استيرادها وتغليف عنصر WSGI بها. أدخِل التغييرات أدناه لتعكس التحديث المطلوب لـ Flask في main.py:

قبل:

from flask import Flask, render_template, request
from google.appengine.ext import ndb

app = Flask(__name__)

بعد:

from flask import Flask, render_template, request
from google.appengine.api import wrap_wsgi_app
from google.appengine.ext import ndb

app = Flask(__name__)
app.wsgi_app = wrap_wsgi_app(app.wsgi_app)

اطّلِع على المستندات للحصول على أمثلة على تضمين WSGI في أُطر عمل Python الأخرى.

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

بهذا نكون قد انتهينا من جميع التغييرات اللازمة لإضافة استخدام الخدمات المجمّعة في App Engine إلى نموذج تطبيق Module 1. التطبيق متوافق حاليًا مع Python 2 و3، لذا لن تحتاج إلى إجراء أي تغييرات إضافية لتكييفه مع Python 3 بخلاف ما سبق أن أجريته في عملية الإعداد. الخطوة الأخيرة: نشر هذا التطبيق المعدَّل في وقت تشغيل الجيل التالي من App Engine Python 3 والتأكّد من نجاح التحديثات.

6. الملخّص/التنظيف

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

نشر التطبيق والتحقّق منه

انشر تطبيق Python 3 باستخدام gcloud app deploy، وتأكَّد من أنّ التطبيق يعمل كما كان يعمل في Python 2. لن تتغير أي من الوظائف، لذا يجب أن يكون الناتج مطابقًا لتطبيق الوحدة 1:

a7a9d2b80d706a2b.png

ملاحظات أخيرة

نهنئك على اتّخاذ الخطوة الأولى لتكييف تطبيقات Python 2 App Engine إلى Python 3 مع الاحتفاظ باستخدام الخدمات المجمّعة في الوقت الحالي.

تَنظيم

للجمهور العام

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

للتوضيح، يؤدي النشر على منصة حوسبة بدون خادم في Google Cloud، مثل App Engine، إلى تكبُّد تكاليف بسيطة للإنشاء والتخزين. تتضمّن Cloud Build حصة مجانية خاصة بها، وكذلك Cloud Storage. ويؤدي تخزين هذه الصورة إلى استهلاك جزء من هذه الحصة. ومع ذلك، قد تكون مقيمًا في منطقة لا تتوفّر فيها هذه الطبقة المجانية، لذا عليك الانتباه إلى استخدامك لمساحة التخزين لتقليل التكاليف المحتملة. تتضمّن "المجلدات" المحدّدة في Cloud Storage التي يجب مراجعتها ما يلي:

  • console.cloud.google.com/storage/browser/LOC.artifacts.PROJECT_ID.appspot.com/containers/images
  • console.cloud.google.com/storage/browser/staging.PROJECT_ID.appspot.com
  • تعتمد روابط مساحة التخزين أعلاه على PROJECT_ID و *LOC*، على سبيل المثال، "us" إذا كان تطبيقك مستضافًا في الولايات المتحدة.

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

خاص بهذا الدرس التطبيقي حول الترميز

الخدمات المدرَجة أدناه خاصة بهذا الدرس التطبيقي حول الترميز. يُرجى الرجوع إلى مستندات كل منتج للحصول على مزيد من المعلومات:

الخطوات التالية

يمكنك اتّخاذ عدة إجراءات من هنا:

  1. تعديل الرمز باستخدام الخدمات المجمّعة التي تتطلّب المزيد من التغييرات على الرمز
  2. نقل البيانات من الخدمات المجمّعة إلى منتجات Cloud المستقلة
  3. نقل البيانات من App Engine إلى منصة أخرى بلا خادم على السحابة الإلكترونية

يتطلّب الوصول إلى الخدمات الأخرى المجمّعة، مثل Blobstore وMail وDeferred، إجراء المزيد من التغييرات على الرموز البرمجية. تشمل وحدات نقل البيانات التي تركّز على التوقّف عن استخدام الخدمات المجمّعة القديمة في App Engine ما يلي:

لم تعُد App Engine هي المنصة الوحيدة بدون خادم في Google Cloud. إذا كان لديك تطبيق صغير على App Engine أو تطبيق بوظائف محدودة وتريد تحويله إلى خدمة مصغّرة مستقلة، أو إذا كنت تريد تقسيم تطبيق متكامل إلى عدة مكونات قابلة لإعادة الاستخدام، ستكون هذه أسبابًا وجيهة للنقل إلى Cloud Functions. إذا أصبحت عملية إنشاء الحاويات جزءًا من سير عمل تطوير التطبيقات، خاصةً إذا كانت تتألف من مسار CI/CD (التكامل المستمر/التسليم المتواصل أو النشر المستمر)، ننصحك بالانتقال إلى Cloud Run. تتناول الوحدات التدريبية التالية هذه السيناريوهات:

  • نقل البيانات من App Engine إلى Cloud Functions: يمكنك الاطّلاع على الوحدة 11
  • الانتقال من App Engine إلى Cloud Run: يمكنك الاطّلاع على الوحدة 4 لتضمين تطبيقك في حاوية باستخدام Docker، أو الوحدة 5 لإجراء ذلك بدون حاويات أو معرفة بـ Docker أو Dockerfile

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

بغض النظر عن وحدة النقل التي ستختارها، يمكنك الوصول إلى كل محتوى Serverless Migration Station (الدروس البرمجية والفيديوهات ورمز المصدر [عند توفّره]) من خلال مستودع المصدر المفتوح. يوفّر مستودع README أيضًا إرشادات حول عمليات نقل البيانات التي يجب أخذها في الاعتبار وأي "ترتيب" ذي صلة لوحدات نقل البيانات.

7. مراجع إضافية

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

مشاكل/ملاحظات بشأن الدروس التطبيقية حول الترميز

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

مراجع لنقل البيانات

يمكنك العثور على روابط لمجلدات المستودع الخاصة بالوحدة التدريبية 1 (البداية) والوحدة التدريبية 1b (النهاية) في الجدول أدناه. يمكن الوصول إليها أيضًا من مستودع جميع عمليات نقل الدروس التطبيقية حول الترميز في App Engine.

Codelab

Python 2

Python 3

الوحدة 1

code

لا ينطبق

الوحدة 17 (هذا الدرس التطبيقي حول الترميز)

لا ينطبق

code (mod1b-flask)

مراجع متوفرة على الإنترنت

في ما يلي مراجع على الإنترنت قد تكون ذات صلة بهذا البرنامج التعليمي:

الخدمات المجمّعة في App Engine

مستندات App Engine العامة

معلومات أخرى حول السحابة الإلكترونية

الفيديوهات

الترخيص

يخضع هذا العمل لترخيص المشاع الإبداعي مع نسب العمل إلى مؤلفه 2.0 Generic License.