অ্যাপ ইঞ্জিন টাস্ক কিউ পুশ টাস্ক থেকে ক্লাউড টাস্কে স্থানান্তর করুন (মডিউল 8)

১. সংক্ষিপ্ত বিবরণ

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

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

আমরা মডিউল ৭-এ পুশ টাস্কের ব্যবহার যুক্ত করেছি এবং মডিউল ৮-এ সেই ব্যবহারকে ক্লাউড টাস্কে স্থানান্তরিত করছি, এরপর মডিউল ৯-এ পাইথন ৩ এবং ক্লাউড ডেটাস্টোর নিয়ে আলোচনা করা হবে। যারা পুল টাস্কের জন্য টাস্ক কিউ ব্যবহার করেন, তারা ক্লাউড পাব/সাব-এ স্থানান্তরিত হবেন এবং তাদের পরিবর্তে মডিউল ১৮-১৯ দেখতে হবে।

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

আপনার যা যা লাগবে

জরিপ

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

শুধু একবার পড়ে দেখুন এটি পড়ুন এবং অনুশীলনগুলো সম্পূর্ণ করুন।

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

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

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

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

২. পটভূমি

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

পুল টাস্ক মাইগ্রেশন নিয়ে মাইগ্রেশন মডিউল ১৮-১৯-এ আলোচনা করা হয়েছে, যেখানে মডিউল ৭-৯ পুশ টাস্ক মাইগ্রেশনের উপর আলোকপাত করে। অ্যাপ ইঞ্জিন টাস্ক কিউ পুশ টাস্ক থেকে মাইগ্রেট করার জন্য, আমরা বিদ্যমান পাইথন ২ অ্যাপ ইঞ্জিন স্যাম্পল অ্যাপে এর ব্যবহার যুক্ত করেছি, যা নতুন পেজ ভিজিট রেজিস্টার করে এবং সবচেয়ে সাম্প্রতিক ভিজিটগুলো প্রদর্শন করে। মডিউল ৭-এর কোডল্যাবটি সবচেয়ে পুরোনো ভিজিটগুলো মুছে ফেলার জন্য একটি পুশ টাস্ক যোগ করে—এগুলো আর কখনও দেখানো হবে না, তাই ডেটাস্টোরে এগুলো অতিরিক্ত স্টোরেজ দখল করে রাখবে কেন? এই মডিউল ৮-এর কোডল্যাবটি একই কার্যকারিতা বজায় রাখে, কিন্তু এর অন্তর্নিহিত কিউয়িং মেকানিজমকে টাস্ক কিউ পুশ টাস্ক থেকে ক্লাউড টাস্কে মাইগ্রেট করে এবং ডেটাস্টোর অ্যাক্সেসের জন্য অ্যাপ ইঞ্জিন এনডিবি থেকে ক্লাউড এনডিবি-তে মডিউল ২-এর মাইগ্রেশনটির পুনরাবৃত্তি করে।

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

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

৩. প্রস্তুতি/পূর্বপ্রস্তুতি

এই বিভাগে ব্যাখ্যা করা হয়েছে কীভাবে:

  1. আপনার ক্লাউড প্রজেক্ট সেট আপ করুন
  2. বেসলাইন নমুনা অ্যাপ পান
  3. বেসলাইন অ্যাপ পুনরায় স্থাপন এবং যাচাই করুন
  4. নতুন গুগল ক্লাউড পরিষেবা/এপিআই সক্রিয় করুন

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

১. প্রকল্প স্থাপন করুন

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

২. বেসলাইন নমুনা অ্যাপটি নিন

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

আপনি মডিউল ৭-এর যে অ্যাপই ব্যবহার করুন না কেন, ফোল্ডারটি নিচের মতো দেখতে হবে, সম্ভবত এর সাথে একটি lib ফোল্ডারও থাকবে:

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

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

মডিউল ৭ অ্যাপটি ডেপ্লয় করতে নিম্নলিখিত ধাপগুলো অনুসরণ করুন:

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

4aa8a2cb5f527079.png

৪. নতুন গুগল ক্লাউড পরিষেবা/এপিআই সক্রিয় করুন

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

ক্লাউড কনসোল থেকে

ক্লাউড কনসোলে (সঠিক প্রজেক্টের জন্য) এপিআই ম্যানেজারের লাইব্রেরি পেজে যান এবং পেজের মাঝখানে থাকা সার্চ বারটি ব্যবহার করে ক্লাউড ডেটাস্টোর এবং ক্লাউড টাস্কস এপিআইগুলো খুঁজুন:

c7a740304e9d35b.png

প্রতিটি API-এর জন্য আলাদাভাবে Enable বোতামে ক্লিক করুন—আপনাকে বিলিং তথ্য দিতে বলা হতে পারে। এটি Cloud Pub/Sub API Library পৃষ্ঠার একটি উদাহরণ (এই কোডল্যাবের জন্য Pub/Sub API সক্রিয় করবেন না, শুধু Cloud Tasks এবং Datastore সক্রিয় করুন):

1b6c0a2a73124f6b.jpeg

কমান্ড-লাইন থেকে

কনসোল থেকে এপিআই (API) চালু করা দৃশ্যত তথ্যপূর্ণ হলেও, অনেকে কমান্ড-লাইন পছন্দ করেন। একই সাথে উভয় এপিআই চালু করতে 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 APIs) সক্রিয় করতে চান এবং তাদের 'ইউআরআই' (URIs) জানতে চান, তবে সেগুলি প্রতিটি এপিআই-এর লাইব্রেরি পৃষ্ঠার একেবারে নিচে পাওয়া যাবে। উদাহরণস্বরূপ, ঠিক উপরের পাব/সাব (Pub/Sub) পৃষ্ঠার একেবারে নিচে 'পরিষেবার নাম' (Service name) হিসেবে pubsub.googleapis.com লক্ষ্য করুন।

ধাপগুলো সম্পন্ন হওয়ার পর, আপনার প্রজেক্ট এপিআইগুলো অ্যাক্সেস করতে পারবে। এখন সেই এপিআইগুলো ব্যবহার করার জন্য অ্যাপটি আপডেট করার সময় এসেছে।

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

কনফিগারেশনের আপডেটগুলো সুস্পষ্টভাবে ক্লাউড ক্লায়েন্ট লাইব্রেরির অতিরিক্ত ব্যবহারের কারণেই করা হয়েছে। আপনি যে লাইব্রেরিই ব্যবহার করুন না কেন, যে অ্যাপগুলো কোনো ক্লাউড ক্লায়েন্ট লাইব্রেরি ব্যবহার করে না, সেগুলোতেও একই পরিবর্তনগুলো করতে হবে।

requirements.txt

মডিউল ৮, মডিউল ১-এর অ্যাপ ইঞ্জিন এনডিবি এবং টাস্ক কিউ-এর ব্যবহারকে ক্লাউড এনডিবি এবং ক্লাউড টাস্কস দ্বারা প্রতিস্থাপন করে। মডিউল ৭ থেকে flask যুক্ত করার জন্য requirements.txtgoogle-cloud-ndb এবং google-cloud-tasks উভয়ই যুক্ত করুন:

flask
google-cloud-ndb
google-cloud-tasks

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

app.yaml

ক্লাউড ক্লায়েন্ট লাইব্রেরি ব্যবহার করার সময়, পাইথন ২ অ্যাপ ইঞ্জিন রানটাইমের জন্য নির্দিষ্ট কিছু থার্ড-পার্টি প্যাকেজ প্রয়োজন হয়, যেমন grpcio এবং setuptools । পাইথন ২ ব্যবহারকারীদের অবশ্যই app.yaml এই ধরনের বিল্ট-ইন লাইব্রেরিগুলোকে তাদের উপলব্ধ সংস্করণ বা "latest" ভার্সনসহ তালিকাভুক্ত করতে হবে। যদি আপনার ফাইলে এখনও libraries সেকশন না থাকে, তবে একটি তৈরি করুন এবং লাইব্রেরি দুটিকে এইভাবে যুক্ত করুন:

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

আপনার অ্যাপ মাইগ্রেট করার সময়, এতে আগে থেকেই একটি libraries সেকশন থাকতে পারে। যদি থাকে, এবং grpciosetuptools মধ্যে কোনো একটি অনুপস্থিত থাকে, তবে সেগুলোকে আপনার বিদ্যমান 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() কলটির প্রয়োজন হয়। নিচে মূল মডিউল ১-এর appengine_config.py এবং মডিউল ৮-এর আপডেটগুলো করার পরের ফাইলটি দেওয়া হলো:

পূর্বে:

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)

অ্যাপ ইঞ্জিন মাইগ্রেশন ডকুমেন্টেশনেও অনুরূপ বর্ণনা পাওয়া যায়।

৫. অ্যাপ্লিকেশন কোড পরিবর্তন করুন

এই বিভাগে মূল অ্যাপ্লিকেশন ফাইল, main.py তে কিছু আপডেট আনা হয়েছে, যেখানে অ্যাপ ইঞ্জিন টাস্ক কিউ পুশ কিউ-এর পরিবর্তে ক্লাউড টাস্ক ব্যবহার করা হয়েছে। ওয়েব টেমপ্লেট, templates/index.html এ কোনো পরিবর্তন নেই —উভয় অ্যাপই একই রকমভাবে কাজ করবে এবং একই ডেটা প্রদর্শন করবে। মূল অ্যাপ্লিকেশনের পরিবর্তনগুলোকে এই চারটি করণীয় কাজের মধ্যে ভাগ করা হয়েছে:

  1. আমদানি এবং প্রারম্ভিকীকরণ আপডেট করুন
  2. ডেটা মডেলের কার্যকারিতা আপডেট করুন (ক্লাউড এনডিবি)
  3. ক্লাউড টাস্ক (এবং ক্লাউড এনডিবি)-তে স্থানান্তরিত করুন
  4. আপডেট (পুশ) টাস্ক হ্যান্ডলার

১. আমদানি এবং প্রারম্ভিকীকরণ হালনাগাদ করুন

  1. অ্যাপ ইঞ্জিন এনডিবি ( google.appengine.ext.ndb ) এবং টাস্ক কিউ ( google.appengine.api.taskqueue )-কে যথাক্রমে ক্লাউড এনডিবি ( google.cloud.ndb ) এবং ক্লাউড টাস্ক ( google.cloud.tasks ) দিয়ে প্রতিস্থাপন করুন।
  2. ক্লাউড ক্লায়েন্ট লাইব্রেরিগুলোর জন্য 'এপিআই ক্লায়েন্ট' প্রারম্ভিকীকরণ এবং তৈরি করা প্রয়োজন; সেগুলোকে যথাক্রমে ds_client এবং ts_client এ বরাদ্দ করুন।
  3. টাস্ক কিউ ডকুমেন্টেশনে বলা হয়েছে: "অ্যাপ ইঞ্জিন ' default নামের একটি ডিফল্ট পুশ কিউ প্রদান করে, যা ডিফল্ট সেটিংস সহ কনফিগার করা এবং ব্যবহারের জন্য প্রস্তুত থাকে।" ক্লাউড টাস্কস কোনো default কিউ প্রদান করে না (কারণ এটি অ্যাপ ইঞ্জিন থেকে স্বাধীন একটি স্বতন্ত্র ক্লাউড প্রোডাক্ট), তাই default নামের একটি ক্লাউড টাস্কস কিউ তৈরি করার জন্য নতুন কোডের প্রয়োজন হয়।
  4. অ্যাপ ইঞ্জিন টাস্ক কিউ-এর জন্য কোনো অঞ্চল নির্দিষ্ট করার প্রয়োজন হয় না, কারণ এটি আপনার অ্যাপ যে অঞ্চলে চলে, সেই অঞ্চলটিই ব্যবহার করে। তবে, ক্লাউড টাস্কস এখন একটি স্বাধীন পণ্য হওয়ায়, এর জন্য একটি অঞ্চলের প্রয়োজন হয় , এবং সেই অঞ্চলটি অবশ্যই আপনার অ্যাপ যে অঞ্চলে চলে তার সাথে মিলতে হবে। কিউ-এর অনন্য শনাক্তকারী হিসেবে একটি 'সম্পূর্ণ-যোগ্য পাথনেম' তৈরি করার জন্য অঞ্চলের নাম এবং ক্লাউড প্রজেক্ট আইডি প্রয়োজন।

উপরের তৃতীয় এবং চতুর্থ বুলেট পয়েন্টে বর্ণিত আপডেটগুলোই প্রয়োজনীয় অতিরিক্ত কনস্ট্যান্ট এবং ইনিশিয়ালাইজেশনের মূল অংশ। নিচের 'আগে' এবং 'পরে' অংশটি দেখুন এবং 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)

২. ডেটা মডেলের কার্যকারিতা আপডেট করুন (ক্লাউড এনডিবি)

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

পূর্বে:

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

৩. ক্লাউড টাস্ক (এবং ক্লাউড এনডিবি)-তে স্থানান্তর করুন

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

  1. সর্বশেষ পরিদর্শনের তথ্য জানতে অনুসন্ধান করুন।
  2. সেই ভিজিটগুলো অবিলম্বে ফেরত না দিয়ে, প্রদর্শিত সর্বশেষ Visit (অর্থাৎ সবচেয়ে পুরোনো) টাইমস্ট্যাম্প সংরক্ষণ করুন—এর চেয়ে পুরোনো সমস্ত ভিজিট নিরাপদে মুছে ফেলা যায়।
  3. স্ট্যান্ডার্ড পাইথন ইউটিলিটি ব্যবহার করে টাইমস্ট্যাম্পটিকে ফ্লোট এবং স্ট্রিং উভয় ফরম্যাটে বের করুন এবং উভয়কেই বিভিন্ন কাজে ব্যবহার করুন, যেমন—ব্যবহারকারীকে দেখানো, লগে যোগ করা, হ্যান্ডলারে পাঠানো ইত্যাদি।
  4. এই টাইমস্ট্যাম্পটিকে পেলোড হিসেবে এবং URL হিসেবে /trim ব্যবহার করে একটি পুশ টাস্ক তৈরি করুন।
  5. অবশেষে ওই ইউআরএল-এ একটি HTTP POST মাধ্যমে টাস্ক হ্যান্ডলারটিকে কল করা হয়।

এই কার্যপ্রবাহটি 'before' কোড স্নিপেট দ্বারা চিত্রিত করা হয়েছে:

পূর্বে:

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

কার্যকারিতা একই থাকলেও, ক্লাউড টাস্কস এক্সিকিউশন প্ল্যাটফর্ম হয়ে ওঠে। এই পরিবর্তন কার্যকর করার জন্য আপডেটগুলির মধ্যে রয়েছে:

  1. Visit কোয়েরিটিকে একটি পাইথন ' with ' ব্লকের মধ্যে রাখুন (মডিউল ২-এর ক্লাউড এনডিবি-তে মাইগ্রেশনের পুনরাবৃত্তি)।
  2. ক্লাউড টাস্কের মেটাডেটা তৈরি করুন, যার মধ্যে টাইমস্ট্যাম্প পেলোড এবং ইউআরএল-এর মতো প্রত্যাশিত অ্যাট্রিবিউটগুলো অন্তর্ভুক্ত থাকবে, তবে এর সাথে MIME টাইপও যোগ করুন এবং পেলোডটিকে JSON-এনকোড করুন।
  3. কিউ-এর মেটাডেটা এবং সম্পূর্ণ পাথনেম ব্যবহার করে ক্লাউড টাস্কস এপিআই ক্লায়েন্ট দিয়ে টাস্কটি তৈরি করুন।

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

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

(পুশ) টাস্ক হ্যান্ডলার ফাংশনটিতে বড় কোনো আপডেটের প্রয়োজন নেই; শুধু এটি কার্যকর করা প্রয়োজন। এটি টাস্ক কিউ বা ক্লাউড টাস্ক উভয়ের ক্ষেত্রেই প্রযোজ্য। কথায় আছে, "কোড তো কোডই"। তবে কিছু ছোটখাটো পরিবর্তন রয়েছে :

  1. টাইমস্ট্যাম্প পেলোডটি টাস্ক কিউ-তে হুবহু পাঠানো হয়েছিল, কিন্তু ক্লাউড টাস্কের জন্য এটিকে JSON-এনকোড করা হয়েছিল এবং তাই এটি পৌঁছানোর পর অবশ্যই JSON-পার্স করতে হবে।
  2. টাস্ক কিউ ব্যবহার করে /trim HTTP POST কলের একটি অন্তর্নিহিত MIMEtype ছিল application/x-www-form-urlencoded , কিন্তু ক্লাউড টাস্কের ক্ষেত্রে এটিকে সুস্পষ্টভাবে application/json হিসেবে নির্ধারণ করা হয়, তাই পেলোডটি বের করার পদ্ধতিটি কিছুটা ভিন্ন।
  3. ক্লাউড এনডিবি এপিআই ক্লায়েন্ট কনটেক্সট ম্যানেজার ব্যবহার করুন (ক্লাউড এনডিবি-তে মডিউল ২ মাইগ্রেশন)।

টাস্ক হ্যান্ডলার 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 এ কোনো আপডেট নেই।

৬. সারসংক্ষেপ/পরিষ্কারকরণ

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

অ্যাপ্লিকেশনটি স্থাপন এবং যাচাই করুন

gcloud app deploy দিয়ে আপনার অ্যাপটি ডিপ্লয় করুন। আউটপুটটি মডিউল ৭ অ্যাপের মতোই হওয়া উচিত, কিন্তু মনে রাখবেন যে আপনি সম্পূর্ণ ভিন্ন একটি পুশ কিউ প্রোডাক্ট ব্যবহার শুরু করেছেন, যা আপনার অ্যাপটিকে আগের চেয়ে আরও বেশি পোর্টেবল করে তুলেছে!

4aa8a2cb5f527079.png

পরিষ্কার করা

সাধারণ

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

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

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

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

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

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

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

এর মাধ্যমে অ্যাপ ইঞ্জিন টাস্ক কিউ পুশ টাস্ক থেকে ক্লাউড টাস্কে আমাদের মাইগ্রেশন সম্পন্ন হলো। আপনি যদি এই অ্যাপটিকে পাইথন ৩-এ পোর্ট করা এবং ক্লাউড এনডিবি থেকে ক্লাউড ডেটাস্টোরে আরও মাইগ্রেট করার কাজ চালিয়ে যেতে আগ্রহী হন, তাহলে মডিউল ৯ বিবেচনা করতে পারেন।

ক্লাউড এনডিবি বিশেষভাবে পাইথন ২ অ্যাপ ইঞ্জিন ডেভেলপারদের জন্য তৈরি, যা প্রায় একই রকম ইউজার এক্সপেরিয়েন্স প্রদান করে। কিন্তু ক্লাউড ডেটাস্টোরের নিজস্ব নেটিভ ক্লায়েন্ট লাইব্রেরি রয়েছে, যা অ্যাপ ইঞ্জিন ব্যবহার করেন না এমন ব্যক্তি বা নতুন (পাইথন ৩) অ্যাপ ইঞ্জিন ব্যবহারকারীদের জন্য বানানো। তবে, যেহেতু ক্লাউড এনডিবি পাইথন ২ এবং ৩ উভয়ের জন্যই উপলব্ধ, তাই ক্লাউড ডেটাস্টোরে মাইগ্রেট করার কোনো প্রয়োজন নেই।

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

মডিউল ৩, ৮, এবং ৯ ছাড়াও, অ্যাপ ইঞ্জিনের লিগ্যাসি বান্ডেলড সার্ভিসগুলো থেকে সরে আসার উপর দৃষ্টি নিবদ্ধকারী অন্যান্য মাইগ্রেশন মডিউলগুলোর মধ্যে বিবেচনা করা যেতে পারে:

  • মডিউল ২ : অ্যাপ ইঞ্জিন এনডিবি থেকে ক্লাউড এনডিবি-তে স্থানান্তর
  • মডিউল ১২-১৩ : অ্যাপ ইঞ্জিন মেমক্যাশ থেকে ক্লাউড মেমোরিস্টোরে স্থানান্তর
  • মডিউল ১৫-১৬ : অ্যাপ ইঞ্জিন ব্লবস্টোর থেকে ক্লাউড স্টোরেজে স্থানান্তর
  • মডিউল ১৮-১৯ : অ্যাপ ইঞ্জিন টাস্ক কিউ (টাস্ক পুল করা) থেকে ক্লাউড পাব/সাব-এ

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

  • অ্যাপ ইঞ্জিন থেকে ক্লাউড ফাংশনে স্থানান্তর করুন: মডিউল ১১ দেখুন।
  • অ্যাপ ইঞ্জিন থেকে ক্লাউড রান-এ মাইগ্রেট করুন: ডকার ব্যবহার করে আপনার অ্যাপকে কন্টেইনারাইজ করতে মডিউল ৪ দেখুন, অথবা কন্টেইনার, ডকার জ্ঞান বা Dockerfile ছাড়াই এটি করতে মডিউল ৫ দেখুন।

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

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

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

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

কোডল্যাবস সমস্যা/মতামত

এই কোডল্যাবে কোনো সমস্যা পেলে, অভিযোগ জানানোর আগে অনুগ্রহ করে সমস্যাটি অনুসন্ধান করুন। নতুন সমস্যা অনুসন্ধান ও তৈরি করার লিঙ্ক:

অভিবাসন সম্পদ

মডিউল ৭ (শুরু) এবং মডিউল ৮ (শেষ)-এর রিপো ফোল্ডারগুলোর লিঙ্ক নিচের টেবিলে পাওয়া যাবে।

কোডল্যাব

পাইথন ২

পাইথন ৩

মডিউল ৭

কোড

কোড (এই টিউটোরিয়ালে অন্তর্ভুক্ত নয়)

মডিউল ৮ (এই কোডল্যাব)

কোড

(প্রযোজ্য নয়)

অনলাইন রিসোর্স

এই টিউটোরিয়ালটির জন্য প্রাসঙ্গিক হতে পারে এমন কিছু অনলাইন রিসোর্স নিচে দেওয়া হলো:

অ্যাপ ইঞ্জিন টাস্ক কিউ এবং ক্লাউড টাস্ক

অ্যাপ ইঞ্জিন এনডিবি এবং ক্লাউড এনডিবি (ডেটাস্টোর)

অ্যাপ ইঞ্জিন প্ল্যাটফর্ম

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

ভিডিও

লাইসেন্স

এই কাজটি ক্রিয়েটিভ কমন্স অ্যাট্রিবিউশন ২.০ জেনেরিক লাইসেন্সের অধীনে রয়েছে।