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

1. ওভারভিউ

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

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

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

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

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

সমীক্ষা

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

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

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

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

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

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

2. পটভূমি

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

পুল টাস্ক মাইগ্রেশন মাইগ্রেশন মডিউল 18-19 এ কভার করা হয়েছে যখন মডিউল 7-9 পুশ টাস্ক মাইগ্রেশনে ফোকাস করে। অ্যাপ ইঞ্জিন টাস্ক কিউ পুশ টাস্কগুলি থেকে স্থানান্তরিত করার জন্য, আমরা বিদ্যমান পাইথন 2 অ্যাপ ইঞ্জিন নমুনা অ্যাপে এর ব্যবহার যুক্ত করেছি যা নতুন পৃষ্ঠা ভিজিট নিবন্ধন করে এবং সাম্প্রতিক ভিজিটগুলি প্রদর্শন করে। মডিউল 7 কোডল্যাব প্রাচীনতম ভিজিটগুলি মুছে ফেলার জন্য একটি পুশ টাস্ক যুক্ত করে — সেগুলি আর কখনও দেখানো হবে না, তাহলে কেন তারা ডেটাস্টোরে অতিরিক্ত স্টোরেজ গ্রহণ করবে? এই মডিউল 8 কোডল্যাব একই কার্যকারিতা সংরক্ষণ করে কিন্তু অন্তর্নিহিত সারিবদ্ধ প্রক্রিয়াটিকে টাস্ক কিউ পুশ টাস্ক থেকে ক্লাউড টাস্কে স্থানান্তরিত করে সেইসাথে ডেটাস্টোর অ্যাক্সেসের জন্য অ্যাপ ইঞ্জিন এনডিবি থেকে ক্লাউড এনডিবিতে মডিউল 2 মাইগ্রেশনের পুনরাবৃত্তি করে।

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

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

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

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

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

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

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

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

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

পূর্বশর্তগুলির মধ্যে একটি হল একটি কার্যকরী মডিউল 7 অ্যাপ ইঞ্জিন অ্যাপ: মডিউল 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 ফোল্ডারটি মুছুন যদি একটি থাকে এবং 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. কোনো সমস্যা ছাড়াই অ্যাপটি প্রত্যাশিতভাবে চলছে তা নিশ্চিত করুন। আপনি যদি মডিউল 7 কোডল্যাব সম্পূর্ণ করেন, অ্যাপটি সাম্প্রতিক ভিজিট সহ শীর্ষ দর্শকদের প্রদর্শন করে (নীচে চিত্রিত)। নীচের অংশে পুরানো কাজগুলির একটি ইঙ্গিত রয়েছে যা মুছে ফেলা হবে৷

4aa8a2cb5f527079.png

4. নতুন Google ক্লাউড পরিষেবা/এপিআই সক্ষম করুন৷

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

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

ক্লাউড কনসোলে API ম্যানেজারের লাইব্রেরি পৃষ্ঠাতে যান (সঠিক প্রকল্পের জন্য), এবং পৃষ্ঠার মাঝখানে অনুসন্ধান বার ব্যবহার করে ক্লাউড ডেটাস্টোর এবং ক্লাউড টাস্ক এপিআই অনুসন্ধান করুন:

c7a740304e9d35b.png

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

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.

আপনাকে বিলিং তথ্যের জন্য অনুরোধ করা হতে পারে। আপনি যদি অন্যান্য ক্লাউড এপিআই সক্ষম করতে চান এবং তাদের "ইউআরআই" কী তা জানতে চান, সেগুলি প্রতিটি API-এর লাইব্রেরি পৃষ্ঠার নীচে পাওয়া যাবে। উদাহরণস্বরূপ, ঠিক উপরের Pub/Sub পৃষ্ঠার নীচে pubsub.googleapis.com "পরিষেবার নাম" হিসাবে দেখুন৷

পদক্ষেপগুলি সম্পূর্ণ হওয়ার পরে, আপনার প্রকল্প API গুলি অ্যাক্সেস করতে সক্ষম হবে৷ এখন সেই APIগুলি ব্যবহার করার জন্য অ্যাপটি আপডেট করার সময়।

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

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

requirements.txt

মডিউল 8 ক্লাউড এনডিবি এবং ক্লাউড টাস্কের সাথে মডিউল 1 থেকে অ্যাপ ইঞ্জিন এনডিবি এবং টাস্ক কিউ ব্যবহার করে। google-cloud-ndb এবং google-cloud-tasks উভয়ই requirements.txt এ যোগ করুন যাতে মডিউল 7 থেকে flask যোগ দিতে পারেন:

flask
google-cloud-ndb
google-cloud-tasks

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

app.yaml

ক্লাউড ক্লায়েন্ট লাইব্রেরি ব্যবহার করার সময়, পাইথন 2 অ্যাপ ইঞ্জিন রানটাইমের জন্য নির্দিষ্ট তৃতীয় পক্ষের প্যাকেজ প্রয়োজন, যেমন 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.pygoogle.appengine.ext.vendor.add() কলটি আপনার অনুলিপি করা (কখনও কখনও "ভেন্ডরিং" বা "সেলফ-বান্ডলিং" বলা হয়) 3য়-পার্টি লাইব্রেরিগুলিকে আপনার অ্যাপের সাথে lib করে। app.yaml এর উপরে, আমরা বিল্ট-ইন 3য়-পার্টি লাইব্রেরি যোগ করেছি এবং সেগুলির প্রয়োজন setuptools.pkg_resources.working_set.add_entry() যাতে আপনার অ্যাপটি lib এ অন্তর্নির্মিত প্যাকেজগুলির সাথে সংযুক্ত থাকে। নীচে আসল মডিউল 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)

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

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

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

  1. আমদানি এবং সূচনা আপডেট করুন
  2. ডেটা মডেল কার্যকারিতা আপডেট করুন (ক্লাউড এনডিবি)
  3. ক্লাউড টাস্কে স্থানান্তর করুন (এবং ক্লাউড এনডিবি)
  4. টাস্ক হ্যান্ডলার (ধাক্কা) আপডেট করুন

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

  1. App Engine NDB ( google.appengine.ext.ndb ) এবং টাস্ক কিউ ( google.appengine.api.taskqueue ) যথাক্রমে ক্লাউড NDB ( google.cloud.ndb ) এবং ক্লাউড টাস্ক ( google.cloud.tasks ) দিয়ে প্রতিস্থাপন করুন৷
  2. ক্লাউড ক্লায়েন্ট লাইব্রেরিগুলির জন্য "API ক্লায়েন্টগুলি" শুরু করা এবং তৈরি করা প্রয়োজন; তাদের যথাক্রমে 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)

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

অ্যাপ ইঞ্জিন এনডিবি এবং ক্লাউড এনডিবি প্রায় একইভাবে কাজ করে। ডেটা মডেল বা 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()

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

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

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

এই কর্মপ্রবাহটি "আগে" কোড স্নিপেট দ্বারা চিত্রিত করা হয়েছে:

আগে:

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. ব্লক with পাইথনের ভিতরে Visit ক্যোয়ারী মোড়ানো (ক্লাউড এনডিবিতে মডিউল 2 মাইগ্রেশনের পুনরাবৃত্তি)
  2. টাইমস্ট্যাম্প পেলোড এবং URL এর মতো প্রত্যাশিত বৈশিষ্ট্যগুলি সহ ক্লাউড টাস্ক মেটাডেটা তৈরি করুন, তবে MIME প্রকার যোগ করুন এবং পেলোডটিকে JSON-এনকোড করুন৷
  3. মেটাডেটা এবং সারির সম্পূর্ণ পাথনাম দিয়ে টাস্ক তৈরি করতে ক্লাউড টাস্ক 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. টাইমস্ট্যাম্প পেলোডটি টাস্ক কিউতে মৌখিকভাবে পাস করা হয়েছিল, কিন্তু এটি ক্লাউড টাস্কের জন্য JSON-এনকোড করা ছিল এবং তাই পৌঁছানোর পরে অবশ্যই JSON-পার্স করা উচিত।
  2. টাস্ক কিউ সহ /trim জন্য HTTP POST কলটিতে একটি অন্তর্নিহিত MIME টাইপ application/x-www-form-urlencoded ছিল, কিন্তু ক্লাউড টাস্কের সাথে, এটিকে স্পষ্টভাবে application/json হিসাবে মনোনীত করা হয়েছে, তাই পেলোডটি বের করার একটি সামান্য ভিন্ন উপায় রয়েছে।
  3. ক্লাউড এনডিবি এপিআই ক্লায়েন্ট কনটেক্সট ম্যানেজার ব্যবহার করুন (ক্লাউড এনডিবিতে মডিউল 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

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

সাধারণ

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

সম্পূর্ণ প্রকাশের জন্য, অ্যাপ ইঞ্জিনের মতো একটি 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 তে হোস্ট করা হয়৷

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

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

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

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

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

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

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

মডিউল 3, 8 এবং 9 এর বাইরে, অন্যান্য মাইগ্রেশন মডিউলগুলি বিবেচনা করার জন্য অ্যাপ ইঞ্জিন লিগ্যাসি বান্ডেল করা পরিষেবাগুলি থেকে দূরে সরে যাওয়ার উপর দৃষ্টি নিবদ্ধ করে:

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

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

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

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

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

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

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

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

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

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

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

কোডল্যাব

পাইথন 2

পাইথন 3

মডিউল 7

কোড

কোড (এই টিউটোরিয়ালে বৈশিষ্ট্যযুক্ত নয়)

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

কোড

(n/a)

অনলাইন সম্পদ

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

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

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

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

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

ভিডিও

লাইসেন্স

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