১. সংক্ষিপ্ত বিবরণ
এই কোডল্যাব সিরিজটির (নিজের গতিতে শেখার উপযোগী, হাতে-কলমে টিউটোরিয়াল) লক্ষ্য হলো গুগল অ্যাপ ইঞ্জিন (স্ট্যান্ডার্ড) ডেভেলপারদের কয়েকটি মাইগ্রেশন প্রক্রিয়ার মধ্য দিয়ে পথ দেখিয়ে তাদের অ্যাপগুলোকে আধুনিক করে তুলতে সাহায্য করা। সবচেয়ে গুরুত্বপূর্ণ পদক্ষেপটি হলো মূল রানটাইমের বান্ডেল করা সার্ভিসগুলো থেকে সরে আসা, কারণ পরবর্তী প্রজন্মের রানটাইমগুলো আরও বেশি নমনীয় এবং ব্যবহারকারীদের বিভিন্ন ধরনের সার্ভিস বেছে নেওয়ার সুযোগ দেয়। নতুন প্রজন্মের রানটাইমে স্থানান্তরিত হলে আপনি গুগল ক্লাউড প্রোডাক্টগুলোর সাথে আরও সহজে ইন্টিগ্রেট করতে, আরও বেশি সংখ্যক সাপোর্টেড সার্ভিস ব্যবহার করতে এবং বর্তমান ল্যাঙ্গুয়েজ রিলিজগুলোকে সাপোর্ট করতে পারবেন।
এই টিউটোরিয়ালটি আপনাকে শেখাবে কীভাবে অ্যাপ ইঞ্জিনের বিল্ট-ইন ndb (নেক্সট ডেটাবেস) ক্লায়েন্ট লাইব্রেরি থেকে ক্লাউড এনডিবি ক্লায়েন্ট লাইব্রেরিতে মাইগ্রেট করতে হয়।
আপনি শিখবেন কিভাবে
- অ্যাপ ইঞ্জিন
ndbলাইব্রেরিটি ব্যবহার করুন (যদি আপনি এটির সাথে পরিচিত না হন)। -
ndbথেকে ক্লাউড এনডিবি-তে স্থানান্তরিত করুন - আপনার অ্যাপটিকে আরও পাইথন ৩-এ স্থানান্তর করুন।
আপনার যা যা লাগবে
- একটি গুগল ক্লাউড প্ল্যাটফর্ম প্রকল্প, যার বৈশিষ্ট্যগুলো হলো:
- পাইথনের প্রাথমিক দক্ষতা
- সাধারণ লিনাক্স কমান্ড সম্পর্কে কার্যকরী জ্ঞান
- অ্যাপ ইঞ্জিন অ্যাপ তৈরি এবং স্থাপন করার প্রাথমিক জ্ঞান
- একটি কার্যকরী মডিউল ১ অ্যাপ ইঞ্জিন অ্যাপ
জরিপ
আপনি এই কোডল্যাবটি কীভাবে ব্যবহার করবেন?
২. পটভূমি
মডিউল ১-এ, আমরা অ্যাপ ইঞ্জিনের বিল্ট-ইন webapp2 থেকে Flask- এ ওয়েব ফ্রেমওয়ার্ক স্থানান্তর করেছিলাম। এই কোডল্যাবে, আমরা অ্যাপ ইঞ্জিনের ndb লাইব্রেরি থেকে গুগল ক্লাউড NDB- তে স্থানান্তরের মাধ্যমে অ্যাপ ইঞ্জিনের বিল্ট-ইন সার্ভিসগুলো থেকে আরও দূরে সরে যাব।
এই মাইগ্রেশনটি সম্পন্ন করার মাধ্যমে আপনি এরপর যা করতে পারবেন:
- পাইথন ৩ এবং পরবর্তী প্রজন্মের অ্যাপ ইঞ্জিন রানটাইমে স্থানান্তরিত হন
- ক্লাউড ডেটাস্টোরে স্থানান্তরিত করুন (নন-অ্যাপ ইঞ্জিন অ্যাপের জন্য ক্লায়েন্ট লাইব্রেরি)
- আপনার পাইথন ২ (বা ৩) অ্যাপকে কন্টেইনারাইজ করুন এবং ক্লাউড রানে মাইগ্রেট করুন।
- অ্যাপ ইঞ্জিন (পুশ) টাস্ক কিউ-এর ব্যবহার যোগ করুন , তারপর ক্লাউড টাস্ক-এ স্থানান্তরিত করুন।
কিন্তু, আমরা এখনও লক্ষ্যে পৌঁছাইনি। পরবর্তী পদক্ষেপগুলো বিবেচনা করার আগে এই কোডল্যাবটি শেষ করুন। এই টিউটোরিয়ালের মাইগ্রেশনে নিম্নলিখিত প্রধান ধাপগুলো রয়েছে:
- প্রস্তুতি/পূর্বপ্রস্তুতি
- ক্লাউড এনডিবি লাইব্রেরি যোগ করুন
- অ্যাপ্লিকেশন ফাইলগুলি আপডেট করুন
৩. প্রস্তুতি/পূর্বপ্রস্তুতি
টিউটোরিয়ালের মূল অংশে যাওয়ার আগে, চলুন আমাদের প্রজেক্টটি সেটআপ করি, কোডটি সংগ্রহ করি এবং তারপর বেসলাইন অ্যাপটি ডিপ্লয় করি, যাতে আমরা নিশ্চিত হতে পারি যে আমরা কার্যকরী কোড দিয়েই কাজ শুরু করেছি।
১. প্রকল্প স্থাপন করুন
আপনি যদি মডিউল ১ কোডল্যাবটি সম্পন্ন করে থাকেন, তাহলে আমরা সেই একই প্রজেক্ট (এবং কোড) পুনরায় ব্যবহার করার পরামর্শ দিচ্ছি। বিকল্পভাবে, আপনি একটি সম্পূর্ণ নতুন প্রজেক্ট তৈরি করতে পারেন অথবা অন্য কোনো বিদ্যমান প্রজেক্ট পুনরায় ব্যবহার করতে পারেন। নিশ্চিত করুন যে প্রজেক্টটির একটি সক্রিয় বিলিং অ্যাকাউন্ট আছে এবং অ্যাপ ইঞ্জিন (App Engine) চালু করা আছে।
২. বেসলাইন নমুনা অ্যাপটি নিন
পূর্বশর্তগুলোর মধ্যে একটি হলো একটি কার্যকর মডিউল ১ স্যাম্পল অ্যাপ থাকা। আপনি যদি সেই টিউটোরিয়ালটি সম্পন্ন করে থাকেন, তবে আপনার সমাধানটি ব্যবহার করুন। আপনি এটি এখনই সম্পন্ন করতে পারেন (উপরের লিঙ্ক), অথবা যদি এটি এড়িয়ে যেতে চান, তাহলে মডিউল ১ রিপোটি কপি করুন (নীচের লিঙ্ক)।
আপনি আপনার নিজের বা আমাদের কোড ব্যবহার করুন না কেন, আমরা মডিউল ১-এর কোড থেকেই শুরু করব। এই মডিউল ২ কোডল্যাবটি আপনাকে প্রতিটি ধাপের মধ্য দিয়ে নিয়ে যাবে, এবং এটি সম্পূর্ণ হলে, কোডটি চূড়ান্ত পর্যায়ের কোডের মতো দেখতে হবে (যার মধ্যে পাইথন ২ থেকে ৩-এ পোর্ট করার একটি ঐচ্ছিক "বোনাস" অংশও রয়েছে):
- শুরু: মডিউল ১ কোড
- সমাপ্ত: মডিউল ২ পাইথন ২ কোড (বোনাস: পাইথন ৩ কোড )
- সম্পূর্ণ রিপো (ক্লোন বা জিপ ডাউনলোড করার জন্য)
আপনার STARting Module 1 কোড ফোল্ডারে নিম্নলিখিত বিষয়বস্তু থাকা উচিত:
$ ls
README.md appengine_config.py requirements.txt
app.yaml main.py templates
আপনি যদি মডিউল ১ টিউটোরিয়ালটি সম্পন্ন করে থাকেন, তাহলে আপনার একটি lib ফোল্ডারও থাকবে যেখানে Flask এবং এর ডিপেন্ডেন্সিগুলো রয়েছে। যদি আপনার ' lib ফোল্ডার না থাকে, তাহলে pip install -t lib -r requirements.txt ' কমান্ডটি দিয়ে এটি তৈরি করুন, যাতে আমরা পরবর্তী ধাপে এই বেসলাইন অ্যাপটি ডেপ্লয় করতে পারি। যদি আপনার সিস্টেমে Python 2 এবং 3 উভয়ই ইনস্টল করা থাকে, তাহলে Python 3-এর সাথে বিভ্রান্তি এড়াতে আমরা ' pip এর পরিবর্তে pip2 ব্যবহার করার পরামর্শ দিই।
৩. মডিউল ১ অ্যাপ (পুনরায়) স্থাপন করুন
এখন আপনার বাকি প্রস্তুতিমূলক ধাপগুলো সম্পন্ন করতে হবে:
-
gcloudকমান্ড-লাইন টুলটির সাথে পুনরায় পরিচিত হয়ে নিন (প্রয়োজন হলে)। - (প্রয়োজন হলে) মডিউল ১-এর কোড অ্যাপ ইঞ্জিনে পুনরায় ডেপ্লয় করুন।
একবার আপনি সফলভাবে সেই ধাপগুলো সম্পন্ন করে এর কার্যকারিতা নিশ্চিত করলে, আমরা এই টিউটোরিয়ালে কনফিগারেশন ফাইলগুলো দিয়ে শুরু করে এগিয়ে যাব।
৪. কনফিগারেশন ফাইল আপডেট করুন (ক্লাউড এনডিবি লাইব্রেরি যোগ করুন)
অ্যাপ ইঞ্জিনের অনেক মূল বিল্ট-ইন পরিষেবা নিজস্ব পণ্যে পরিণত হয়েছে, এবং ডেটাস্টোর তাদের মধ্যে অন্যতম। বর্তমানে, অ্যাপ ইঞ্জিন-বহির্ভূত অ্যাপগুলো ক্লাউড ডেটাস্টোর ব্যবহার করতে পারে। দীর্ঘদিনের ndb ব্যবহারকারীদের জন্য, গুগল ক্লাউড টিম ক্লাউড ডেটাস্টোরের সাথে যোগাযোগের জন্য ক্লাউড এনডিবি ক্লায়েন্ট লাইব্রেরি তৈরি করেছে। এটি পাইথন ২ এবং ৩ উভয়ের জন্যই উপলব্ধ।
চলুন, কনফার্মেশন ফাইলগুলো আপডেট করে App Engine ndb Cloud NDB দিয়ে প্রতিস্থাপন করি এবং তারপর আমাদের অ্যাপ্লিকেশনটি পরিবর্তন করি।
১. requirements.txt আপডেট করুন।
মডিউল ১-এ, আমাদের অ্যাপের একমাত্র এক্সটার্নাল ডিপেন্ডেন্সি ছিল ফ্লাস্ক (Flask)। এখন আমরা ক্লাউড এনডিবি (Cloud NDB) যোগ করব। মডিউল ১-এর শেষে আপনার requirements.txt ফাইলটি দেখতে এইরকম ছিল:
- পূর্বে:
Flask==1.1.2
App Engine ndb থেকে সরে আসতে Cloud NDB লাইব্রেরি ( google-cloud-ndb ) প্রয়োজন, তাই এর প্যাকেজটি requirements.txt এ যোগ করুন।
- পরে:
Flask==1.1.2
google-cloud-ndb==1.7.1
এই কোডল্যাবটি লেখার সময়, সর্বশেষ প্রস্তাবিত সংস্করণ ছিল ১.৭.১, কিন্তু রিপোজিটরিতে থাকা requirements.txt ফাইলে আরও নতুন সংস্করণ থাকতে পারে। আমরা প্রতিটি লাইব্রেরির সর্বশেষ সংস্করণ ব্যবহারের পরামর্শ দিই, কিন্তু যদি সেগুলি কাজ না করে, তবে আপনি আগের কোনো রিলিজে ফিরে যেতে পারেন।
আপনার যদি lib ফোল্ডার থাকে এবং আপনি উপরে সেটি তৈরি না করে থাকেন, তবে সেটি মুছে ফেলুন। এখন, প্রয়োজনে pip এর পরিবর্তে pip2 ব্যবহার করে pip install -t lib -r requirements.txt কমান্ডের মাধ্যমে আপডেট করা লাইব্রেরিগুলো (পুনরায়) ইনস্টল করুন।
২. app.yaml আপডেট করুন।
google-cloud-ndb এর মতো গুগল ক্লাউড ক্লায়েন্ট লাইব্রেরি যোগ করার জন্য কয়েকটি পূর্বশর্ত রয়েছে, যার সবই "বিল্ট-ইন" লাইব্রেরি বা গুগল সার্ভারে আগে থেকেই উপলব্ধ থার্ড-পার্টি প্যাকেজ অন্তর্ভুক্ত করার সাথে সম্পর্কিত। আপনি এগুলি requirements.txt ফাইলে তালিকাভুক্ত করবেন না বা pip install দিয়ে কপিও করবেন না। একমাত্র প্রয়োজনীয়তাগুলি হলো:
-
app.yamlএ বিল্ট-ইন লাইব্রেরিগুলো উল্লেখ করুন। - তাদেরকে কপি করা থার্ড-পার্টি লাইব্রেরিগুলোর দিকে নির্দেশ করুন যেগুলো তারা ব্যবহার করতে পারে (
libএর মধ্যে)।
এখানে মডিউল ১-এর শুরুর app.yaml ফাইলটি দেওয়া হলো:
- পূর্বে:
runtime: python27
threadsafe: yes
api_version: 1
handlers:
- url: /.*
script: main.app
এখন app.yaml একটি নতুন libraries সেকশনে grpcio এবং setuptools নামের দুটি থার্ড-পার্টি বান্ডেল প্যাকেজ রেফারেন্স করার জন্য নিচের লাইনগুলো যোগ করুন:
libraries:
- name: grpcio
version: 1.0.0
- name: setuptools
version: 36.6.0
এই বিল্ট-ইন লাইব্রেরিগুলো কেন ব্যবহার করবেন? gRPC হলো একটি ওপেন RPC ফ্রেমওয়ার্ক যা google-cloud-ndb সহ সমস্ত গুগল ক্লাউড ক্লায়েন্ট লাইব্রেরি ব্যবহার করে। grpcio লাইব্রেরিটি হলো পাইথন gRPC অ্যাডাপ্টার এবং তাই এটি আবশ্যক। setuptools অন্তর্ভুক্ত করার কারণ পরে ব্যাখ্যা করা হবে।
- পরে:
উপরের পরিবর্তনগুলোর পর, আপনার আপডেট করা app.yaml এখন দেখতে এইরকম হবে:
runtime: python27
threadsafe: yes
api_version: 1
handlers:
- url: /.*
script: main.app
libraries:
- name: grpcio
version: 1.0.0
- name: setuptools
version: 36.6.0
৩. appengine_config.py আপডেট করুন।
setuptools লাইব্রেরির অংশ pkg_resources টুলটি বিল্ট-ইন থার্ড-পার্টি লাইব্রেরিগুলোকে বান্ডেল করা লাইব্রেরিগুলো অ্যাক্সেস করার সুযোগ দিতে ব্যবহৃত হয়। lib এ থাকা বান্ডেল করা লাইব্রেরিগুলোকে নির্দেশ করার জন্য pkg_resources ব্যবহার করতে appengine_config.py আপডেট করুন। এই পরিবর্তনটি সম্পন্ন করার পর, সম্পূর্ণ ফাইলটি দেখতে এইরকম হবে:
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)
৫. অ্যাপ্লিকেশন ফাইলগুলো আপডেট করুন
কনফিগারেশন ফাইলের আনুষ্ঠানিকতা সম্পন্ন হয়ে গেলে, আপনি এখন ndb থেকে Cloud NDB-তে মাইগ্রেট করতে পারেন। মাইগ্রেশনটি সম্পূর্ণ করতে, ইম্পোর্ট করা লাইব্রেরিগুলো আপডেট করুন এবং main.py ফাইলে কনটেক্সট ম্যানেজমেন্টের ব্যবহার যুক্ত করুন।
১. আমদানি
main.py ফাইলে নিম্নলিখিত ইম্পোর্ট অদলবদলটি করুন:
- পূর্বে
from google.appengine.ext import ndb
- পরে:
from google.cloud import ndb
অ্যাপ ইঞ্জিন লাইব্রেরি থেকে গুগল ক্লাউড লাইব্রেরিতে পরিবর্তন কখনও কখনও এই উদাহরণটির মতোই সূক্ষ্ম হয়। যেসব বিল্ট-ইন পরিষেবা এখন পূর্ণাঙ্গ গুগল ক্লাউড পণ্যে পরিণত হয়েছে, সেগুলোর ক্ষেত্রে আপনাকে google.appengine এর পরিবর্তে google.cloud থেকে অ্যাট্রিবিউট ইম্পোর্ট করতে হবে।
২. ডেটাস্টোর অ্যাক্সেস
ক্লাউড এনডিবি লাইব্রেরি ব্যবহার করতে হলে, আপনার অ্যাপে অবশ্যই পাইথন কনটেক্সট ম্যানেজার ব্যবহার করতে হবে। এগুলোর উদ্দেশ্য হলো রিসোর্সের অ্যাক্সেসকে "নিয়ন্ত্রিত" করা, যাতে ব্যবহারের আগে সেগুলোকে অবশ্যই অধিগ্রহণ করতে হয়। কনটেক্সট ম্যানেজারগুলো রিসোর্স অ্যালোকেশন ইনিশিয়ালাইজেশন (বা RAII) নামে পরিচিত কম্পিউটার সায়েন্সের নিয়ন্ত্রণ কৌশলের উপর ভিত্তি করে তৈরি। কনটেক্সট ম্যানেজারগুলো পাইথন ফাইল (যা অ্যাক্সেস করার আগে অবশ্যই খুলতে হয়) এবং কনকারেন্সির সাথে ব্যবহৃত হয়; একটি " ক্রিটিক্যাল সেকশন "-এর কোড এক্সিকিউট করার আগে অবশ্যই " স্পিন লক " অধিগ্রহণ করতে হয়।
একইভাবে, ডেটাস্টোরের যেকোনো কমান্ড কার্যকর করার আগে ক্লাউড এনডিবি-র জন্য ডেটাস্টোরের সাথে যোগাযোগ করতে একটি ক্লায়েন্টের কনটেক্সট অর্জন করা প্রয়োজন। প্রথমে, ফ্লাস্ক ইনিশিয়ালাইজেশনের ঠিক পরে main.py তে ds_client = ndb.Client() যোগ করে একটি ক্লায়েন্ট ( ndb.Client() ) তৈরি করুন:
app = Flask(__name__)
ds_client = ndb.Client()
পাইথনের ` with কমান্ডটি শুধুমাত্র কোনো অবজেক্টের `context` পেতে ব্যবহৃত হয়। ডেটাস্টোর অ্যাক্সেস করে এমন যেকোনো কোড ব্লক ` with স্টেটমেন্টের মধ্যে রাখুন।
ডেটাস্টোরে একটি নতুন এনটিটি লেখার এবং সর্বশেষ যুক্ত হওয়া এনটিটিগুলো পড়ার জন্য মডিউল ১-এর একই ফাংশনগুলো নিচে দেওয়া হলো:
- পূর্বে:
এখানে কনটেক্সট ম্যানেজমেন্ট ছাড়া মূল কোডটি দেওয়া হলো:
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 (v.to_dict() for v in Visit.query().order(
-Visit.timestamp).fetch(limit))
- পরে:
এখন with ds_client.context(): যোগ করুন এবং আপনার ডেটাস্টোর অ্যাক্সেস কোডটি with ব্লকের মধ্যে নিয়ে যান:
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()
def fetch_visits(limit):
'get most recent visits'
with ds_client.context():
return (v.to_dict() for v in Visit.query().order(
-Visit.timestamp).fetch(limit))
মূল ড্রাইভার অ্যাপ্লিকেশনটি মডিউল ১-এর মতোই হুবহু একই থাকে, কারণ এখানে কোনো ndb (কিংবা ক্লাউড NDB) কোড নেই:
@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)
একটি উত্তম অনুশীলন হলো অ্যাপ্লিকেশন কোড এবং ডেটা অ্যাক্সেসের মধ্যে একটি সুস্পষ্ট পার্থক্য নিশ্চিত করা। এর ফলে, অন্তর্নিহিত ডেটা স্টোরেজ প্রক্রিয়া পরিবর্তিত হলেও আপনার মূল অ্যাপ্লিকেশন কোড পরিবর্তিত হয় না, যেমনটি আমরা এই মাইগ্রেশনের ক্ষেত্রে করেছি।
৬. সারসংক্ষেপ/পরিষ্কারকরণ
অ্যাপ্লিকেশন স্থাপন করুন
gcloud app deploy দিয়ে আপনার অ্যাপটি পুনরায় ডিপ্লয় করুন এবং অ্যাপটি কাজ করছে কিনা তা নিশ্চিত করুন। আপনার কোড এখন মডিউল ২ রিপোজিটরিতে থাকা কোডের সাথে মিলে যাবে।
আপনি যদি আগের কোনো কোডল্যাব না করেই এই সিরিজে চলে আসেন, তাহলেও অ্যাপটির নিজের কোনো পরিবর্তন হয় না; এটি মূল ওয়েব পেজে ( / ) সমস্ত ভিজিট রেকর্ড করে এবং যথেষ্ট সংখ্যকবার সাইটটি ভিজিট করার পর এটি দেখতে এইরকম হয়ে যায়:

এই মডিউল ২ কোডল্যাবটি সম্পন্ন করার জন্য অভিনন্দন। আপনি প্রায় শেষ সীমায় পৌঁছে গেছেন, কারণ ডেটাস্টোরের ক্ষেত্রে এই সিরিজের জোরালোভাবে সুপারিশকৃত মাইগ্রেশনগুলোর মধ্যে এটিই শেষ।
ঐচ্ছিক: পরিষ্কার করা
পরবর্তী মাইগ্রেশন কোডল্যাবে যাওয়ার জন্য প্রস্তুত না হওয়া পর্যন্ত বিল এড়ানোর জন্য কোডগুলো গুছিয়ে নিলে কেমন হয়? বিদ্যমান ডেভেলপার হিসেবে, আপনারা সম্ভবত অ্যাপ ইঞ্জিনের মূল্য নির্ধারণের তথ্য সম্পর্কে ইতিমধ্যেই অবগত আছেন।
ঐচ্ছিক: অ্যাপটি নিষ্ক্রিয় করুন
আপনি যদি এখনও পরবর্তী টিউটোরিয়ালে যাওয়ার জন্য প্রস্তুত না হন, তাহলে চার্জ এড়ানোর জন্য আপনার অ্যাপটি নিষ্ক্রিয় করে দিন । যখন আপনি পরবর্তী কোডল্যাবে যাওয়ার জন্য প্রস্তুত হবেন, তখন আপনি এটি পুনরায় সক্রিয় করতে পারেন। আপনার অ্যাপটি নিষ্ক্রিয় থাকা অবস্থায়, এতে কোনো ট্র্যাফিক আসবে না যার জন্য চার্জ প্রযোজ্য হবে। তবে, আপনার ডেটাস্টোরের ব্যবহার যদি বিনামূল্যের কোটা অতিক্রম করে, তাহলে তার জন্য আপনাকে বিল করা হতে পারে। তাই, সেই সীমার মধ্যে থাকার জন্য যথেষ্ট পরিমাণ ডেটা মুছে ফেলুন।
অন্যদিকে, যদি আপনি মাইগ্রেশন চালিয়ে যেতে না চান এবং সবকিছু পুরোপুরি মুছে ফেলতে চান, তাহলে আপনি আপনার প্রজেক্টটি শাটডাউন করতে পারেন।
পরবর্তী পদক্ষেপ
এখান থেকে আপনার পরবর্তী পদক্ষেপের ব্যাপারে স্বাধীনতা রয়েছে। এই বিকল্পগুলোর যেকোনো একটি বেছে নিন:
- মডিউল ২ বোনাস: পাইথন ৩ এবং পরবর্তী প্রজন্মের অ্যাপ ইঞ্জিন রানটাইমে পোর্টিং সম্পর্কে জানতে এই টিউটোরিয়ালের বোনাস অংশের জন্য নিচে দেখুন।
- মডিউল ৭: অ্যাপ ইঞ্জিন পুশ টাস্ক কিউ (যদি আপনি [push] টাস্ক কিউ ব্যবহার করেন তবে এটি আবশ্যক)
- মডিউল ১ অ্যাপে অ্যাপ ইঞ্জিন
taskqueueপুশ টাস্ক যোগ করে। - মডিউল ৮-এ ক্লাউড টাস্ক- এ স্থানান্তরের জন্য ব্যবহারকারীদের প্রস্তুত করে।
- মডিউল ১ অ্যাপে অ্যাপ ইঞ্জিন
- মডিউল ৪: ডকারের সাহায্যে ক্লাউড রানে মাইগ্রেট করুন
- ডকারের সাহায্যে আপনার অ্যাপকে কন্টেইনারাইজ করে ক্লাউড রানে চালান।
- আপনাকে পাইথন ২ ব্যবহার করতে দেয়
- মডিউল ৫: ক্লাউড বিল্ডপ্যাকস সহ ক্লাউড রান-এ মাইগ্রেট করুন
- Cloud Buildpacks ব্যবহার করে আপনার অ্যাপকে Cloud Run-এ চালানোর জন্য কন্টেইনারাইজ করুন।
- আপনার ডকার, কন্টেইনার বা
Dockerfileসম্পর্কে কিছুই জানার প্রয়োজন নেই। - এর জন্য আপনাকে ইতিমধ্যেই আপনার অ্যাপটি পাইথন ৩-এ মাইগ্রেট করে থাকতে হবে।
- মডিউল ৩:
- ক্লাউড এনডিবি থেকে ক্লাউড ডেটাস্টোরে ডেটাস্টোর অ্যাক্সেস আধুনিকীকরণ করুন
- এই লাইব্রেরিটি পাইথন ৩ অ্যাপ ইঞ্জিন অ্যাপ এবং নন-অ্যাপ ইঞ্জিন অ্যাপে ব্যবহৃত হয়।
৭. বোনাস: পাইথন ৩-এ মাইগ্রেট করুন
অ্যাপ ইঞ্জিনের সর্বশেষ রানটাইম ও ফিচারগুলো ব্যবহার করার জন্য, আমরা আপনাকে পাইথন ৩-এ মাইগ্রেট করার পরামর্শ দিচ্ছি। আমাদের স্যাম্পল অ্যাপে, ডেটাস্টোরই ছিল একমাত্র বিল্ট-ইন সার্ভিস যা আমরা ব্যবহার করতাম, এবং যেহেতু আমরা ndb থেকে ক্লাউড এনডিবি-তে মাইগ্রেট করেছি, তাই এখন আমরা অ্যাপ ইঞ্জিনের পাইথন ৩ রানটাইমে পোর্ট করতে পারি।
সংক্ষিপ্ত বিবরণ
যদিও পাইথন ৩-এ পোর্ট করা গুগল ক্লাউড টিউটোরিয়ালের আওতার বাইরে, কোডল্যাবের এই অংশটি ডেভেলপারদের একটি ধারণা দেয় যে পাইথন ৩ অ্যাপ ইঞ্জিন রানটাইমটি কীভাবে আলাদা। এই নেক্সট-জেন রানটাইমের একটি অসাধারণ বৈশিষ্ট্য হলো থার্ড-পার্টি প্যাকেজগুলোতে সহজ অ্যাক্সেস; app.yaml এ বিল্ট-ইন প্যাকেজগুলো উল্লেখ করার প্রয়োজন নেই, কিংবা নন -বিল্ট-ইন লাইব্রেরি কপি বা আপলোড করারও কোনো বাধ্যবাধকতা নেই; requirements.txt এ তালিকাভুক্ত থাকার কারণে এগুলো স্বয়ংক্রিয়ভাবে ইনস্টল হয়ে যায়।
যেহেতু আমাদের নমুনাটি খুবই সাধারণ এবং ক্লাউড এনডিবি পাইথন ২-৩ এর সাথে সামঞ্জস্যপূর্ণ, তাই কোনো অ্যাপ্লিকেশন কোডকে ৩.x সংস্করণে স্পষ্টভাবে পোর্ট করার প্রয়োজন নেই; অ্যাপটি ২.x এবং ৩.x উভয় সংস্করণেই অপরিবর্তিতভাবে চলে, যার অর্থ এই ক্ষেত্রে শুধুমাত্র কনফিগারেশনেই পরিবর্তন আনতে হবে:
- পাইথন ৩-এর রেফারেন্স যুক্ত করতে এবং থার্ড-পার্টি লাইব্রেরিগুলো সরাতে
app.yamlসরল করুন। -
appengine_config.pyএবংlibফোল্ডারটি মুছে ফেলুন, কারণ এগুলোর আর প্রয়োজন নেই।
main.py ছাড়াও requirements.txt এবং templates/index.html ফাইলগুলো অপরিবর্তিত থাকে।
app.yaml সরল করুন
পূর্বে:
এই স্যাম্পল অ্যাপটির জন্য একমাত্র আসল পরিবর্তন হলো app.yaml উল্লেখযোগ্যভাবে ছোট করা। মনে করিয়ে দেওয়ার জন্য, মডিউল ২-এর শেষে app.yaml এ যা ছিল তা নিচে দেওয়া হলো:
runtime: python27
threadsafe: yes
api_version: 1
handlers:
- url: /.*
script: main.app
libraries:
- name: grpcio
version: 1.0.0
- name: setuptools
version: 36.6.0
পরে:
পাইথন ৩-এ, threadsafe , api_version , এবং libraries ডিরেক্টিভগুলো সবই ডেপ্রিকেটেড; সমস্ত অ্যাপকে থ্রেডসেফ হিসেবে ধরে নেওয়া হয় এবং পাইথন ৩-এ api_version ব্যবহৃত হয় না। অ্যাপ ইঞ্জিন সার্ভিসগুলোতে এখন আর কোনো বিল্ট-ইন থার্ড-পার্টি প্যাকেজ আগে থেকে ইনস্টল করা থাকে না, তাই libraries ও ডেপ্রিকেটেড। এই পরিবর্তনগুলো সম্পর্কে আরও তথ্যের জন্য app.yaml এর পরিবর্তন সংক্রান্ত ডকুমেন্টেশন দেখুন। ফলস্বরূপ, আপনার app.yaml থেকে এই তিনটিই মুছে ফেলা উচিত এবং একটি সমর্থিত পাইথন ৩ সংস্করণে আপডেট করা উচিত (নিচে দেখুন)।
ঐচ্ছিক: handlers নির্দেশিকার ব্যবহার
এছাড়াও, handlers ডিরেক্টিভ, যা অ্যাপ ইঞ্জিন অ্যাপ্লিকেশনগুলিতে ট্র্যাফিক নির্দেশ করে, সেটিও বাতিল করা হয়েছে। যেহেতু নেক্সট-জেন রানটাইম অ্যাপ রাউটিং পরিচালনার জন্য ওয়েব ফ্রেমওয়ার্কের উপর নির্ভর করে, তাই সমস্ত "হ্যান্ডলার স্ক্রিপ্ট" অবশ্যই " auto "-তে পরিবর্তন করতে হবে। উপরের পরিবর্তনগুলি একত্রিত করলে, আপনি এই app.yaml পাবেন:
runtime: python38
handlers:
- url: /.*
script: auto
script: auto সম্পর্কে আরও জানতে এর ডকুমেন্টেশন পেজ দেখুন।
handlers নির্দেশিকা অপসারণ
যেহেতু handlers এখন আর ব্যবহৃত হয় না, আপনি পুরো অংশটিই মুছে ফেলতে পারেন, সেক্ষেত্রে app.yaml শুধু একটি লাইন থাকবে:
runtime: python38
ডিফল্টরূপে, এটি Gunicorn WSGI ওয়েব সার্ভার চালু করবে যা সকল অ্যাপ্লিকেশনের জন্য উপলব্ধ। আপনি যদি gunicorn সাথে পরিচিত হন, তবে বেয়ারবোনস app.yaml সাথে ডিফল্টরূপে এটি চালু করার সময় এই কমান্ডটিই এক্সিকিউট করা হয়:
gunicorn main:app --workers 2 -c /config/gunicorn.py
ঐচ্ছিক: entrypoint ডিরেক্টিভের ব্যবহার
তবে, যদি আপনার অ্যাপ্লিকেশনের জন্য একটি নির্দিষ্ট স্টার্ট-আপ কমান্ডের প্রয়োজন হয়, তাহলে সেটি একটি entrypoint ডিরেক্টিভের মাধ্যমে নির্দিষ্ট করা যেতে পারে, যেখানে আপনার app.yaml দেখতে এইরকম হবে:
runtime: python38
entrypoint: python main.py
এই উদাহরণটিতে বিশেষভাবে gunicorn এর পরিবর্তে Flask ডেভেলপমেন্ট সার্ভার ব্যবহার করার অনুরোধ করা হয়েছে। আপনার অ্যাপকে 0.0.0.0 ইন্টারফেসে 8080 পোর্টে চালু করার জন্য, main.py শেষে এই ছোট অংশটি যোগ করে ডেভেলপমেন্ট সার্ভার চালু করার কোডও যোগ করতে হবে:
if __name__ == '__main__':
app.run(host='0.0.0.0', port=8080, debug=True)
entrypoint সম্পর্কে আরও জানতে এর ডকুমেন্টেশন পেজ দেখুন। আরও উদাহরণ এবং সেরা অনুশীলনসমূহ অ্যাপ ইঞ্জিন স্ট্যান্ডার্ড স্টার্টআপ ডক্স এবং অ্যাপ ইঞ্জিন ফ্লেক্সিবল স্টার্টআপ ডক্স- এ পাওয়া যাবে।
appengine_config.py এবং lib মুছে ফেলুন
appengine_config.py ফাইল এবং lib ফোল্ডারটি মুছে ফেলুন। পাইথন ৩-এ স্থানান্তরের সময়, অ্যাপ ইঞ্জিন requirements.txt এ তালিকাভুক্ত প্যাকেজগুলি সংগ্রহ ও ইনস্টল করে।
appengine_config.py কনফিগারেশন ফাইলটি থার্ড-পার্টি লাইব্রেরি/প্যাকেজ শনাক্ত করতে ব্যবহৃত হয়, আপনি সেগুলো নিজে কপি করুন বা অ্যাপ ইঞ্জিন সার্ভারে আগে থেকেই উপলব্ধ (বিল্ট-ইন) লাইব্রেরি/প্যাকেজ ব্যবহার করুন। পাইথন ৩-এ স্থানান্তরের সময় বড় পরিবর্তনগুলোর সারসংক্ষেপ হলো:
- কপি করা থার্ড-পার্টি লাইব্রেরিগুলোর (
requirements.txtএ তালিকাভুক্ত) কোনো বান্ডলিং করা যাবে না। -
libফোল্ডারেpip installযাবে না, অর্থাৎlibফোল্ডারই থাকবে না। -
app.yamlএ কোনো বিল্ট-ইন থার্ড-পার্টি লাইব্রেরি তালিকাভুক্ত করা নেই। - অ্যাপটিকে থার্ড-পার্টি লাইব্রেরির সাথে রেফারেন্স করার প্রয়োজন নেই, তাই কোনো
appengine_config.pyফাইল নেই।
requirements.txt ফাইলে সমস্ত প্রয়োজনীয় থার্ড-পার্টি লাইব্রেরির তালিকা দিলেই চলবে।
অ্যাপ্লিকেশন স্থাপন করুন
আপনার অ্যাপটি পুনরায় ডিপ্লয় করে নিশ্চিত করুন যে এটি কাজ করছে। আপনার সমাধানটি মডিউল ২-এর নমুনা পাইথন ৩ কোডের কতটা কাছাকাছি, তাও আপনি যাচাই করতে পারেন। পাইথন ২-এর সাথে পার্থক্যগুলো দেখার জন্য, কোডটিকে এর পাইথন ২ সংস্করণের সাথে তুলনা করুন।
মডিউল ২-এর বোনাস ধাপটি সফলভাবে সম্পন্ন করার জন্য অভিনন্দন! পাইথন ৩ রানটাইমের জন্য কনফিগারেশন ফাইল প্রস্তুত করার বিষয়ে ডকুমেন্টেশন দেখুন। সবশেষে, পরবর্তী পদক্ষেপ এবং পরিষ্করণ সম্পর্কে জানতে (পূর্ববর্তী) সারাংশ/পরিষ্কারকরণ পৃষ্ঠাটি পর্যালোচনা করুন।
আপনার আবেদনপত্র প্রস্তুত করা
যখন আপনার অ্যাপ্লিকেশনটি মাইগ্রেট করার সময় আসবে, তখন আপনাকে আপনার main.py এবং অন্যান্য অ্যাপ্লিকেশন ফাইলগুলো 3.x-এ পোর্ট করতে হবে, তাই একটি উত্তম অনুশীলন হলো আপনার 2.x অ্যাপ্লিকেশনটিকে যতটা সম্ভব "ফরওয়ার্ড-কম্প্যাটিবল" করে তোলার জন্য যথাসাধ্য চেষ্টা করা।
এই কাজটি সম্পন্ন করার জন্য অনলাইনে প্রচুর রিসোর্স রয়েছে, তবে কয়েকটি গুরুত্বপূর্ণ টিপস হলো:
- নিশ্চিত করুন যে অ্যাপ্লিকেশনের সমস্ত নির্ভরতা সম্পূর্ণরূপে 3.x-এর সাথে সামঞ্জস্যপূর্ণ।
- আপনার অ্যাপ্লিকেশনটি যেন অন্তত ২.৬ (বিশেষত ২.৭) সংস্করণে চলে, তা নিশ্চিত করুন।
- অ্যাপ্লিকেশনটি যেন সম্পূর্ণ টেস্ট স্যুট পাস করে (এবং ন্যূনতম ৮০% কভারেজ নিশ্চিত করে)
-
six, Future, এবং/অথবা Modernize-এর মতো কম্প্যাটিবিলিটি লাইব্রেরি ব্যবহার করুন। - 2.x এবং 3.x এর মধ্যে পশ্চাৎমুখী অসামঞ্জস্যপূর্ণ মূল পার্থক্যগুলো সম্পর্কে জেনে নিন।
- যেকোনো ইনপুট/আউটপুটের ফলে সম্ভবত ইউনিকোড এবং বাইট স্ট্রিংয়ের মধ্যে অসামঞ্জস্য দেখা দেবে।
এই সবকিছু মাথায় রেখেই স্যাম্পল অ্যাপটি ডিজাইন করা হয়েছে, আর একারণেই অ্যাপটি 2.x এবং 3.x ভার্সনে কোনো পরিবর্তন ছাড়াই চলে, যাতে আমরা আপনাকে দেখাতে পারি যে নেক্সট-জেন প্ল্যাটফর্মটি ব্যবহার করার জন্য কী কী পরিবর্তন করতে হবে।
৮. অতিরিক্ত সম্পদ
অ্যাপ ইঞ্জিন মাইগ্রেশন মডিউল কোডল্যাবস সমস্যা/মতামত
এই কোডল্যাবে কোনো সমস্যা পেলে, অভিযোগ জানানোর আগে অনুগ্রহ করে সমস্যাটি অনুসন্ধান করুন। নতুন সমস্যা অনুসন্ধান ও তৈরি করার লিঙ্ক:
অভিবাসন সম্পদ
মডিউল ১ (শুরু) এবং মডিউল ২ (শেষ)-এর রিপো ফোল্ডারগুলোর লিঙ্ক নিচের টেবিলে দেওয়া আছে। এছাড়াও, সমস্ত অ্যাপ ইঞ্জিন কোডল্যাব মাইগ্রেশনের রিপো থেকেও এগুলো অ্যাক্সেস করা যাবে, যা আপনি ক্লোন করতে পারেন অথবা একটি জিপ ফাইল হিসেবে ডাউনলোড করতে পারেন।
কোডল্যাব | পাইথন ২ | পাইথন ৩ |
(প্রযোজ্য নয়) | ||
মডিউল ২ |
অ্যাপ ইঞ্জিন রিসোর্স
এই নির্দিষ্ট মাইগ্রেশন সম্পর্কিত অতিরিক্ত তথ্যসূত্র নিচে দেওয়া হলো:
- পাইথন এনডিবি রেফারেন্স
- (পুরাতন) পাইথন ২.৫ এবং
webappথেকে ২.৭ এবংwebapp2এ স্থানান্তর - পাইথন ৩ এবং জিএই পরবর্তী প্রজন্মের রানটাইমে স্থানান্তর
- সাধারণ