App Engine टास्क सूची से माइग्रेट करना, टास्क को क्लाउड टास्क में पुश करना (मॉड्यूल 8)

1. खास जानकारी

कोडलैब के बिना सर्वर वाले माइग्रेशन स्टेशन की सीरीज़ (अपने हिसाब से इस्तेमाल किए जाने वाले ट्यूटोरियल) और मिलते-जुलते वीडियो का मकसद, Google Cloud के बिना सर्वर वाले डेवलपर को अपने ऐप्लिकेशन को आधुनिक बनाने में मदद करना है. ऐसा करने के लिए, उन्हें लेगसी सेवाओं का इस्तेमाल बंद करना होगा. ऐसा करने के लिए, उन्हें एक या एक से ज़्यादा माइग्रेशन में मदद मिलेगी. ऐसा करने से, आपके ऐप्लिकेशन ज़्यादा पोर्टेबल बन जाते हैं. साथ ही, आपको ज़्यादा विकल्प और सुविधाएं भी मिलती हैं. इससे, क्लाउड प्रॉडक्ट की बड़ी रेंज को इंटिग्रेट किया जा सकता है और उन्हें ऐक्सेस किया जा सकता है. साथ ही, नई भाषाओं में रिलीज़ किए जाने वाले ऐप्लिकेशन पर आसानी से अपग्रेड किया जा सकता है. शुरुआत में App Engine (स्टैंडर्ड एनवायरमेंट) वाले डेवलपर पर ध्यान दिया जाता है. हालांकि, यह सीरीज़ इतनी बड़ी है कि इसमें Cloud Functions और Cloud Run जैसे बिना सर्वर वाले प्लैटफ़ॉर्म या लागू होने पर, उन्हें शामिल किया जा सकता है.

इस कोडलैब का मकसद Python 2 App Engine डेवलपर को यह बताना है कि App Engine टास्क सूची (पुश टास्क) से क्लाउड टास्क में कैसे माइग्रेट करें. Datastore के ऐक्सेस के लिए, App Engine NDB से Cloud NDB पर इंप्लिसिट माइग्रेशन भी होता है. इसके बारे में मुख्य तौर पर मॉड्यूल 2 में बताया गया है.

हमने मॉड्यूल 7 में, पुश टास्क के इस्तेमाल को शामिल किया. साथ ही, उस इस्तेमाल को मॉड्यूल 8 में Cloud Tasks में माइग्रेट किया. इसके बाद, मॉड्यूल 9 में Python 3 और Cloud Datastore पर भी माइग्रेट कर दिया गया. पुल बनाने के लिए, टास्क की सूची का इस्तेमाल करने वाले लोग, Cloud Pub/Sub पर माइग्रेट हो जाएंगे. इसके लिए, उन्हें मॉड्यूल 18-19 के हिसाब से पढ़ना चाहिए.

आपको इनके बारे में जानकारी मिलेगी

आपको इनकी ज़रूरत होगी

सर्वे

इस ट्यूटोरियल का इस्तेमाल कैसे किया जाएगा?

सिर्फ़ इसे पढ़ें इसे पढ़ें और कसरतों को पूरा करें

Python के साथ अपने अनुभव को आप कितनी रेटिंग देंगे?

शुरुआती इंटरमीडिएट कुशल

Google Cloud की सेवाएं इस्तेमाल करने का आपका अनुभव कैसा रहा?

शुरुआती इंटरमीडिएट कुशल

2. बैकग्राउंड

App Engine टास्क सूची में पुश और पुल, दोनों तरह के टास्क काम करते हैं. ऐप्लिकेशन पोर्टेबिलिटी को बेहतर बनाने के लिए, Google Cloud की टीम, 'टास्क सूची' जैसी लेगसी सेवाओं से, क्लाउड स्टैंडअलोन या तीसरे पक्ष की मिलती-जुलती सेवाओं पर माइग्रेट करने का सुझाव देती है.

पुल टास्क माइग्रेशन की सुविधा, माइग्रेशन मॉड्यूल 18 से 19 वर्शन में उपलब्ध है. वहीं, मॉड्यूल 7-9 वर्शन, पुश टास्क माइग्रेशन पर फ़ोकस करता है. App Engine टास्क सूची के पुश टास्क से माइग्रेट करने के लिए, हमने इसके इस्तेमाल को मौजूदा Python 2 App Engine सैंपल ऐप्लिकेशन में जोड़ा है. यह नई पेज विज़िट को रजिस्टर करता है और सबसे हाल की विज़िट को दिखाता है. मॉड्यूल 7 कोडलैब में सबसे पुरानी विज़िट मिटाने के लिए पुश टास्क जोड़ा जाता है—वे फिर से कभी नहीं दिखाई जाएंगी, इसलिए उन्हें Datastore में ज़्यादा स्टोरेज क्यों लेना चाहिए? यह मॉड्यूल 8 कोडलैब समान काम की क्षमता को सुरक्षित रखता है लेकिन सूची बनाने की बुनियादी प्रक्रिया को टास्क सूची से पुश टास्क को क्लाउड टास्क पर माइग्रेट करता है साथ ही डेटास्टोर ऐक्सेस के लिए मॉड्यूल 2 को App Engine NDB से Cloud NDB में माइग्रेट करता है.

इस ट्यूटोरियल में ये चरण बताए गए हैं:

  1. सेटअप/प्रीवर्क
  2. कॉन्फ़िगरेशन अपडेट करें
  3. ऐप्लिकेशन कोड बदलें

3. सेटअप/प्रीवर्क

इस सेक्शन में, इन कामों को करने का तरीका बताया गया है:

  1. अपना क्लाउड प्रोजेक्ट सेट अप करें
  2. बेसलाइन ऐप्लिकेशन का नमूना डाउनलोड करें
  3. (फिर से) बेसलाइन ऐप्लिकेशन डिप्लॉय करना और उसकी पुष्टि करना
  4. Google Cloud की नई सेवाएं/एपीआई चालू करें

इन चरणों से यह पक्का होता है कि आपने सही कोड डाला है और आपका सैंपल ऐप्लिकेशन, Cloud की सेवाओं पर माइग्रेट करने के लिए तैयार है.

1. प्रोजेक्ट सेटअप करें

अगर आपने मॉड्यूल 7 कोडलैब पूरा कर लिया है, तो उसी प्रोजेक्ट (और कोड) का फिर से इस्तेमाल करें. इसके अलावा, नया प्रोजेक्ट बनाएं या किसी मौजूदा प्रोजेक्ट का फिर से इस्तेमाल करें. पक्का करें कि प्रोजेक्ट में एक चालू बिलिंग खाता और चालू App Engine ऐप्लिकेशन हो. अपना प्रोजेक्ट आईडी ढूंढें, क्योंकि कोडलैब (कोड बनाना सीखना) के दौरान आपको इसे अपने पास रखने की ज़रूरत है. इसका इस्तेमाल तब करें, जब आपको PROJECT_ID वैरिएबल मिले.

2. बेसलाइन ऐप्लिकेशन का नमूना डाउनलोड करें

इसकी ज़रूरी शर्तों में से एक है, Module 7 App Engine ऐप्लिकेशन: मॉड्यूल 7 कोडलैब (सुझाया गया) को पूरा करें या रेपो से मॉड्यूल 7 ऐप्लिकेशन कॉपी करें. आप अपना या हमारा, मॉड्यूल 7 कोड इस्तेमाल करें. हम इसी से शुरुआत करेंगे ("START"). इस कोडलैब से, माइग्रेशन की प्रोसेस के बारे में जानकारी मिलती है. इससे यह पता चलता है कि कोड 8 रिपो फ़ोल्डर ("FINISH") में मौजूद कोड से मेल खाता है या नहीं.

आप चाहे जो भी मॉड्यूल 7 ऐप्लिकेशन इस्तेमाल करें, फ़ोल्डर यहां दिए गए फ़ोल्डर की तरह दिखना चाहिए. इसके अलावा, यह lib फ़ोल्डर के साथ भी दिख सकता है:

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

3. (फिर से) बेसलाइन ऐप्लिकेशन डिप्लॉय करना और उसकी पुष्टि करना

मॉड्यूल 7 ऐप्लिकेशन को डिप्लॉय करने के लिए, यह तरीका अपनाएं:

  1. अगर lib फ़ोल्डर मौजूद है, तो उसे मिटा दें और lib को फिर से भरने के लिए pip install -t lib -r requirements.txt चलाएं. अगर आपकी डेवलपमेंट मशीन पर Python 2 और 3, दोनों इंस्टॉल किए गए हैं, तो आपको इसके बजाय pip2 का इस्तेमाल करना पड़ सकता है.
  2. पक्का करें कि आपने gcloud कमांड-लाइन टूल इंस्टॉल किया हो और उसे शुरू किया हो. साथ ही, इसके इस्तेमाल की जानकारी की समीक्षा की हो.
  3. (ज़रूरी नहीं) अगर आपको हर gcloud निर्देश के साथ PROJECT_ID नहीं डालना है, तो अपने क्लाउड प्रोजेक्ट को gcloud config set project PROJECT_ID के साथ सेट करें.
  4. gcloud app deploy के साथ सैंपल ऐप्लिकेशन डिप्लॉय करें
  5. पक्का करें कि ऐप्लिकेशन बिना किसी समस्या के ठीक से काम कर रहा हो. अगर आपने मॉड्यूल 7 कोडलैब (कोड बनाना सीखना) पूरा कर लिया है, तो यह ऐप्लिकेशन वेबसाइट पर सबसे ज़्यादा आने वाले लोगों की जानकारी दिखाता है. साथ ही, इसमें सबसे हाल की विज़िट भी दिखती है. इसकी जानकारी नीचे दी गई है. सबसे नीचे उन पुराने टास्क की जानकारी दी गई है जिन्हें मिटा दिया जाएगा.

4aa8a2cb5f527079.png

4. Google Cloud की नई सेवाएं/एपीआई चालू करें

पुराने ऐप्लिकेशन में App Engine की बंडल सेवाएं इस्तेमाल की जाती थीं, जिनके लिए अतिरिक्त सेटअप की ज़रूरत नहीं होती. हालांकि, स्टैंडअलोन क्लाउड सेवाएं काम करती हैं. अपडेट किया हुआ ऐप्लिकेशन, Cloud Tasks और Cloud Datastore (Cloud NDB क्लाइंट लाइब्रेरी के ज़रिए) दोनों का इस्तेमाल करेगा. क्लाउड के कई प्रॉडक्ट में "हमेशा मुफ़्त" सुविधा उपलब्ध है टियर कोटा. इसमें App Engine, Cloud Datastore, और Cloud Tasks शामिल हैं. जब तक आप इन सीमाओं के अंदर बने रहेंगे, तब तक आपको इस ट्यूटोरियल को पूरा करने का कोई शुल्क नहीं देना चाहिए. Cloud API को, आपकी प्राथमिकता के हिसाब से Cloud Console या कमांड-लाइन से चालू किया जा सकता है.

Cloud Console से

Cloud Console में, एपीआई मैनेजर की लाइब्रेरी पेज (सही प्रोजेक्ट के लिए) पर जाएं. इसके बाद, पेज के बीच में मौजूद खोज बार का इस्तेमाल करके, Cloud Datastore और Cloud Tasks एपीआई खोजें:

c7a740304e9d35b.png

हर एपीआई के लिए, चालू करें बटन पर अलग से क्लिक करें. इससे आपको बिलिंग की जानकारी देने के लिए कहा जा सकता है. यह उदाहरण है, जिसमें Cloud Pub/Sub एपीआई लाइब्रेरी पेज की सुविधा है. इस कोडलैब के लिए Pub/Sub एपीआई चालू न करें, सिर्फ़ Cloud Tasks और Datastore के लिए:

1b6c0a2a73124f6b.jpeg

कमांड-लाइन से

यह सुविधा, कंसोल से एपीआई को चालू करता है और विज़ुअल तौर पर जानकारी देता है. हालांकि, कुछ कंपनियां कमांड लाइन को प्राथमिकता देती हैं. एक साथ दोनों एपीआई चालू करने के लिए, gcloud services enable cloudtasks.googleapis.com datastore.googleapis.com निर्देश जारी करें:

$ gcloud services enable cloudtasks.googleapis.com datastore.googleapis.com
Operation "operations/acat.p2-aaa-bbb-ccc-ddd-eee-ffffff" finished successfully.

आपसे बिलिंग जानकारी के लिए प्रॉम्प्ट किया जा सकता है. अगर आपको अन्य Cloud API चालू करके, यह जानना है कि उनके "यूआरआई" क्या हैं ये एपीआई हर एपीआई के लाइब्रेरी पेज पर सबसे नीचे देखे जा सकते हैं. उदाहरण के लिए, pubsub.googleapis.com को "सेवा का नाम" के तौर पर देखें Pub/Sub पेज पर सबसे नीचे मौजूद होना चाहिए.

इन चरणों को पूरा करने के बाद, आपका प्रोजेक्ट एपीआई ऐक्सेस कर सकेगा. अब इन एपीआई का इस्तेमाल करने के लिए, ऐप्लिकेशन को अपडेट किया जा सकता है.

4. कॉन्फ़िगरेशन अपडेट करें

क्लाउड क्लाइंट लाइब्रेरी के ज़्यादा इस्तेमाल की वजह से, कॉन्फ़िगरेशन में खास तौर पर अपडेट होते हैं. आप चाहे किसी भी ऐप्लिकेशन का इस्तेमाल करें, आपको उन ऐप्लिकेशन में एक जैसे बदलाव करने होंगे जो किसी भी क्लाउड क्लाइंट लाइब्रेरी का इस्तेमाल नहीं करते.

requirements.txt

मॉड्यूल 8, मॉड्यूल 1 से Cloud NDB और Cloud Tasks के साथ App Engine NDB और टास्क सूची के इस्तेमाल को एक्सचेंज करता है. मॉड्यूल 7 से flask को जोड़ने के लिए, google-cloud-ndb और google-cloud-tasks, दोनों को requirements.txt में जोड़ें:

flask
google-cloud-ndb
google-cloud-tasks

इस requirements.txt फ़ाइल में कोई वर्शन नंबर मौजूद नहीं है. इसका मतलब है कि नए वर्शन चुने गए हैं. अगर कोई गड़बड़ी आती है, तो ऐप्लिकेशन का कोई वर्शन नंबर बताएं, ताकि ऐप्लिकेशन के उन वर्शन को लॉक किया जा सके जो ठीक से काम कर रहे हैं.

app.yaml

क्लाउड क्लाइंट लाइब्रेरी का इस्तेमाल करते समय, Python 2 App Engine रनटाइम को grpcio और setuptools जैसे तीसरे पक्ष के खास पैकेज की ज़रूरत होती है. Python 2 के उपयोगकर्ताओं को, app.yaml में उपलब्ध वर्शन या "सबसे नया" के साथ-साथ, इस तरह की बिल्ट-इन लाइब्रेरी की सूची बनानी होगी. अगर आपके पास अब तक libraries सेक्शन नहीं है, तो एक सेक्शन बनाकर दोनों लाइब्रेरी को इस तरह जोड़ें:

libraries:
- name: grpcio
  version: latest
- name: setuptools
  version: latest

अपने ऐप्लिकेशन को माइग्रेट करते समय, उसमें पहले से एक libraries सेक्शन मौजूद हो सकता है. अगर ऐसा होता है और grpcio और setuptools मौजूद नहीं हैं, तो उन्हें अपने मौजूदा libraries सेक्शन में जोड़ें. अपडेट किया गया app.yaml अब कुछ ऐसा दिखना चाहिए:

runtime: python27
threadsafe: yes
api_version: 1

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

libraries:
- name: grpcio
  version: latest
- name: setuptools
  version: latest

appengine_config.py

appengine_config.py में google.appengine.ext.vendor.add() कॉल, lib में मौजूद तीसरे पक्ष की आपकी कॉपी की गई लाइब्रेरी को आपके ऐप्लिकेशन से कनेक्ट करता है. इस कॉल को कभी-कभी "वेंडोरिंग" या "सेल्फ़-बंडलिंग" भी कहा जाता है. app.yaml के ऊपर, हमने पहले से मौजूद तीसरे पक्ष की लाइब्रेरी जोड़ी हैं. उन्हें आपके ऐप्लिकेशन को lib में पहले से मौजूद उन पैकेज से जोड़ने के लिए setuptools.pkg_resources.working_set.add_entry() की ज़रूरत होती है. यहां ओरिजनल मॉड्यूल 1 appengine_config.py दिया गया है. साथ ही, मॉड्यूल 8 को अपडेट करने के बाद यह भी बताया गया है:

पहले:

from google.appengine.ext import vendor

# Set PATH to your libraries folder.
PATH = 'lib'
# Add libraries installed in the PATH folder.
vendor.add(PATH)

बाद में:

import pkg_resources
from google.appengine.ext import vendor

# Set PATH to your libraries folder.
PATH = 'lib'
# Add libraries installed in the PATH folder.
vendor.add(PATH)
# Add libraries to pkg_resources working set to find the distribution.
pkg_resources.working_set.add_entry(PATH)

ऐसा ही एक विवरण App Engine माइग्रेशन दस्तावेज़ में भी मिल सकता है.

5. ऐप्लिकेशन कोड बदलें

यह सेक्शन मुख्य ऐप्लिकेशन फ़ाइल main.py के अपडेट दिखाता है. यह App Engine टास्क सूची की पुश सूचियों को Cloud Tasks से बदल देता है. वेब टेंप्लेट templates/index.html में कोई बदलाव नहीं हुआ है. दोनों ऐप्लिकेशन को एक जैसा काम करना होगा और एक जैसा डेटा दिखेगा. मुख्य ऐप्लिकेशन में किए गए बदलावों को इन चार "कामों की सूची" में बांटा गया है:

  1. इंपोर्ट और शुरू करने की प्रोसेस अपडेट करें
  2. डेटा मॉडल की सुविधाओं को अपडेट करना (Cloud NDB)
  3. Cloud Tasks (और Cloud NDB) पर माइग्रेट करना
  4. अपडेट (पुश) टास्क हैंडलर

1. इंपोर्ट और शुरू करने की प्रोसेस अपडेट करें

  1. App Engine NDB (google.appengine.ext.ndb) और टास्क सूची (google.appengine.api.taskqueue) को Cloud NDB (google.cloud.ndb) और Cloud Tasks (google.cloud.tasks) से बदलें.
  2. क्लाउड क्लाइंट लाइब्रेरी को "एपीआई क्लाइंट" बनाने और शुरू करने की ज़रूरत होती है इन्हें ds_client और ts_client को असाइन करें.
  3. टास्क सूची के दस्तावेज़ में बताया गया है: "App Engine एक डिफ़ॉल्ट पुश क्यू उपलब्ध कराता है, जिसका नाम default है. यह कॉन्फ़िगर हो चुका है और डिफ़ॉल्ट सेटिंग के साथ इस्तेमाल के लिए तैयार है." Cloud Tasks, default क्यू उपलब्ध नहीं कराता (क्योंकि यह App Engine से अलग एक स्टैंडअलोन क्लाउड प्रॉडक्ट है), इसलिए default नाम की क्लाउड टास्क की सूची बनाने के लिए नए कोड की ज़रूरत होती है.
  4. App Engine टास्क सूची में आपको कोई क्षेत्र तय करने की ज़रूरत नहीं है, क्योंकि यह उस क्षेत्र का इस्तेमाल करती है जहां आपका ऐप्लिकेशन चलता है. हालांकि, Cloud Tasks अब एक इंडिपेंडेंट प्रॉडक्ट है, इसलिए इसके लिए क्षेत्र की ज़रूरत होती है. यह इलाका उस क्षेत्र से मेल खाना चाहिए जहां आपका ऐप्लिकेशन चलता है. "पूरी तरह क्वालिफ़ाइड पाथ नेम" बनाने के लिए, क्षेत्र का नाम और Cloud प्रोजेक्ट आईडी ज़रूरी है का इस्तेमाल करें.

ऊपर तीसरे और चौथे बुलेट पॉइंट में बताए गए अपडेट में, ज़रूरी अतिरिक्त कॉन्सटेंट और इनिशलाइज़ेशन का बड़ा हिस्सा शामिल है. "पहले" में देखें और "बाद में" main.py में सबसे ऊपर जाकर ये बदलाव करें.

पहले:

from datetime import datetime
import logging
import time
from flask import Flask, render_template, request
from google.appengine.api import taskqueue
from google.appengine.ext import ndb

app = Flask(__name__)

बाद में:

from datetime import datetime
import json
import logging
import time
from flask import Flask, render_template, request
from google.cloud import ndb, tasks

app = Flask(__name__)
ds_client = ndb.Client()
ts_client = tasks.CloudTasksClient()

_, PROJECT_ID = google.auth.default()
REGION_ID = 'REGION_ID'    # replace w/your own
QUEUE_NAME = 'default'     # replace w/your own
QUEUE_PATH = ts_client.queue_path(PROJECT_ID, REGION_ID, QUEUE_NAME)

2. डेटा मॉडल की सुविधाओं को अपडेट करना (Cloud NDB)

App Engine NDB और Cloud NDB, करीब-करीब एक जैसे काम करते हैं. डेटा मॉडल और store_visit() फ़ंक्शन में कोई बड़ा बदलाव नहीं हुआ है. अंतर सिर्फ़ यह है कि store_visit() में Visit इकाई बनाने की सुविधा, अब Python with ब्लॉक में एनकैप्सुलेट कर देती है. Cloud NDB के लिए यह ज़रूरी है कि Datastore के सभी ऐक्सेस को उसके कॉन्टेक्स्ट मैनेजर से कंट्रोल किया जाए. इसलिए, with स्टेटमेंट है. नीचे दिए गए कोड स्निपेट, Cloud NDB पर माइग्रेट करते समय इस मामूली अंतर को दिखाते हैं. यह बदलाव लागू करें.

पहले:

class Visit(ndb.Model):
    'Visit entity registers visitor IP address & timestamp'
    visitor   = ndb.StringProperty()
    timestamp = ndb.DateTimeProperty(auto_now_add=True)

def store_visit(remote_addr, user_agent):
    'create new Visit entity in Datastore'
    Visit(visitor='{}: {}'.format(remote_addr, user_agent)).put()

बाद में:

class Visit(ndb.Model):
    'Visit entity registers visitor IP address & timestamp'
    visitor   = ndb.StringProperty()
    timestamp = ndb.DateTimeProperty(auto_now_add=True)

def store_visit(remote_addr, user_agent):
    'create new Visit entity in Datastore'
    with ds_client.context():
        Visit(visitor='{}: {}'.format(remote_addr, user_agent)).put()

3. Cloud Tasks (और Cloud NDB) पर माइग्रेट करना

इस माइग्रेशन में सबसे अहम बदलाव, लाइन बनाने के बुनियादी इन्फ़्रास्ट्रक्चर को स्विच करता है. ऐसा fetch_visits() फ़ंक्शन में होता है, जहां पुरानी विज़िट मिटाने के लिए एक (पुश) टास्क बनाया जाता है और उसके पूरे होने के लिए उन्हें सूची में जोड़ा जाता है. हालांकि, मॉड्यूल 7 की मूल सुविधाओं में कोई बदलाव नहीं हुआ है:

  1. सबसे हाल में वेबसाइट पर आने के बारे में क्वेरी.
  2. उन विज़िट को तुरंत लौटाने के बजाय, आखिरी Visit के टाइमस्टैंप को सेव करें, जो सबसे पुराना है—यानी इससे पहले वाली सभी विज़िट को मिटाना सुरक्षित है.
  3. Python के स्टैंडर्ड टूल का इस्तेमाल करके, टाइमस्टैंप को फ़्लोट और स्ट्रिंग के तौर पर दिखाएं. साथ ही, अलग-अलग क्षमताओं के हिसाब से, दोनों का इस्तेमाल करें. उदाहरण के लिए, उपयोगकर्ता को दिखाएं, लॉग में जोड़ें, हैंडलर में पास करें वगैरह.
  4. यूआरएल के तौर पर /trim के साथ, इस टाइमस्टैंप के पेलोड के तौर पर पुश टास्क बनाएं.
  5. टास्क हैंडलर को एचटीटीपी POST के ज़रिए उस यूआरएल पर कॉल किया जाता है.

इस वर्कफ़्लो को "पहले" में दिखाया गया है कोड स्निपेट:

पहले:

def fetch_visits(limit):
    'get most recent visits & add task to delete older visits'
    data = Visit.query().order(-Visit.timestamp).fetch(limit)
    oldest = time.mktime(data[-1].timestamp.timetuple())
    oldest_str = time.ctime(oldest)
    logging.info('Delete entities older than %s' % oldest_str)
    taskqueue.add(url='/trim', params={'oldest': oldest})
    return data, oldest_str

हालांकि, उनके काम करने के तरीके में कोई बदलाव नहीं होगा, लेकिन Cloud Tasks एक ऐसा प्लैटफ़ॉर्म बन जाएगा जहां यह काम करता है. इस बदलाव को लागू करने वाले अपडेट में ये शामिल हैं:

  1. Visit क्वेरी को Python with ब्लॉक में रैप करें (मॉड्यूल 2 को Cloud NDB पर माइग्रेट करना)
  2. क्लाउड टास्क का मेटाडेटा बनाएं, जिसमें टाइमस्टैंप पेलोड और यूआरएल जैसे एट्रिब्यूट शामिल हो सकते हैं. हालांकि, पेलोड में MIME टाइप और JSON-एन्कोड भी जोड़ें.
  3. सूची के पूरे पाथनाम और मेटाडेटा का इस्तेमाल करके टास्क बनाने के लिए, Cloud Tasks API क्लाइंट का इस्तेमाल करें.

fetch_visits() में हुए इन बदलावों का उदाहरण नीचे दिया गया है:

बाद में:

def fetch_visits(limit):
    'get most recent visits & add task to delete older visits'
    with ds_client.context():
        data = Visit.query().order(-Visit.timestamp).fetch(limit)
    oldest = time.mktime(data[-1].timestamp.timetuple())
    oldest_str = time.ctime(oldest)
    logging.info('Delete entities older than %s' % oldest_str)
    task = {
        'app_engine_http_request': {
            'relative_uri': '/trim',
            'body': json.dumps({'oldest': oldest}).encode(),
            'headers': {
                'Content-Type': 'application/json',
            },
        }
    }
    ts_client.create_task(parent=QUEUE_PATH, task=task)
    return data, oldest_str

4. अपडेट (पुश) टास्क हैंडलर

(पुश) टास्क हैंडलर फ़ंक्शन के लिए खास अपडेट की ज़रूरत नहीं है; इसे सिर्फ़ चलाने की ज़रूरत होती है. यह टास्क सूची या क्लाउड टास्क पर लागू होता है. "कोड का मतलब कोड है," इसलिए कहा जाता है. हालांकि, कुछ कुछ मामूली बदलाव किए गए हैं:

  1. टाइमस्टैंप पेलोड को टास्क की सूची में हर बार पास किया गया. हालांकि, इसे Cloud Tasks के लिए JSON-कोड में बदला गया था. इसलिए, इवेंट पर पहुंचने के बाद, इसे JSON-पार्स करना ज़रूरी है.
  2. टास्क सूची के साथ, /trim को किए गए एचटीटीपी POST कॉल में application/x-www-form-urlencoded का इंप्लिसिट MIMEटाइप मौजूद था. हालांकि, Cloud Tasks में इसे application/json के तौर पर साफ़ तौर पर दिखाया गया था. इसलिए, पेलोड को एक्सट्रैक्ट करने का कुछ अलग तरीका है.
  3. Cloud NDB API क्लाइंट कॉन्टेक्स्ट मैनेजर का इस्तेमाल करें. इसके लिए, Cloud NDB पर मॉड्यूल 2 माइग्रेशन करें.

टास्क हैंडलर में ये बदलाव करने से पहले और बाद में, trim() कोड स्निपेट दिए गए हैं:

पहले:

@app.route('/trim', methods=['POST'])
def trim():
    '(push) task queue handler to delete oldest visits'
    oldest = request.form.get('oldest', type=float)
    keys = Visit.query(
            Visit.timestamp < datetime.fromtimestamp(oldest)
    ).fetch(keys_only=True)
    nkeys = len(keys)
    if nkeys:
        logging.info('Deleting %d entities: %s' % (
                nkeys, ', '.join(str(k.id()) for k in keys)))
        ndb.delete_multi(keys)
    else:
        logging.info('No entities older than: %s' % time.ctime(oldest))
    return ''   # need to return SOME string w/200

बाद में:

@app.route('/trim', methods=['POST'])
def trim():
    '(push) task queue handler to delete oldest visits'
    oldest = float(request.get_json().get('oldest'))
    with ds_client.context():
        keys = Visit.query(
                Visit.timestamp < datetime.fromtimestamp(oldest)
        ).fetch(keys_only=True)
        nkeys = len(keys)
        if nkeys:
            logging.info('Deleting %d entities: %s' % (
                    nkeys, ', '.join(str(k.id()) for k in keys)))
            ndb.delete_multi(keys)
        else:
            logging.info(
                    'No entities older than: %s' % time.ctime(oldest))
    return ''   # need to return SOME string w/200

मुख्य ऐप्लिकेशन हैंडलर root() और वेब टेंप्लेट templates/index.html में कोई अपडेट नहीं है.

6. खास जानकारी/क्लीनअप

यह सेक्शन, कोडलैब के इस मॉड्यूल को रैप करके पूरा करता है. इसके लिए, ऐप्लिकेशन को डिप्लॉय किया जाता है. साथ ही, यह पुष्टि की जाती है कि यह सही तरीके से और किसी भी नतीजे पर दिखने वाले आउटपुट के हिसाब से काम करता है या नहीं. ऐप्लिकेशन की पुष्टि करने के बाद, सभी क्लीनअप करें और आगे की कार्रवाई करें.

ऐप्लिकेशन डिप्लॉय करें और उसकी पुष्टि करें

gcloud app deploy के साथ अपना ऐप्लिकेशन डिप्लॉय करें. इसका आउटपुट, मॉड्यूल 7 ऐप्लिकेशन जैसा होना चाहिए. हालांकि, यह जानना ज़रूरी है कि आपने एक बिलकुल अलग पुश क्यू प्रॉडक्ट में बदलाव किया है. अब आपका ऐप्लिकेशन, पहले से ज़्यादा पोर्टेबल होगा!

4aa8a2cb5f527079.png

व्यवस्थित करें

सामान्य

अगर आपका काम अभी हो गया है, तो हमारा सुझाव है कि आप बिलिंग से बचने के लिए अपना App Engine ऐप्लिकेशन बंद कर दें. हालांकि, अगर आपको कुछ और टेस्ट या एक्सपेरिमेंट करना है, तो App Engine प्लैटफ़ॉर्म का एक मुफ़्त कोटा है. अगर इस्तेमाल के टीयर को पार नहीं किया जा रहा है, तो आपसे शुल्क नहीं लिया जाएगा. यह कंप्यूट के लिए है. हालांकि, काम के App Engine की सेवाओं के लिए भी शुल्क लिया जा सकता है. इसलिए, ज़्यादा जानकारी के लिए इसका कीमत पेज देखें. अगर इस माइग्रेशन में क्लाउड की अन्य सेवाएं शामिल हैं, तो उनका बिल अलग से भेजा जाता है. दोनों ही मामलों में, अगर लागू हो, तो "इस कोडलैब के लिए खास" सेक्शन देखें सेक्शन देखें.

अगर आपको पूरी जानकारी देनी है, तो App Engine जैसे Google Cloud के बिना सर्वर वाले कंप्यूट प्लैटफ़ॉर्म पर डिप्लॉय करने पर, मामूली बनाने और स्टोरेज का खर्च उठाना पड़ता है. Cloud Storage की तरह Cloud Build का अपना अलग कोटा होता है. उस इमेज का स्टोरेज, उसके कुछ हिस्से का इस्तेमाल करता है. हालांकि, हो सकता है कि आप किसी ऐसे क्षेत्र में हों जहां ऐसा कोई फ़्री टीयर उपलब्ध न हो. इसलिए, संभावित लागत को कम करने के लिए, अपने स्टोरेज के इस्तेमाल को ध्यान में रखें. 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" अगर आपका ऐप्लिकेशन अमेरिका में होस्ट किया जाता है.

दूसरी ओर, अगर आपको इस ऐप्लिकेशन या इससे जुड़े दूसरे माइग्रेशन कोडलैब का इस्तेमाल नहीं करना है और सब कुछ पूरी तरह से मिटाना है, तो अपना प्रोजेक्ट बंद कर दें.

इस कोडलैब के लिए खास

नीचे दी गई सेवाएं, इस कोडलैब के लिए यूनीक हैं. ज़्यादा जानकारी के लिए हर प्रॉडक्ट के दस्तावेज़ देखें:

अगले चरण

इसके बाद, ऐप्लिकेशन इंजन टास्क की सूची के पुश टास्क से क्लाउड टास्क में माइग्रेट हो जाता है. अगर आपको इस ऐप्लिकेशन को Python 3 पर पोर्ट करना है और Cloud NDB से Cloud Datastore पर माइग्रेट करना है, तो मॉड्यूल 9 का इस्तेमाल करें.

Cloud NDB, खास तौर पर Python 2 App Engine डेवलपर के लिए मौजूद है. इससे, उपयोगकर्ताओं को करीब-करीब एक जैसा अनुभव मिलता है. हालांकि, Cloud Datastore की खुद की क्लाइंट लाइब्रेरी है जिसे App Engine का इस्तेमाल न करने वाले उपयोगकर्ताओं या नए (Python 3) App Engine के उपयोगकर्ताओं के लिए बनाया गया है. हालांकि, Cloud NDB, Python 2 और 3 के लिए उपलब्ध है. इसलिए, Cloud Datastore में माइग्रेट करने की ज़रूरत नहीं है.

Cloud NDB और Cloud Datastore, दोनों Datastore (भले ही अलग-अलग तरीकों से) को ऐक्सेस करते हैं. इसलिए, Cloud Datastore का इस्तेमाल सिर्फ़ तब किया जा सकता है, जब आपके पास Cloud Datastore का इस्तेमाल करने वाले दूसरे ऐप्लिकेशन हों, जिनमें App Engine के बजाय दूसरे ऐप्लिकेशन भी शामिल हों. साथ ही, आपको एक ही Datastore क्लाइंट लाइब्रेरी पर मानक तय करना हो. मॉड्यूल 3 में Cloud NDB से Cloud Datastore में यह वैकल्पिक माइग्रेशन अपने-आप (टास्क सूची या क्लाउड टास्क के बिना) भी शामिल है.

मॉड्यूल 3, 8, और 9 के अलावा, App Engine की लेगसी बंडल सेवाओं को बंद करने पर फ़ोकस करने वाले अन्य माइग्रेशन मॉड्यूल में ये शामिल हैं:

Google Cloud में, अब सिर्फ़ बिना सर्वर वाला प्लैटफ़ॉर्म App Engine है. अगर आपके पास कोई छोटा App Engine ऐप्लिकेशन है या कोई ऐसा ऐप्लिकेशन है जिसमें सीमित सुविधाएं हैं और आपको उसे स्टैंडअलोन माइक्रोसर्विस में बदलना है या किसी मोनोलिथिक ऐप्लिकेशन को फिर से इस्तेमाल किए जा सकने वाले कई कॉम्पोनेंट में बांटना है, तो Cloud Functions का इस्तेमाल करने के बारे में सोचें. अगर कंटेनराइज़ेशन आपके ऐप्लिकेशन डेवलपमेंट वर्कफ़्लो का हिस्सा बन गया है, तो खास तौर पर अगर उसमें CI/CD (लगातार इंटिग्रेशन/लगातार डिलीवरी या डिप्लॉयमेंट) पाइपलाइन शामिल है, तो Cloud Run पर माइग्रेट करें. इन स्थितियों की जानकारी यहां दिए गए मॉड्यूल में दी गई है:

  • App Engine से Cloud Functions पर माइग्रेट करना: मॉड्यूल 11 देखें
  • App Engine से Cloud Run पर माइग्रेट करना: अपने ऐप्लिकेशन को Docker के साथ कंटेनर बनाने के लिए, मॉड्यूल 4 देखें. इसके अलावा, कंटेनर, Docker नॉलेज या Dockerfiles के बिना ऐसा करने के लिए मॉड्यूल 5 पर जाएं

बिना सर्वर वाले किसी दूसरे प्लैटफ़ॉर्म पर स्विच करना ज़रूरी नहीं है. हमारा सुझाव है कि कोई भी बदलाव करने से पहले, अपने ऐप्लिकेशन और इस्तेमाल के उदाहरण देखने के लिए सबसे सही विकल्प चुनें.

आप आगे चाहे किसी माइग्रेशन मॉड्यूल पर जाएं, सर्वरलेस माइग्रेशन स्टेशन का पूरा कॉन्टेंट (कोडलैब, वीडियो, सोर्स कोड [जब उपलब्ध हो]) उसके ओपन सोर्स रेपो से ऐक्सेस किया जा सकता है. डेटा स्टोर करने की जगह के README में, यह भी बताया गया है कि किस माइग्रेशन पर विचार करना चाहिए. साथ ही, इसमें किसी "ऑर्डर" के बारे में भी बताया गया है. में तय किया गया है.

7. अन्य संसाधन

डेवलपर के लिए, इस या इससे जुड़े माइग्रेशन मॉड्यूल के साथ-साथ इससे जुड़े अन्य प्रॉडक्ट को एक्सप्लोर करने के लिए, यहां कुछ अतिरिक्त संसाधन दिए गए हैं. इसमें ऐसी जगहें शामिल हैं जहां इस कॉन्टेंट पर सुझाव, शिकायत या राय दी जा सकती है. साथ ही, कोड के लिंक और दस्तावेज़ के ऐसे अलग-अलग हिस्से शामिल हैं जो आपके काम आ सकते हैं.

कोड लैब से जुड़ी समस्याएं/सुझाव

अगर आपको इस कोडलैब के साथ कोई समस्या मिलती है, तो कृपया आवेदन करने से पहले अपनी समस्या का पता लगाएं. खोजने और नई समस्याएं बनाने के लिए लिंक:

माइग्रेशन के लिए संसाधन

यहां दी गई टेबल में, मॉड्यूल 7 (START) और मॉड्यूल 8 (FINISH) के रेपो फ़ोल्डर के लिंक दिए गए हैं.

Codelab

Python 2

Python 3

मॉड्यूल 7

कोड

कोड (इस ट्यूटोरियल में नहीं दिया गया है)

मॉड्यूल 8 (यह कोडलैब)

कोड

(लागू नहीं)

ऑनलाइन संसाधन

नीचे कुछ ऑनलाइन संसाधन दिए गए हैं, जो इस ट्यूटोरियल के लिए काम के हो सकते हैं:

App Engine टास्क सूची और क्लाउड टास्क

App Engine NDB और Cloud NDB (डेटास्टोर)

App Engine प्लैटफ़ॉर्म

क्लाउड से जुड़ी अन्य जानकारी

वीडियो

लाइसेंस

इस काम को क्रिएटिव कॉमंस एट्रिब्यूशन 2.0 जेनरिक लाइसेंस के तहत लाइसेंस मिला है.