একটি Python 2 অ্যাপ ইঞ্জিন ক্লাউড NDB & পাইথন 3 এবং ক্লাউড ডেটাস্টোরে ক্লাউড টাস্ক অ্যাপ (মডিউল 9)

1. ওভারভিউ

কোডল্যাবগুলির সার্ভারলেস মাইগ্রেশন স্টেশন সিরিজ (স্ব-গতিসম্পন্ন, হ্যান্ড-অন টিউটোরিয়াল) এবং সম্পর্কিত ভিডিওগুলির লক্ষ্য হল Google ক্লাউড সার্ভারহীন বিকাশকারীদের তাদের অ্যাপ্লিকেশনগুলিকে এক বা একাধিক মাইগ্রেশনের মাধ্যমে গাইড করে আধুনিকীকরণ করতে সাহায্য করা, প্রাথমিকভাবে উত্তরাধিকার পরিষেবাগুলি থেকে দূরে সরে যাওয়া৷ এটি করা আপনার অ্যাপগুলিকে আরও বহনযোগ্য করে তোলে এবং আপনাকে আরও বিকল্প এবং নমনীয়তা দেয়, যা আপনাকে ক্লাউড পণ্যগুলির একটি বিস্তৃত পরিসরের সাথে একীভূত করতে এবং অ্যাক্সেস করতে এবং আরও সহজে নতুন ভাষা প্রকাশগুলিতে আপগ্রেড করতে সক্ষম করে৷ প্রাথমিকভাবে প্রথম দিকের ক্লাউড ব্যবহারকারীদের উপর ফোকাস করার সময়, প্রাথমিকভাবে অ্যাপ ইঞ্জিন (স্ট্যান্ডার্ড এনভায়রনমেন্ট) ডেভেলপারদের, এই সিরিজটি ক্লাউড ফাংশন এবং ক্লাউড রানের মতো অন্যান্য সার্ভারহীন প্ল্যাটফর্মগুলিকে অন্তর্ভুক্ত করার জন্য যথেষ্ট বিস্তৃত, বা অন্য কোথাও প্রযোজ্য হলে।

এই কোডল্যাবের উদ্দেশ্য হল মডিউল 8 স্যাম্পল অ্যাপটিকে পাইথন 3-এ পোর্ট করার পাশাপাশি ক্লাউড এনডিবি ব্যবহার থেকে নেটিভ ক্লাউড ডেটাস্টোর ক্লায়েন্ট লাইব্রেরিতে ডেটাস্টোর (ডেটাস্টোর মোডে ক্লাউড ফায়ারস্টোর) অ্যাক্সেস স্যুইচ করা এবং ক্লাউড টাস্কের সর্বশেষ সংস্করণে আপগ্রেড করা। ক্লায়েন্ট লাইব্রেরি।

আমরা মডিউল 7 এ পুশ টাস্কের জন্য টাস্ক কিউ ব্যবহার যোগ করেছি, তারপর সেই ব্যবহারটি মডিউল 8-এ ক্লাউড টাস্কে স্থানান্তরিত করেছি। এখানে মডিউল 9-এ, আমরা পাইথন 3 এবং ক্লাউড ডেটাস্টোরে চালিয়ে যাচ্ছি। যারা টাস্ক সারিগুলি টাস্ক টাস্কের জন্য ব্যবহার করছেন তারা ক্লাউড পাব/সাব-এ স্থানান্তরিত হবে এবং পরিবর্তে মডিউল 18-19 উল্লেখ করা উচিত।

আপনি কিভাবে শিখবেন

  • Python 3 এ মডিউল 8 নমুনা অ্যাপটি পোর্ট করুন
  • ক্লাউড এনডিবি থেকে ক্লাউড ডেটাস্টোর ক্লায়েন্ট লাইব্রেরিতে ডেটাস্টোর অ্যাক্সেস স্যুইচ করুন
  • সর্বশেষ ক্লাউড টাস্ক ক্লায়েন্ট লাইব্রেরি সংস্করণে আপগ্রেড করুন৷

আপনি কি প্রয়োজন হবে

সমীক্ষা

আপনি কিভাবে এই টিউটোরিয়াল ব্যবহার করবেন?

শুধুমাত্র এটি মাধ্যমে পড়ুন এটি পড়ুন এবং ব্যায়াম সম্পূর্ণ করুন

পাইথনের সাথে আপনার অভিজ্ঞতাকে আপনি কীভাবে মূল্যায়ন করবেন?

নবজাতক মধ্যবর্তী দক্ষ

আপনি Google ক্লাউড পরিষেবাগুলি ব্যবহার করার সাথে আপনার অভিজ্ঞতাকে কীভাবে মূল্যায়ন করবেন?

নবজাতক মধ্যবর্তী দক্ষ

2. পটভূমি

মডিউল 7 দেখায় কিভাবে Python 2 ফ্লাস্ক অ্যাপ ইঞ্জিন অ্যাপে অ্যাপ ইঞ্জিন টাস্ক কিউ পুশ টাস্ক ব্যবহার করতে হয়। মডিউল 8 এ, আপনি সেই অ্যাপটিকে টাস্ক কিউ থেকে ক্লাউড টাস্কে স্থানান্তরিত করেন। এখানে মডিউল 9 -এ, আপনি সেই যাত্রা চালিয়ে যান এবং সেই অ্যাপটিকে পাইথন 3-এ পোর্ট করার পাশাপাশি ক্লাউড এনডিবি ব্যবহার করা থেকে নেটিভ ক্লাউড ডেটাস্টোর ক্লায়েন্ট লাইব্রেরিতে ডেটাস্টোর অ্যাক্সেস স্যুইচ করুন।

যেহেতু ক্লাউড এনডিবি পাইথন 2 এবং 3 উভয়ের জন্যই কাজ করে, তাই এটি অ্যাপ ইঞ্জিন ব্যবহারকারীদের জন্য তাদের অ্যাপগুলি পাইথন 2 থেকে 3 পর্যন্ত পোর্ট করার জন্য যথেষ্ট। ক্লাউড ডেটাস্টোরে ক্লায়েন্ট লাইব্রেরির একটি অতিরিক্ত স্থানান্তর সম্পূর্ণ ঐচ্ছিক , এবং এটি বিবেচনা করার শুধুমাত্র একটি কারণ রয়েছে: আপনি ইতিমধ্যেই ক্লাউড ডেটাস্টোর ক্লায়েন্ট লাইব্রেরি ব্যবহার করে নন-অ্যাপ ইঞ্জিন অ্যাপ্লিকেশানগুলি (এবং/অথবা পাইথন 3 অ্যাপ ইঞ্জিন অ্যাপ্লিকেশানগুলি) আছে এবং শুধুমাত্র একটি ক্লায়েন্ট লাইব্রেরির মাধ্যমে ডেটাস্টোর অ্যাক্সেস করার জন্য আপনার কোডবেসকে একীভূত করতে চান৷ ক্লাউড এনডিবি বিশেষভাবে পাইথন 2 অ্যাপ ইঞ্জিন বিকাশকারীদের জন্য একটি পাইথন 3 মাইগ্রেশন টুল হিসাবে তৈরি করা হয়েছিল, তাই যদি আপনার কাছে ইতিমধ্যেই ক্লাউড ডেটাস্টোর ক্লায়েন্ট লাইব্রেরি ব্যবহার করে কোড না থাকে তবে আপনাকে এই স্থানান্তরটি বিবেচনা করার দরকার নেই।

অবশেষে, ক্লাউড টাস্কস ক্লায়েন্ট লাইব্রেরির বিকাশ শুধুমাত্র পাইথন 3-এ চলতে থাকে, তাই আমরা পাইথন 2 এর চূড়ান্ত সংস্করণগুলির একটি থেকে তার সমসাময়িক পাইথন 3-এ "মাইগ্রেট" করছি। সৌভাগ্যবশত, পাইথন 2 থেকে কোনও ব্রেকিং পরিবর্তন নেই, যার অর্থ এখানে আপনাকে আর কিছুই করতে হবে না।

এই টিউটোরিয়ালে নিম্নলিখিত পদক্ষেপগুলি রয়েছে:

  1. সেটআপ/প্রিওয়ার্ক
  2. কনফিগারেশন আপডেট করুন
  3. অ্যাপ্লিকেশন কোড পরিবর্তন করুন

3. সেটআপ/প্রিওয়ার্ক

এই বিভাগটি ব্যাখ্যা করে কিভাবে:

  1. আপনার ক্লাউড প্রকল্প সেট আপ করুন
  2. বেসলাইন নমুনা অ্যাপ্লিকেশন পান
  3. (পুনঃ) বেসলাইন অ্যাপ স্থাপন এবং যাচাই করুন

এই পদক্ষেপগুলি নিশ্চিত করে যে আপনি কাজের কোড দিয়ে শুরু করছেন এবং এটি ক্লাউড পরিষেবাগুলিতে স্থানান্তরের জন্য প্রস্তুত৷

1. সেটআপ প্রকল্প

আপনি যদি মডিউল 8 কোডল্যাব সম্পন্ন করেন, তাহলে একই প্রকল্প (এবং কোড) পুনরায় ব্যবহার করুন। বিকল্পভাবে, একটি একেবারে নতুন প্রকল্প তৈরি করুন বা অন্য একটি বিদ্যমান প্রকল্প পুনরায় ব্যবহার করুন৷ প্রকল্পটির একটি সক্রিয় বিলিং অ্যাকাউন্ট এবং একটি সক্ষম অ্যাপ ইঞ্জিন অ্যাপ রয়েছে তা নিশ্চিত করুন৷ এই কোডল্যাব চলাকালীন আপনার প্রোজেক্ট আইডিটি খুঁজে বের করুন, যখনই আপনি PROJECT_ID ভেরিয়েবলের মুখোমুখি হন তখনই এটি ব্যবহার করুন।

2. বেসলাইন নমুনা অ্যাপ পান

পূর্বশর্তগুলির মধ্যে একটি হল একটি কার্যকরী মডিউল 8 অ্যাপ ইঞ্জিন অ্যাপ: মডিউল 8 কোডল্যাব (প্রস্তাবিত) সম্পূর্ণ করুন বা রেপো থেকে মডিউল 8 অ্যাপটি অনুলিপি করুন। আপনি আপনার বা আমাদের ব্যবহার করুন না কেন, মডিউল 8 কোড যেখানে আমরা শুরু করব ("START")। এই কোডল্যাব মডিউল 9 রেপো ফোল্ডারে যা আছে ("FINISH") এর সাথে সাদৃশ্যপূর্ণ কোড দিয়ে শেষ করে মাইগ্রেশনের মধ্য দিয়ে চলে।

আপনি যে মডিউল 7 অ্যাপটি ব্যবহার করেন তা নির্বিশেষে, ফোল্ডারটি নীচের মত হওয়া উচিত, সম্ভবত একটি lib ফোল্ডারের সাথেও:

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

3. (পুনরায়) বেসলাইন অ্যাপ স্থাপন এবং যাচাই করুন

মডিউল 8 অ্যাপটি স্থাপন করতে নিম্নলিখিত পদক্ষেপগুলি সম্পাদন করুন:

  1. lib ফোল্ডারটি মুছুন যদি একটি থাকে এবং pip install -t lib -r requirements.txt চালান lib পুনরুদ্ধার করতে। যদি আপনার ডেভেলপমেন্ট মেশিনে পাইথন 2 এবং 3 উভয়ই ইনস্টল থাকে তবে আপনাকে এর পরিবর্তে pip2 ব্যবহার করতে হবে।
  2. নিশ্চিত করুন যে আপনি gcloud কমান্ড-লাইন টুলটি ইনস্টল এবং আরম্ভ করেছেন এবং এর ব্যবহার পর্যালোচনা করেছেন।
  3. (ঐচ্ছিক) gcloud config set project PROJECT_ID দিয়ে আপনার ক্লাউড প্রজেক্ট সেট করুন যদি আপনি প্রতিটি gcloud কমান্ড দিয়ে PROJECT_ID লিখতে না চান।
  4. gcloud app deploy সাথে নমুনা অ্যাপটি স্থাপন করুন
  5. কোনো সমস্যা ছাড়াই অ্যাপটি প্রত্যাশিতভাবে চলছে তা নিশ্চিত করুন। আপনি যদি মডিউল 8 কোডল্যাব সম্পূর্ণ করেন, অ্যাপটি সাম্প্রতিক ভিজিট সহ শীর্ষ দর্শকদের প্রদর্শন করে (নীচে চিত্রিত)। নীচের অংশে পুরানো কাজগুলির একটি ইঙ্গিত রয়েছে যা মুছে ফেলা হবে৷

4aa8a2cb5f527079.png

4. কনফিগারেশন আপডেট করুন

requirements.txt

নতুন requirements.txt মডিউল 8-এর মতো প্রায় একই, শুধুমাত্র একটি বড় পরিবর্তন সহ: google-cloud-ndb কে google-cloud-datastore এর সাথে প্রতিস্থাপন করুন। এই পরিবর্তনটি করুন যাতে আপনার requirements.txt ফাইলটি এরকম দেখায়:

flask
google-cloud-datastore
google-cloud-tasks

এই requirements.txt ফাইলে কোনো সংস্করণ সংখ্যা নেই, মানে সর্বশেষ সংস্করণ নির্বাচন করা হয়েছে। যদি কোনো অসঙ্গতি দেখা দেয়, একটি অ্যাপের জন্য কার্যকারী সংস্করণ লক-ইন করতে সংস্করণ নম্বর ব্যবহার করা আদর্শ অনুশীলন।

app.yaml

দ্বিতীয় প্রজন্মের অ্যাপ ইঞ্জিন রানটাইম 2.x-এর মতো বিল্ট-ইন 3য়-পার্টি লাইব্রেরিগুলিকে সমর্থন করে না বা এটি অন্তর্নির্মিত লাইব্রেরিগুলির অনুলিপি সমর্থন করে না৷ 3য়-পক্ষের প্যাকেজগুলির জন্য শুধুমাত্র প্রয়োজনীয়তা হল সেগুলি requirements.txt এ তালিকাভুক্ত করা। ফলস্বরূপ, app.yaml এর সম্পূর্ণ libraries বিভাগটি মুছে ফেলা যেতে পারে।

আরেকটি আপডেট হল Python 3 রানটাইমের জন্য ওয়েব ফ্রেমওয়ার্ক ব্যবহার করা প্রয়োজন যা তাদের নিজস্ব রাউটিং করে। ফলস্বরূপ, সমস্ত স্ক্রিপ্ট হ্যান্ডলারকে auto পরিবর্তন করতে হবে। যাইহোক, যেহেতু সমস্ত রুট auto পরিবর্তন করতে হবে, এবং এই নমুনা অ্যাপ থেকে কোনও স্ট্যাটিক ফাইল পরিবেশন করা হয় না, তাই কোনও হ্যান্ডলার থাকা অপ্রাসঙ্গিক, তাই পুরো handlers বিভাগটিও সরিয়ে দিন।

app.yaml এর একমাত্র জিনিসটি হল Python 3 এর সমর্থিত সংস্করণে রানটাইম সেট করা, বলুন 3.10। এই পরিবর্তনটি করুন যাতে নতুন, সংক্ষিপ্ত app.yaml শুধুমাত্র এই একক লাইন হয়:

runtime: python310

appengine_config.py এবং lib মুছুন

নেক্সট জেনারেশন অ্যাপ ইঞ্জিন রানটাইম থার্ড-পার্টি প্যাকেজ ব্যবহার পুনর্গঠন:

  • অন্তর্নির্মিত লাইব্রেরিগুলি হল যেগুলি Google দ্বারা যাচাই করা হয়েছে এবং অ্যাপ ইঞ্জিন সার্ভারগুলিতে উপলব্ধ করা হয়েছে, সম্ভবত তাদের মধ্যে C/C++ কোড রয়েছে যা বিকাশকারীদের ক্লাউডে স্থাপন করার অনুমতি দেওয়া হয় না—এগুলি আর 2য় প্রজন্মের রানটাইমে উপলব্ধ নেই৷
  • 2য় প্রজন্মের রানটাইমে নন-বিল্ট-ইন লাইব্রেরি (কখনও কখনও "ভেন্ডরিং" বা "সেলফ-বান্ডলিং" বলা হয়) কপি করার আর প্রয়োজন নেই। পরিবর্তে, সেগুলি requirements.txt এ তালিকাভুক্ত করা উচিত যেখানে বিল্ড সিস্টেম স্থাপনের সময় স্বয়ংক্রিয়ভাবে আপনার পক্ষ থেকে সেগুলি ইনস্টল করে।

3য়-পক্ষের প্যাকেজ পরিচালনায় এই পরিবর্তনগুলির ফলস্বরূপ, appengine_config.py ফাইল বা lib ফোল্ডারের প্রয়োজন নেই, তাই সেগুলি মুছুন। ২য় প্রজন্মের রানটাইমে, App Engine স্বয়ংক্রিয়ভাবে requirements.txt এ তালিকাভুক্ত তৃতীয় পক্ষের প্যাকেজ ইনস্টল করে। সারসংক্ষেপ:

  1. কোন স্ব-বান্ডিল বা অনুলিপি করা থার্ড-পার্টি লাইব্রেরি; requirements.txt এ তাদের তালিকা করুন
  2. কোনো lib ফোল্ডারে কোনো pip install যাবে না, মানে কোনো lib ফোল্ডারের মেয়াদ নেই
  3. app.yaml এ বিল্ট-ইন থার্ড-পার্টি লাইব্রেরির কোনও তালিকা নেই (এভাবে কোনও libraries বিভাগ নেই); requirements.txt এ তাদের তালিকা করুন
  4. আপনার অ্যাপ্লিকেশান থেকে রেফারেন্স করার জন্য কোনও 3য়-পক্ষের লাইব্রেরি নেই মানে appengine_config.py ফাইল নেই৷

requirements.txt এ সমস্ত পছন্দসই 3য়-পার্টি লাইব্রেরি তালিকাভুক্ত করা একমাত্র বিকাশকারীর প্রয়োজনীয়তা।

5. অ্যাপ্লিকেশন ফাইল আপডেট করুন

শুধুমাত্র একটি অ্যাপ্লিকেশন ফাইল আছে, main.py , তাই এই বিভাগে সমস্ত পরিবর্তন শুধুমাত্র সেই ফাইলটিকে প্রভাবিত করে। নতুন অ্যাপে বিদ্যমান কোড রিফ্যাক্টর করার জন্য সামগ্রিক পরিবর্তনের জন্য নিচে একটি "ডিফস" দৃষ্টান্ত রয়েছে। পাঠকদের কাছ থেকে লাইন-বাই-লাইন কোড পড়ার আশা করা হয় না, কারণ এর উদ্দেশ্য হল এই রিফ্যাক্টরে কী প্রয়োজন তার একটি সচিত্র ওভারভিউ পাওয়া (তবে একটি নতুন ট্যাবে খুলতে বা ডাউনলোড করতে এবং ইচ্ছা করলে জুম ইন করতে নির্দ্বিধায়)।

5d043768ba7be742.png

আমদানি এবং সূচনা আপডেট করুন

মডিউল 8-এর জন্য main.py এ আমদানি বিভাগটি ক্লাউড এনডিবি এবং ক্লাউড টাস্ক ব্যবহার করে; এটি নিম্নলিখিত হিসাবে দেখা উচিত:

আগে:

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

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

পাইথন 3 এর মত দ্বিতীয় প্রজন্মের রানটাইমে লগিং সরলীকৃত এবং উন্নত করা হয়েছে:

  • ব্যাপক লগিং অভিজ্ঞতার জন্য, ক্লাউড লগিং ব্যবহার করুন
  • সাধারণ লগিংয়ের জন্য, শুধু print() এর মাধ্যমে stdout (বা stderr ) এ পাঠান
  • পাইথন logging মডিউল ব্যবহার করার দরকার নেই (তাই এটি সরান)

যেমন, logging আমদানি মুছে ফেলুন এবং google.cloud.datastore এর সাথে google.cloud.ndb অদলবদল করুন। একইভাবে, একটি NDB ক্লায়েন্টের পরিবর্তে একটি ডেটাস্টোর ক্লায়েন্টকে নির্দেশ করতে ds_client পরিবর্তন করুন। এই পরিবর্তনগুলি করা হয়েছে, আপনার নতুন অ্যাপের শীর্ষটি এখন এইরকম দেখাচ্ছে:

পরে:

from datetime import datetime
import json
import time
from flask import Flask, render_template, request
import google.auth
from google.cloud import datastore, tasks

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

ক্লাউড ডেটাস্টোরে মাইগ্রেট করুন

এখন ডেটাস্টোরের সাথে NDB ক্লায়েন্ট লাইব্রেরি ব্যবহার প্রতিস্থাপন করার সময়। অ্যাপ ইঞ্জিন এনডিবি এবং ক্লাউড এনডিবি উভয়েরই একটি ডেটা মডেল (শ্রেণী) প্রয়োজন; এই অ্যাপটির জন্য, এটি Visit করুন। store_visit() ফাংশন অন্যান্য সমস্ত মাইগ্রেশন মডিউলে একই কাজ করে: এটি একটি ভিজিট রেজিস্টার করে একটি নতুন Visit রেকর্ড তৈরি করে, ভিজিট করা ক্লায়েন্টের আইপি অ্যাড্রেস এবং ইউজার এজেন্ট (ব্রাউজার টাইপ) সংরক্ষণ করে।

আগে:

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()

তবে ক্লাউড ডেটাস্টোর একটি ডেটা মডেল ক্লাস ব্যবহার করে না , তাই ক্লাসটি মুছুন। উপরন্তু, ক্লাউড ডেটাস্টোর যখন রেকর্ড তৈরি করা হয় তখন স্বয়ংক্রিয়ভাবে একটি টাইমস্ট্যাম্প তৈরি করে না, যার জন্য আপনাকে ম্যানুয়ালি করতে হবে—এটি datetime.now() কলের মাধ্যমে করা হয়।

ডেটা ক্লাস ছাড়া, আপনার পরিবর্তিত store_visit() দেখতে এইরকম হওয়া উচিত:

পরে:

def store_visit(remote_addr, user_agent):
    'create new Visit entity in Datastore'
    entity = datastore.Entity(key=ds_client.key('Visit'))
    entity.update({
        'timestamp': datetime.now(),
        'visitor': '{}: {}'.format(remote_addr, user_agent),
    })
    ds_client.put(entity)

মূল ফাংশন হল fetch_visits() । এটি শুধুমাত্র সর্বশেষ Visit s-এর জন্য মূল কোয়েরি সম্পাদন করে না, এটি প্রদর্শিত শেষ Visit টাইমস্ট্যাম্পটিও দখল করে এবং পুশ টাস্ক তৈরি করে যা /trim (এইভাবে trim() ) কে পুরানো Visit s-কে ব্যাপকভাবে মুছে ফেলার জন্য কল করে। এখানে এটি ক্লাউড এনডিবি ব্যবহার করছে:

আগে:

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 (v.to_dict() for v in data), oldest_str

প্রাথমিক পরিবর্তন:

  1. ক্লাউড ডেটাস্টোর সমতুল্যের জন্য ক্লাউড এনডিবি ক্যোয়ারী অদলবদল করুন; ক্যোয়ারী শৈলী সামান্য ভিন্ন.
  2. ডেটাস্টোরের জন্য কোনও প্রসঙ্গ পরিচালকের ব্যবহার প্রয়োজন হয় না বা ক্লাউড এনডিবি-র মতো আপনাকে এর ডেটা ( to_dict() সহ) বের করতে বাধ্য করে না।
  3. print() দিয়ে লগিং কল প্রতিস্থাপন করুন

এই পরিবর্তনের পরে, fetch_visits() দেখতে এইরকম:

পরে:

def fetch_visits(limit):
    'get most recent visits & add task to delete older visits'
    query = ds_client.query(kind='Visit')
    query.order = ['-timestamp']
    visits = list(query.fetch(limit=limit))
    oldest = time.mktime(visits[-1]['timestamp'].timetuple())
    oldest_str = time.ctime(oldest)
    print('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 visits, oldest_str

এই সাধারণত প্রয়োজনীয় যে সব হবে. দুর্ভাগ্যবশত একটি প্রধান সমস্যা আছে.

(সম্ভবত) একটি নতুন (ধাক্কা) সারি তৈরি করুন

মডিউল 7-এ, আমরা বিদ্যমান মডিউল 1 অ্যাপে অ্যাপ ইঞ্জিন taskqueue ব্যবহার যোগ করেছি। একটি লিগ্যাসি অ্যাপ ইঞ্জিন বৈশিষ্ট্য হিসাবে পুশ টাস্ক করার একটি মূল সুবিধা হল যে একটি "ডিফল্ট" সারি স্বয়ংক্রিয়ভাবে তৈরি হয়৷ যখন সেই অ্যাপটি মডিউল 8-এ ক্লাউড টাস্কে স্থানান্তরিত হয়েছিল, তখন সেই ডিফল্ট সারিটি ইতিমধ্যেই ছিল, তাই আমাদের তখনও এটি নিয়ে উদ্বিগ্ন হওয়ার দরকার ছিল না। এটি এখানে মডিউল 9 এ পরিবর্তিত হয়।

বিবেচনা করার জন্য একটি গুরুত্বপূর্ণ দিক হল যে নতুন অ্যাপ ইঞ্জিন অ্যাপ্লিকেশনটি আর অ্যাপ ইঞ্জিন পরিষেবাগুলি ব্যবহার করে না, এবং আপনি আর অনুমান করতে পারবেন না যে অ্যাপ ইঞ্জিন স্বয়ংক্রিয়ভাবে একটি ভিন্ন পণ্যে (ক্লাউড টাস্ক) স্বয়ংক্রিয়ভাবে একটি টাস্ক সারি তৈরি করে। যেমন লেখা আছে, fetch_visits() (অবিদ্যমান সারির জন্য) একটি টাস্ক তৈরি করা ব্যর্থ হবে। ("ডিফল্ট") সারি বিদ্যমান কিনা তা পরীক্ষা করার জন্য একটি নতুন ফাংশন প্রয়োজন, এবং যদি না থাকে তবে একটি তৈরি করুন৷

এই ফাংশনটিকে _create_queue_if() কল করুন এবং fetch_visits() ঠিক উপরে আপনার অ্যাপ্লিকেশনে যোগ করুন কারণ এটিকে বলা হয়। ফাংশনের বডি যোগ করার জন্য:

def _create_queue_if():
    'app-internal function creating default queue if it does not exist'
    try:
        ts_client.get_queue(name=QUEUE_PATH)
    except Exception as e:
        if 'does not exist' in str(e):
            ts_client.create_queue(parent=PATH_PREFIX,
                    queue={'name': QUEUE_PATH})
    return True

ক্লাউড টাস্ক create_queue() ফাংশনের জন্য সারির নাম ছাড়া সারির সম্পূর্ণ পাথনেম প্রয়োজন। সরলতার জন্য, আরেকটি পরিবর্তনশীল PATH_PREFIX তৈরি করুন যা QUEUE_PATH বিয়োগ করে সারির নাম ( QUEUE_PATH.rsplit('/', 2)[0] )। শীর্ষের কাছে এর সংজ্ঞা যোগ করুন যাতে সমস্ত ধ্রুবক অ্যাসাইনমেন্ট সহ কোড ব্লকটি এইরকম দেখায়:

_, 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)
PATH_PREFIX = QUEUE_PATH.rsplit('/', 2)[0]

এখন _create_queue_if() ব্যবহার করতে fetch_visits() এর শেষ লাইনটি পরিবর্তন করুন, প্রয়োজনে প্রথমে সারি তৈরি করুন, তারপরে কাজটি তৈরি করুন:

    if _create_queue_if():
        ts_client.create_task(parent=QUEUE_PATH, task=task)
    return visits, oldest_str

_create_queue_if() এবং fetch_visits() উভয়ই এখন সামগ্রিকভাবে এইরকম হওয়া উচিত:

def _create_queue_if():
    'app-internal function creating default queue if it does not exist'
    try:
        ts_client.get_queue(name=QUEUE_PATH)
    except Exception as e:
        if 'does not exist' in str(e):
            ts_client.create_queue(parent=PATH_PREFIX,
                    queue={'name': QUEUE_PATH})
    return True

def fetch_visits(limit):
    'get most recent visits & add task to delete older visits'
    query = ds_client.query(kind='Visit')
    query.order = ['-timestamp']
    visits = list(query.fetch(limit=limit))
    oldest = time.mktime(visits[-1]['timestamp'].timetuple())
    oldest_str = time.ctime(oldest)
    print('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',
            },
        }
    }
    if _create_queue_if():
        ts_client.create_task(parent=QUEUE_PATH, task=task)
    return visits, oldest_str

এই অতিরিক্ত কোড যোগ করা ছাড়া, বাকি ক্লাউড টাস্ক কোড বেশিরভাগই মডিউল 8 থেকে অক্ষত। কোডের চূড়ান্ত অংশটি হল টাস্ক হ্যান্ডলার।

টাস্ক হ্যান্ডলার (ধাক্কা) আপডেট করুন

টাস্ক হ্যান্ডলারে, trim() , ক্লাউড NDB কোড ক্যোয়ারী ভিজিটের জন্য সবচেয়ে পুরানো থেকে পুরানো প্রদর্শিত হয়। এটি জিনিসগুলিকে গতি বাড়ানোর জন্য শুধুমাত্র-কী-কোয়েরি ব্যবহার করে—আপনার যদি শুধুমাত্র ভিজিট আইডির প্রয়োজন হয় তবে কেন সমস্ত ডেটা আনবেন? একবার আপনার কাছে সমস্ত ভিজিট আইডি হয়ে গেলে, ক্লাউড NDB-এর delete_multi() ফাংশনের সাথে একটি ব্যাচে সেগুলি মুছুন৷

আগে:

@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

fetch_visits() এর মত, বেশিরভাগ পরিবর্তনের মধ্যে রয়েছে ক্লাউড ডেটাস্টোরের জন্য ক্লাউড এনডিবি কোড অদলবদল করা, ক্যোয়ারী স্টাইল টুইক করা, এর প্রসঙ্গ পরিচালকের ব্যবহার অপসারণ করা এবং লগিং কলগুলি print() এ পরিবর্তন করা।

পরে:

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

প্রধান অ্যাপ্লিকেশন হ্যান্ডলার root() এ কোন পরিবর্তন নেই।

পোর্ট থেকে পাইথন 3

এই নমুনা অ্যাপটি Python 2 এবং 3 উভয় ক্ষেত্রেই চালানোর জন্য ডিজাইন করা হয়েছে। যেকোন Python 3-নির্দিষ্ট পরিবর্তনগুলি এই টিউটোরিয়ালের প্রাসঙ্গিক বিভাগে আগে কভার করা হয়েছিল। কোন অতিরিক্ত পদক্ষেপ বা সামঞ্জস্য লাইব্রেরি প্রয়োজন নেই.

ক্লাউড টাস্ক আপডেট

পাইথন 2 সমর্থনকারী ক্লাউড টাস্ক ক্লায়েন্ট লাইব্রেরির চূড়ান্ত সংস্করণ হল 1.5.0। এই লেখার সময়, পাইথন 3-এর জন্য ক্লায়েন্ট লাইব্রেরির সর্বশেষ সংস্করণটি সেই সংস্করণের সাথে সম্পূর্ণ সামঞ্জস্যপূর্ণ, এইভাবে আর কোন আপডেটের প্রয়োজন নেই।

এইচটিএমএল টেমপ্লেট আপডেট

HTML টেমপ্লেট ফাইল, templates/index.html তে কোন পরিবর্তনের প্রয়োজন নেই, তাই এটি মডিউল 9 অ্যাপে পৌঁছানোর জন্য প্রয়োজনীয় সমস্ত পরিবর্তন গুটিয়ে নেয়।

6. সারাংশ/পরিষ্কার

প্রয়োগ এবং আবেদন যাচাই

একবার আপনি কোড আপডেটগুলি সম্পন্ন করলে, প্রধানত Python 3-এ পোর্ট, gcloud app deploy এর সাথে আপনার অ্যাপ স্থাপন করুন। আপনি ক্লাউড ডেটাস্টোর ক্লায়েন্ট লাইব্রেরিতে ডাটাবেস অ্যাক্সেস স্থানান্তর করেছেন এবং পাইথন 3-তে আপগ্রেড করেছেন তা ছাড়া আউটপুটটি মডিউল 7 এবং 8 অ্যাপের অ্যাপগুলির সাথে অভিন্ন হওয়া উচিত:

মডিউল 7 ভিজিটমি অ্যাপ

এই ধাপ কোডল্যাব সম্পূর্ণ করে। মডিউল 9 ফোল্ডারে যা আছে তার সাথে আপনার কোড তুলনা করার জন্য আমরা আপনাকে আমন্ত্রণ জানাচ্ছি। অভিনন্দন!

পরিষ্কার করুন

সাধারণ

আপনি যদি আপাতত কাজ শেষ করে থাকেন, তাহলে বিলিং এড়াতে আমরা আপনাকে আপনার অ্যাপ ইঞ্জিন অ্যাপটি অক্ষম করার পরামর্শ দিই। তবে আপনি যদি আরও কিছু পরীক্ষা বা পরীক্ষা করতে চান, অ্যাপ ইঞ্জিন প্ল্যাটফর্মের একটি বিনামূল্যের কোটা রয়েছে, এবং যতক্ষণ না আপনি সেই ব্যবহারের স্তরটি অতিক্রম না করেন, আপনাকে চার্জ করা উচিত নয়। এটি গণনার জন্য, তবে প্রাসঙ্গিক অ্যাপ ইঞ্জিন পরিষেবাগুলির জন্যও চার্জ হতে পারে, তাই আরও তথ্যের জন্য এর মূল্য পৃষ্ঠাটি দেখুন৷ যদি এই স্থানান্তরের সাথে অন্যান্য ক্লাউড পরিষেবা জড়িত থাকে, তবে সেগুলি আলাদাভাবে বিল করা হবে৷ উভয় ক্ষেত্রে, প্রযোজ্য হলে, নীচের "এই কোডল্যাবের জন্য নির্দিষ্ট" বিভাগটি দেখুন।

সম্পূর্ণ প্রকাশের জন্য, অ্যাপ ইঞ্জিনের মতো একটি Google ক্লাউড সার্ভারহীন গণনা প্ল্যাটফর্মে স্থাপন করার জন্য সামান্য বিল্ড এবং স্টোরেজ খরচ হয়। ক্লাউড স্টোরেজের মতো ক্লাউড বিল্ডের নিজস্ব ফ্রি কোটা রয়েছে। সেই ছবির সঞ্চয়স্থান সেই কোটার কিছু ব্যবহার করে। যাইহোক, আপনি এমন একটি অঞ্চলে বাস করতে পারেন যেখানে এই ধরনের বিনামূল্যের স্তর নেই, তাই সম্ভাব্য খরচ কমাতে আপনার স্টোরেজ ব্যবহার সম্পর্কে সচেতন থাকুন। নির্দিষ্ট ক্লাউড স্টোরেজ "ফোল্ডার" আপনার পর্যালোচনা করা উচিত:

  • 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 " যদি আপনার অ্যাপটি USA তে হোস্ট করা হয়৷

অন্যদিকে, আপনি যদি এই অ্যাপ্লিকেশন বা অন্যান্য সম্পর্কিত মাইগ্রেশন কোডল্যাবগুলি চালিয়ে যেতে না চান এবং সবকিছু সম্পূর্ণরূপে মুছে ফেলতে চান, তাহলে আপনার প্রকল্পটি বন্ধ করুন

এই কোডল্যাবের জন্য নির্দিষ্ট

নীচে তালিকাভুক্ত পরিষেবাগুলি এই কোডল্যাবের জন্য অনন্য৷ আরও তথ্যের জন্য প্রতিটি পণ্যের ডকুমেন্টেশন পড়ুন:

পরবর্তী পদক্ষেপ

এটি অ্যাপ ইঞ্জিন টাস্ক কিউ পুশ টাস্ক থেকে ক্লাউড টাস্কে আমাদের মাইগ্রেশন শেষ করে। ক্লাউড এনডিবি থেকে ক্লাউড ডেটাস্টোরে ঐচ্ছিক স্থানান্তরও মডিউল 3 -এ নিজস্ব (টাস্ক কিউ বা ক্লাউড টাস্ক ছাড়া) কভার করা হয়েছে। মডিউল 3 ছাড়াও, অন্যান্য মাইগ্রেশন মডিউল রয়েছে যা বিবেচনা করার জন্য অ্যাপ ইঞ্জিন লিগ্যাসি বান্ডেল করা পরিষেবাগুলি থেকে দূরে সরে যাওয়ার উপর দৃষ্টি নিবদ্ধ করে:

  • মডিউল 2 : অ্যাপ ইঞ্জিন এনডিবি থেকে ক্লাউড এনডিবিতে স্থানান্তর করুন
  • মডিউল 3 : ক্লাউড এনডিবি থেকে ক্লাউড ডেটাস্টোরে স্থানান্তর করুন
  • মডিউল 12-13 : অ্যাপ ইঞ্জিন মেমক্যাশ থেকে ক্লাউড মেমোরিস্টোরে স্থানান্তর করুন
  • মডিউল 15-16 : অ্যাপ ইঞ্জিন ব্লবস্টোর থেকে ক্লাউড স্টোরেজে স্থানান্তর করুন
  • মডিউল 18-19 : ক্লাউড পাব/সাব-এ অ্যাপ ইঞ্জিন টাস্ক কিউ (টাস্ক টাস্ক)

অ্যাপ ইঞ্জিন আর Google ক্লাউডে একমাত্র সার্ভারহীন প্ল্যাটফর্ম নয়। আপনার যদি একটি ছোট অ্যাপ ইঞ্জিন অ্যাপ থাকে বা যেটির কার্যকারিতা সীমিত থাকে এবং এটিকে একটি স্বতন্ত্র মাইক্রোসার্ভিসে পরিণত করতে চান, অথবা আপনি একাধিক পুনঃব্যবহারযোগ্য উপাদানে একটি মনোলিথিক অ্যাপকে বিচ্ছিন্ন করতে চান, তাহলে ক্লাউড ফাংশনে যাওয়ার বিষয়টি বিবেচনা করার জন্য এটি ভাল কারণ। কন্টেইনারাইজেশন যদি আপনার অ্যাপ্লিকেশন ডেভেলপমেন্ট ওয়ার্কফ্লো-এর অংশ হয়ে থাকে, বিশেষ করে যদি এটি একটি CI/CD (একটানা ইন্টিগ্রেশন/কন্টিনিউয়াস ডেলিভারি বা ডিপ্লয়মেন্ট) পাইপলাইন নিয়ে থাকে, তাহলে ক্লাউড রানে মাইগ্রেট করার কথা বিবেচনা করুন। এই পরিস্থিতিতে নিম্নলিখিত মডিউল দ্বারা আচ্ছাদিত করা হয়:

  • অ্যাপ ইঞ্জিন থেকে ক্লাউড ফাংশনে স্থানান্তর করুন: মডিউল 11 দেখুন
  • অ্যাপ ইঞ্জিন থেকে ক্লাউড রানে স্থানান্তরিত করুন: আপনার অ্যাপটিকে ডকারের সাথে কনটেইনারাইজ করতে মডিউল 4 দেখুন, অথবা কন্টেইনার, ডকার জ্ঞান, বা Dockerfile ছাড়াই এটি করতে মডিউল 5 দেখুন

অন্য সার্ভারহীন প্ল্যাটফর্মে স্যুইচ করা ঐচ্ছিক, এবং আমরা কোনো পরিবর্তন করার আগে আপনার অ্যাপ এবং ব্যবহারের ক্ষেত্রে সেরা বিকল্পগুলি বিবেচনা করার পরামর্শ দিই।

আপনি পরবর্তীতে যে মাইগ্রেশন মডিউলটি বিবেচনা করুন না কেন, সমস্ত সার্ভারলেস মাইগ্রেশন স্টেশন সামগ্রী (কোডল্যাব, ভিডিও, সোর্স কোড [যখন উপলব্ধ]) এর ওপেন সোর্স রেপোতে অ্যাক্সেস করা যেতে পারে। রেপোর README কোন মাইগ্রেশন বিবেচনা করতে হবে এবং মাইগ্রেশন মডিউলের কোন প্রাসঙ্গিক "অর্ডার" তার নির্দেশিকাও প্রদান করে।

7. অতিরিক্ত সম্পদ

কোডল্যাব সমস্যা/প্রতিক্রিয়া

আপনি যদি এই কোডল্যাবের সাথে কোনো সমস্যা খুঁজে পান, অনুগ্রহ করে ফাইল করার আগে প্রথমে আপনার সমস্যাটি অনুসন্ধান করুন। অনুসন্ধান এবং নতুন সমস্যা তৈরি করার লিঙ্ক:

মাইগ্রেশন সম্পদ

মডিউল 8 (স্টার্ট) এবং মডিউল 9 (ফিনিশ) এর জন্য রেপো ফোল্ডারগুলির লিঙ্কগুলি নীচের টেবিলে পাওয়া যাবে। এগুলি সমস্ত অ্যাপ ইঞ্জিন কোডল্যাব মাইগ্রেশনের জন্য রেপো থেকে অ্যাক্সেস করা যেতে পারে যা আপনি একটি জিপ ফাইল ক্লোন বা ডাউনলোড করতে পারেন।

কোডল্যাব

পাইথন 2

পাইথন 3

মডিউল 8

কোড

(n/a)

মডিউল 9

(n/a)

কোড

অনলাইন সম্পদ

নীচে অনলাইন সংস্থান রয়েছে যা এই টিউটোরিয়ালের জন্য প্রাসঙ্গিক হতে পারে:

অ্যাপ ইঞ্জিন

ক্লাউড এনডিবি

ক্লাউড ডেটাস্টোর

ক্লাউড টাস্ক

অন্যান্য ক্লাউড তথ্য

লাইসেন্স

এই কাজটি ক্রিয়েটিভ কমন্স অ্যাট্রিবিউশন 2.0 জেনেরিক লাইসেন্সের অধীনে লাইসেন্সপ্রাপ্ত।