ফ্লাস্ক অ্যাপে অ্যাপ ইঞ্জিন টাস্ক কিউ (টান টাস্ক) কীভাবে ব্যবহার করবেন (মডিউল 18)

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

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

এই কোডল্যাবটি আপনাকে শেখাবে কিভাবে মডিউল ১ কোডল্যাবের নমুনা অ্যাপটিতে অ্যাপ ইঞ্জিন টাস্ক কিউ (App Engine Task Queue) পুল টাস্ক অন্তর্ভুক্ত ও ব্যবহার করতে হয়। আমরা এই মডিউল ১৮ টিউটোরিয়ালে এর পুল টাস্কের ব্যবহার যোগ করব, এবং তারপর মডিউল ১৯-এ সেই ব্যবহারটি ক্লাউড পাব/সাব (Cloud Pub/Sub)-এ স্থানান্তর করব। যারা পুশ টাস্কের জন্য টাস্ক কিউ ব্যবহার করেন, তারা এর পরিবর্তে ক্লাউড টাস্ক (Cloud Tasks)-এ স্থানান্তরিত হবেন এবং তাদের মডিউল ৭-৯ দেখতে হবে।

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

  • অ্যাপ ইঞ্জিন টাস্ক কিউ এপিআই/বান্ডেলড পরিষেবা ব্যবহার করুন
  • একটি সাধারণ পাইথন ২ ফ্লাস্ক অ্যাপ ইঞ্জিন এনডিবি অ্যাপে পুল কিউ ব্যবহার যুক্ত করুন।

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

জরিপ

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

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

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

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

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

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

২. পটভূমি

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

যদিও আমরা এই ভিজিটর সংখ্যা গণনার জন্য পুশ টাস্ক ব্যবহার করতে পারতাম, আমরা এই দায়িত্বটি দুটি ভাগে ভাগ করতে চাই: একটি হলো স্যাম্পল অ্যাপ, যার কাজ হলো ভিজিট রেজিস্টার করা ও ব্যবহারকারীদের তাৎক্ষণিকভাবে উত্তর দেওয়া; এবং অন্যটি হলো একজন নির্দিষ্ট 'ওয়ার্কার', যার কাজ হলো সাধারণ রিকোয়েস্ট-রেসপন্স ওয়ার্কফ্লোর বাইরে ভিজিটর সংখ্যা গণনা করা।

এই ডিজাইনটি বাস্তবায়ন করতে, আমরা মূল অ্যাপ্লিকেশনে পুল কিউ (pull queue) ব্যবহারের পাশাপাশি ওয়ার্কার (worker) কার্যকারিতাও যুক্ত করছি। ওয়ার্কারটি একটি পৃথক প্রসেস (যেমন একটি ব্যাকএন্ড ইনস্ট্যান্স বা সর্বদা চালু থাকা ভিএম-এ চলমান কোড), একটি ক্রন জব (cron job), অথবা curl ) বা wget ) ব্যবহার করে একটি সাধারণ কমান্ড-লাইন এইচটিটিপি (HTTP) অনুরোধ হিসাবে চলতে পারে। এই ইন্টিগ্রেশনের পরে, আপনি পরবর্তী (মডিউল ১৯) কোডল্যাবে অ্যাপটি ক্লাউড পাব/সাব (Cloud Pub/Sub) -এ মাইগ্রেট করতে পারবেন।

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

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

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

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

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

এই ধাপগুলো নিশ্চিত করে যে আপনি একটি কার্যকর কোড দিয়ে কাজ শুরু করছেন।

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

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

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

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

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

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

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

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

  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. নিশ্চিত করুন যে মডিউল ১ অ্যাপটি প্রত্যাশিতভাবে চলছে এবং সাম্প্রতিকতম ভিজিটগুলো প্রদর্শন করছে (নিচে চিত্রিত)।

a7a9d2b80d706a2b.png

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

স্ট্যান্ডার্ড অ্যাপ ইঞ্জিন কনফিগারেশন ফাইলগুলিতে ( app.yaml , requirements.txt , appengine_config.py ) কোনো পরিবর্তনের প্রয়োজন নেই। এর পরিবর্তে, একই টপ-লেভেল ডিরেক্টরিতে queue.yaml নামে একটি নতুন কনফিগারেশন ফাইল যোগ করুন এবং তাতে নিম্নলিখিত বিষয়বস্তু রাখুন:

queue:
- name: pullq
  mode: pull

queue.yaml ফাইলটি আপনার অ্যাপের জন্য বিদ্যমান সমস্ত টাস্ক কিউ নির্দিষ্ট করে ( default [push] কিউ বাদে, যা App Engine দ্বারা স্বয়ংক্রিয়ভাবে তৈরি হয়)। এক্ষেত্রে, শুধুমাত্র একটিই পুল কিউ আছে, যার নাম pullq । App Engine-এর জন্য mode ডিরেক্টিভটি pull হিসেবে নির্দিষ্ট করা আবশ্যক, অন্যথায় এটি ডিফল্টরূপে একটি পুশ কিউ তৈরি করে। ডকুমেন্টেশনে পুল কিউ তৈরি করার বিষয়ে আরও জানুন। এছাড়াও অন্যান্য অপশনের জন্য queue.yaml রেফারেন্স পেজটি দেখুন।

এই ফাইলটি আপনার অ্যাপ থেকে আলাদাভাবে ডিপ্লয় করুন। আপনি gcloud app deploy ব্যবহার করার পাশাপাশি কমান্ড লাইনে queue.yaml ও প্রদান করবেন:

$ gcloud app deploy queue.yaml
Configurations to update:

descriptor:      [/tmp/mod18-gaepull/queue.yaml]
type:            [task queues]
target project:  [my-project]

WARNING: Caution: You are updating queue configuration. This will override any changes performed using 'gcloud tasks'. More details at
https://cloud.google.com/tasks/docs/queue-yaml

Do you want to continue (Y/n)?

Updating config [queue]...⠹WARNING: We are using the App Engine app location (us-central1) as the default location. Please use the "--location" flag if you want to use a different location.
Updating config [queue]...done.

Task queues have been updated.

Visit the Cloud Platform Console Task Queues page to view your queues and cron jobs.
$

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

এই বিভাগে নিম্নলিখিত ফাইলগুলির আপডেট রয়েছে:

  • main.py — মূল অ্যাপ্লিকেশনে পুল কিউ-এর ব্যবহার যোগ করুন
  • templates/index.html — নতুন ডেটা প্রদর্শনের জন্য ওয়েব টেমপ্লেটটি আপডেট করুন।

আমদানি এবং ধ্রুবক

প্রথম ধাপ হলো পুল কিউ সমর্থন করার জন্য একটি নতুন ইম্পোর্ট এবং কয়েকটি কনস্ট্যান্ট যোগ করা:

  • Task Queue লাইব্রেরি, google.appengine.api.taskqueue , ইম্পোর্ট করুন।
  • আমাদের পুল কিউ ( QUEUE ) থেকে এক ঘন্টার ( HOUR ) জন্য সর্বাধিক সংখ্যক পুল টাস্ক ( TASKS ) লিজ নেওয়ার সুবিধা দিতে তিনটি কনস্ট্যান্ট যোগ করুন।
  • সর্বশেষ ভিজিট এবং শীর্ষ ভিজিটরদের দেখানোর জন্য একটি ধ্রুবক যোগ করুন ( LIMIT )।

নিচে মূল কোড এবং এই আপডেটগুলো করার পর এটি কেমন দেখায় তা দেওয়া হলো:

পূর্বে:

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

app = Flask(__name__)

পরে:

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

HOUR = 3600
LIMIT = 10
TASKS = 1000
QNAME = 'pullq'
QUEUE = taskqueue.Queue(QNAME)
app = Flask(__name__)

একটি পুল টাস্ক যোগ করুন (টাস্কের জন্য ডেটা সংগ্রহ করুন এবং পুল কিউতে টাস্ক তৈরি করুন)

Visit ডেটা মডেলটি একই থাকবে, এবং fetch_visits() ফাংশনে প্রদর্শনের জন্য ভিজিট কোয়েরি করার পদ্ধতিও অপরিবর্তিত থাকবে। কোডের এই অংশে শুধুমাত্র store_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'
    Visit(visitor='{}: {}'.format(remote_addr, user_agent)).put()

def fetch_visits(limit):
    'get most recent visits'
    return Visit.query().order(-Visit.timestamp).fetch(limit)

পরে:

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 in Datastore and queue request to bump visitor count'
    Visit(visitor='{}: {}'.format(remote_addr, user_agent)).put()
    QUEUE.add(taskqueue.Task(payload=remote_addr, method='PULL'))

def fetch_visits(limit):
    'get most recent visits'
    return Visit.query().order(-Visit.timestamp).fetch(limit)

ভিজিটর ট্র্যাকিংয়ের জন্য ডেটা মডেল এবং কোয়েরি ফাংশন তৈরি করুন

ভিজিটরদের ট্র্যাক করার জন্য VisitorCount একটি ডেটা মডেল যোগ করুন; এতে visitor নিজের জন্য ফিল্ডের পাশাপাশি ভিজিটের সংখ্যা ট্র্যাক করার জন্য একটি ইন্টিজার counter থাকা উচিত। তারপর, সর্বাধিক থেকে সর্বনিম্ন ক্রমে শীর্ষ ভিজিটরদের কোয়েরি করে রিটার্ন করার জন্য fetch_counts() নামে একটি নতুন ফাংশন (বিকল্পভাবে, এটি একটি পাইথন classmethod হতে পারে) যোগ করুন। ক্লাস এবং ফাংশনটি fetch_visits() এর বডির ঠিক নিচে যোগ করুন:

class VisitorCount(ndb.Model):
    visitor = ndb.StringProperty(repeated=False, required=True)
    counter = ndb.IntegerProperty()

def fetch_counts(limit):
    'get top visitors'
    return VisitCount.query().order(-VisitCount.counter).fetch(limit)

কর্মী কোড যোগ করুন

/log এ একটি GET অনুরোধের মাধ্যমে ভিজিটরদের লগ করার জন্য log_visitors() একটি নতুন ফাংশন যোগ করুন। এটি এক ঘণ্টার জন্য যত বেশি সম্ভব টাস্ক লিজ নিয়ে সাম্প্রতিক ভিজিটর সংখ্যা ট্র্যাক করতে একটি ডিকশনারি/হ্যাশ ব্যবহার করে। প্রতিটি টাস্কের জন্য, এটি একই ভিজিটরের করা সমস্ত ভিজিট গণনা করে। গণনা হাতে পাওয়ার পর, অ্যাপটি ডেটাস্টোরে আগে থেকেই থাকা সমস্ত সংশ্লিষ্ট VisitorCount এনটিটি আপডেট করে অথবা প্রয়োজনে নতুন তৈরি করে। শেষ ধাপে, কতগুলো প্রক্রিয়াকৃত টাস্ক থেকে কতজন ভিজিটর নিবন্ধিত হয়েছে তা জানিয়ে একটি প্লেইন টেক্সট মেসেজ রিটার্ন করা হয়। এই ফাংশনটি main.py ফাইলে fetch_counts() এর ঠিক নিচে যোগ করুন:

@app.route('/log')
def log_visitors():
    'worker processes recent visitor counts and updates them in Datastore'
    # tally recent visitor counts from queue then delete those tasks
    tallies = {}
    tasks = QUEUE.lease_tasks(HOUR, TASKS)
    for task in tasks:
        visitor = task.payload
        tallies[visitor] = tallies.get(visitor, 0) + 1
    if tasks:
        QUEUE.delete_tasks(tasks)

    # increment those counts in Datastore and return
    for visitor in tallies:
        counter = VisitorCount.query(VisitorCount.visitor == visitor).get()
        if not counter:
            counter = VisitorCount(visitor=visitor, counter=0)
            counter.put()
        counter.counter += tallies[visitor]
        counter.put()
    return 'DONE (with %d task[s] logging %d visitor[s])\r\n' % (
            len(tasks), len(tallies))

নতুন ডিসপ্লে ডেটা দিয়ে প্রধান হ্যান্ডলার আপডেট করুন

শীর্ষ পরিদর্শকদের প্রদর্শন করতে, root() প্রধান হ্যান্ডলারটি আপডেট করে fetch_counts() কল করুন। এছাড়াও, শীর্ষ পরিদর্শক এবং সাম্প্রতিকতম পরিদর্শনের সংখ্যা দেখানোর জন্য টেমপ্লেটটি আপডেট করা হবে। fetch_visits() কল থেকে প্রাপ্ত পরিদর্শক সংখ্যা এবং সাম্প্রতিকতম পরিদর্শনের তথ্য একটি একক context এ প্যাকেজ করে ওয়েব টেমপ্লেটে পাঠান। এই পরিবর্তনটি করার আগে এবং পরের কোড নিচে দেওয়া হলো:

পূর্বে:

@app.route('/')
def root():
    'main application (GET) handler'
    store_visit(request.remote_addr, request.user_agent)
    visits = fetch_visits(10)
    return render_template('index.html', visits=visits)

পরে:

@app.route('/')
def root():
    'main application (GET) handler'
    store_visit(request.remote_addr, request.user_agent)
    context = {
        'limit':  LIMIT,
        'visits': fetch_visits(LIMIT),
        'counts': fetch_counts(LIMIT),
    }
    return render_template('index.html', **context)

main.py তে এই সমস্ত পরিবর্তনগুলো প্রয়োজন, এবং আপনি main.py তে যে পরিবর্তনগুলো করছেন সে সম্পর্কে একটি সামগ্রিক ধারণা দেওয়ার জন্য, দৃষ্টান্তস্বরূপ সেই আপডেটগুলোর একটি সচিত্র উপস্থাপনা এখানে দেওয়া হলো:

ad5fd3345efc13d0.png

নতুন ডিসপ্লে ডেটা দিয়ে ওয়েব টেমপ্লেট আপডেট করুন

` templates/index.html ওয়েব টেমপ্লেটটি আপডেট করা প্রয়োজন, যাতে সাম্প্রতিকতম ভিজিটরদের সাধারণ তালিকার পাশাপাশি শীর্ষ ভিজিটরদেরও দেখানো যায়। শীর্ষ ভিজিটরদের তালিকা এবং তাদের সংখ্যা পেজের উপরে একটি টেবিলে রাখুন এবং আগের মতোই সাম্প্রতিকতম ভিজিটগুলো রেন্ডার করতে থাকুন। একমাত্র অন্য পরিবর্তনটি হলো, সংখ্যাটি হার্ডকোড করার পরিবর্তে limit ভেরিয়েবলের মাধ্যমে প্রদর্শিত সংখ্যাটি নির্দিষ্ট করে দেওয়া। আপনার ওয়েব টেমপ্লেটে যে আপডেটগুলো করতে হবে তা নিচে দেওয়া হলো:

পূর্বে:

<!doctype html>
<html>
<head>
<title>VisitMe Example</title>
<body>

<h1>VisitMe example</h1>
<h3>Last 10 visits</h3>
<ul>
{% for visit in visits %}
    <li>{{ visit.timestamp.ctime() }} from {{ visit.visitor }}</li>
{% endfor %}
</ul>

পরে:

<!doctype html>
<html>
<head>
<title>VisitMe Example</title>
<body>

<h1>VisitMe example</h1>

<h3>Top {{ limit }} visitors</h3>
<table border=1 cellspacing=0 cellpadding=2>
    <tr><th>Visitor</th><th>Visits</th></tr>
{% for count in counts %}
    <tr><td>{{ count.visitor|e }}</td><td align="center">{{ count.counter }}</td></tr>
{% endfor %}
</table>

<h3>Last {{ limit }} visits</h3>
<ul>
{% for visit in visits %}
    <li>{{ visit.timestamp.ctime() }} from {{ visit.visitor }}</li>
{% endfor %}
</ul>

এর মাধ্যমে মডিউল ১ স্যাম্পল অ্যাপে অ্যাপ ইঞ্জিন টাস্ক কিউ পুল টাস্কের ব্যবহার যুক্ত করার প্রয়োজনীয় পরিবর্তনগুলো সম্পন্ন হলো। আপনার ডিরেক্টরিটি এখন মডিউল ১৮ স্যাম্পল অ্যাপকে নির্দেশ করে এবং এতে নিম্নলিখিত ফাইলগুলো থাকা উচিত:

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

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

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

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

এই কোডল্যাবের শুরুতে আমরা যেভাবে gcloud app deploy queue.yaml ব্যবহার করে আপনার পুল কিউ (pull queue) সেট আপ করেছিলাম, তা নিশ্চিত করুন। যদি তা সম্পন্ন হয়ে থাকে এবং আপনার স্যাম্পল অ্যাপটি ব্যবহারের জন্য প্রস্তুত থাকে, তবে gcloud app deploy দিয়ে আপনার অ্যাপটি ডিপ্লয় করুন। আউটপুটটি মডিউল ১-এর অ্যাপের মতোই হওয়া উচিত, তবে এখন এর শীর্ষে একটি "শীর্ষ পরিদর্শক" (top visitors) টেবিল থাকবে।

b667551dcbab1a09.png

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

আপনি /log কল করার মাধ্যমে বিভিন্ন উপায়ে কাজটি সম্পাদন করতে পারেন:

উদাহরণস্বরূপ, আপনি যদি curl ব্যবহার করে /log এ একটি `GET` রিকোয়েস্ট পাঠান, তাহলে আপনার PROJECT_ID দেওয়া থাকলে আউটপুটটি দেখতে এইরকম হবে:

$ curl https://PROJECT_ID.appspot.com/log
DONE (with 1 task[s] logging 1 visitor[s])

পরবর্তী ওয়েবসাইট পরিদর্শনে হালনাগাদ করা সংখ্যাটি দেখা যাবে। ব্যস!

স্যাম্পল অ্যাপটিতে অ্যাপ ইঞ্জিন টাস্ক কিউ পুল কিউ সার্ভিস সফলভাবে যুক্ত করার এই কোডল্যাবটি সম্পন্ন করার জন্য অভিনন্দন। এটি এখন মডিউল ১৯-এ ক্লাউড পাব/সাব, ক্লাউড এনডিবি এবং পাইথন ৩-এ মাইগ্রেট করার জন্য প্রস্তুত।

পরিষ্কার করা

সাধারণ

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

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

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

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

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

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

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

এই "মাইগ্রেশনে", আপনি ভিজিটর ট্র্যাক করার সাপোর্ট যোগ করার মাধ্যমে মডিউল ১ স্যাম্পল অ্যাপে টাস্ক কিউ পুশ কিউ-এর ব্যবহার যুক্ত করেছেন, যার ফলে মডিউল ১৮ স্যাম্পল অ্যাপটি ইমপ্লিমেন্ট করা হয়েছে। পরবর্তী মাইগ্রেশনে, আপনি অ্যাপ ইঞ্জিন পুল টাস্কগুলোকে ক্লাউড পাব/সাব-এ আপগ্রেড করবেন। ২০২১ সালের শেষের দিক থেকে, পাইথন ৩-এ আপগ্রেড করার সময় ব্যবহারকারীদের আর ক্লাউড পাব/সাব-এ মাইগ্রেট করার প্রয়োজন নেই। এ বিষয়ে আরও জানতে পরবর্তী সেকশনটি পড়ুন।

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

৭. পাইথন ৩-এ স্থানান্তর

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

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

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

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

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

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

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

মডিউল ১ (শুরু) এবং মডিউল ১৮ (শেষ)-এর রিপো ফোল্ডারগুলোর লিঙ্ক নিচের টেবিলে দেওয়া আছে। এছাড়াও, সমস্ত অ্যাপ ইঞ্জিন কোডল্যাব মাইগ্রেশনের রিপো থেকেও এগুলো অ্যাক্সেস করা যাবে; এর জন্য রিপোটি ক্লোন করুন অথবা একটি জিপ ফাইল ডাউনলোড করুন।

কোডল্যাব

পাইথন ২

পাইথন ৩

মডিউল ১

কোড

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

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

কোড

প্রযোজ্য নয়

অনলাইন রেফারেন্স

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

অ্যাপ ইঞ্জিন টাস্ক কিউ

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

অ্যাপ ইঞ্জিন ডকুমেন্টেশন

পাইথন ২ অ্যাপ ইঞ্জিন (স্ট্যান্ডার্ড এনভায়রনমেন্ট) রানটাইম

পাইথন ৩ অ্যাপ ইঞ্জিন (স্ট্যান্ডার্ড এনভায়রনমেন্ট) রানটাইম

পাইথন ২ এবং ৩ অ্যাপ ইঞ্জিন (স্ট্যান্ডার্ড এনভায়রনমেন্ট) রানটাইমের মধ্যে পার্থক্য

পাইথন ২ থেকে ৩ অ্যাপ ইঞ্জিন (স্ট্যান্ডার্ড এনভায়রনমেন্ট) মাইগ্রেশন গাইড

অ্যাপ ইঞ্জিনের মূল্য নির্ধারণ এবং কোটা সংক্রান্ত তথ্য

দ্বিতীয় প্রজন্মের অ্যাপ ইঞ্জিন প্ল্যাটফর্মের উদ্বোধন (২০১৮)

লিগ্যাসি রানটাইমগুলির জন্য দীর্ঘমেয়াদী সমর্থন

ডকুমেন্টেশন মাইগ্রেশন নমুনা

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

ভিডিও

লাইসেন্স

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