অ্যাপ ইঞ্জিন টাস্ক কিউ টাস্ক থেকে ক্লাউড পাব/সাব-এ স্থানান্তর করুন (মডিউল 19)

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

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

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

মডিউল ১৮-এ, আপনি আপনার অ্যাপে পুল টাস্কের ব্যবহার কীভাবে যুক্ত করবেন তা শিখবেন। এই মডিউলে, আপনি মডিউল ১৮-এর সম্পূর্ণ অ্যাপটি নেবেন এবং এর ব্যবহার ক্লাউড পাব/সাব-এ স্থানান্তর করবেন। যারা পুশ টাস্কের জন্য টাস্ক কিউ ব্যবহার করেন, তারা এর পরিবর্তে ক্লাউড টাস্ক-এ স্থানান্তর করবেন এবং তাদের মডিউল ৭-৯ দেখতে হবে।

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

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

জরিপ

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

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

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

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

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

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

২. পটভূমি

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

মাইগ্রেশন মডিউল ৭-৯ পুশ টাস্ক মাইগ্রেশন নিয়ে আলোচনা করে, অন্যদিকে মডিউল ১৮-১৯ পুল টাস্ক মাইগ্রেশনের উপর আলোকপাত করে। যদিও ক্লাউড টাস্ক, টাস্ক কিউ-এর পুশ টাস্কগুলোর সাথে বেশি সাদৃশ্যপূর্ণ, পাব/সাব টাস্ক কিউ-এর পুল টাস্কগুলোর ততটা ঘনিষ্ঠ প্রতিরূপ নয়।

টাস্ক কিউ দ্বারা প্রদত্ত পুল কার্যকারিতার চেয়ে পাব/সাব-এর আরও বেশি বৈশিষ্ট্য রয়েছে। উদাহরণস্বরূপ, পাব/সাব-এর পুশ কার্যকারিতাও রয়েছে, তবে ক্লাউড টাস্কগুলো টাস্ক কিউ-এর পুশ টাস্কের মতোই, তাই পাব/সাব পুশ কোনো মাইগ্রেশন মডিউলের আওতায় পড়ে না । এই মডিউল ১৯ কোডল্যাবটি মডিউল ২-এর মাইগ্রেশনের পুনরাবৃত্তি করে টাস্ক কিউ পুল কিউ থেকে পাব/সাব-এ কিউইং মেকানিজম পরিবর্তন করা এবং ডেটাস্টোর অ্যাক্সেসের জন্য অ্যাপ ইঞ্জিন এনডিবি থেকে ক্লাউড এনডিবি-তে মাইগ্রেট করা প্রদর্শন করে।

যদিও মডিউল ১৮-এর কোডটিকে একটি পাইথন ২ স্যাম্পল অ্যাপ হিসেবে 'বিজ্ঞাপন' করা হয়, এর সোর্স কোডটি পাইথন ২ এবং ৩ উভয়ের সাথেই সামঞ্জস্যপূর্ণ, এবং মডিউল ১৯-এ ক্লাউড পাব/সাব (এবং ক্লাউড এনডিবি)-তে স্থানান্তরিত হওয়ার পরেও এটি সেভাবেই থাকে।

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  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. অ্যাপটি কোনো সমস্যা ছাড়াই প্রত্যাশিতভাবে চলছে কিনা তা নিশ্চিত করুন। আপনি যদি মডিউল ১৮ কোডল্যাবটি সম্পন্ন করে থাকেন, তাহলে অ্যাপটি শীর্ষ পরিদর্শকদের সাথে সাম্প্রতিকতম পরিদর্শনগুলোও প্রদর্শন করবে (নিচে চিত্রিত)। অন্যথায়, প্রদর্শনের জন্য কোনো পরিদর্শক সংখ্যা নাও থাকতে পারে।

b667551dcbab1a09.png

মডিউল ১৮ নমুনা অ্যাপটি মাইগ্রেট করার আগে, আপনাকে অবশ্যই সেই ক্লাউড পরিষেবাগুলি সক্রিয় করতে হবে যা পরিবর্তিত অ্যাপটি ব্যবহার করবে।

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

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

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

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

c7a740304e9d35b.png

প্রতিটি API-এর জন্য আলাদাভাবে Enable বোতামে ক্লিক করুন—আপনাকে বিলিং তথ্য দিতে বলা হতে পারে। উদাহরণস্বরূপ, এটি হলো ক্লাউড পাব/সাব এপিআই লাইব্রেরি পেজ:

1b6c0a2a73124f6b.jpeg

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

কনসোল থেকে এপিআই (API) চালু করা দৃশ্যত তথ্যপূর্ণ হলেও, অনেকে কমান্ড-লাইন পছন্দ করেন। একই সাথে উভয় এপিআই চালু করতে gcloud services enable pubsub.googleapis.com datastore.googleapis.com কমান্ডটি দিন:

$ gcloud services enable pubsub.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 লক্ষ্য করুন।

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

৪. পাব/সাব রিসোর্স তৈরি করুন

মডিউল ১৮ থেকে টাস্ক কিউ ওয়ার্কফ্লো-এর ক্রমিক বিন্যাসের পুনরালোচনা:

  1. মডিউল ১৮ ` queue.yaml ফাইলটি ব্যবহার করে pullq নামের একটি পুল কিউ তৈরি করেছে।
  2. অ্যাপটি ভিজিটরদের ট্র্যাক করার জন্য পুল কিউতে টাস্ক যোগ করে।
  3. অবশেষে কাজগুলো একজন কর্মী দ্বারা সম্পন্ন করা হয়, যাকে একটি নির্দিষ্ট সময়ের (এক ঘণ্টা) জন্য ভাড়া করা হয়।
  4. সাম্প্রতিক পরিদর্শকের সংখ্যা গণনা করার জন্য কাজগুলো সম্পাদন করা হয়।
  5. কাজগুলো সম্পন্ন হলে কিউ থেকে মুছে ফেলা হয়।

আপনি পাব/সাব (Pub/Sub) ব্যবহার করে একটি অনুরূপ কর্মপ্রবাহ অনুসরণ করবেন। পরবর্তী বিভাগে পাব/সাব-এর প্রাথমিক পরিভাষা এবং প্রয়োজনীয় পাব/সাব রিসোর্স তৈরির তিনটি ভিন্ন উপায় তুলে ধরা হয়েছে।

অ্যাপ ইঞ্জিন টাস্ক কিউ (পুল) বনাম ক্লাউড পাব/সাব পরিভাষা

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

  • ডেটা কিউইং কাঠামো: টাস্ক কিউ-এর ক্ষেত্রে, ডেটা পুল কিউ- তে যায়; পাব/সাব-এর ক্ষেত্রে, ডেটা টপিক- এ যায়।
  • সারিবদ্ধ ডেটার একক: টাস্ক কিউ (Task Queue) ব্যবহার করে পুল টাস্কগুলোকে পাব/সাব (Pub/Sub) পদ্ধতিতে মেসেজ বলা হয়।
  • ডেটা প্রসেসর: টাস্ক কিউ-এর মাধ্যমে ওয়ার্কাররা পুল টাস্ক অ্যাক্সেস করতে পারে; পাব/সাব-এর ক্ষেত্রে মেসেজ পাওয়ার জন্য সাবস্ক্রিপশন/সাবস্ক্রাইবার প্রয়োজন হয়।
  • ডেটা নিষ্কাশন: একটি পুল টাস্ক লিজ নেওয়া আর (সাবস্ক্রিপশনের মাধ্যমে) কোনো টপিক থেকে মেসেজ পুল করা একই জিনিস।
  • পরিষ্করণ/সম্পূর্ণকরণ: কাজ শেষ হয়ে গেলে পুল কিউ থেকে একটি টাস্ক কিউ টাস্ক মুছে ফেলা, একটি পাব/সাব বার্তা স্বীকার করার অনুরূপ।

যদিও কিউইং প্রোডাক্ট পরিবর্তিত হয়, ওয়ার্কফ্লো তুলনামূলকভাবে একই থাকে:

  1. পুল কিউ-এর পরিবর্তে, অ্যাপটি pullq নামের একটি টপিক ব্যবহার করে।
  2. পুল কিউতে টাস্ক যোগ করার পরিবর্তে, অ্যাপটি একটি টপিকে ( pullq ) মেসেজ পাঠায়।
  3. কোনো ওয়ার্কার পুল কিউ থেকে টাস্ক লিজ নেওয়ার পরিবর্তে, worker নামের একজন সাবস্ক্রাইবার ` pullq টপিক থেকে মেসেজ পুল করে
  4. অ্যাপটি মেসেজ পেলোড প্রসেস করে ডেটাস্টোরে ভিজিটর সংখ্যা বৃদ্ধি করে।
  5. পুল কিউ থেকে টাস্ক মুছে ফেলার পরিবর্তে, অ্যাপটি প্রক্রিয়াকৃত বার্তাগুলো প্রাপ্তিস্বীকার করে

টাস্ক কিউ-এর ক্ষেত্রে, সেটআপের জন্য পুল কিউ তৈরি করতে হয়। পাব/সাব-এর ক্ষেত্রে, সেটআপ করার জন্য একটি টপিক এবং একটি সাবস্ক্রিপশন উভয়ই তৈরি করতে হয়। মডিউল ১৮-তে, আমরা অ্যাপ এক্সিকিউশনের বাইরে queue.yaml প্রসেস করেছিলাম; এখন পাব/সাব-এর ক্ষেত্রেও একই কাজ করতে হবে।

টপিক এবং সাবস্ক্রিপশন তৈরি করার জন্য তিনটি বিকল্প রয়েছে:

  1. ক্লাউড কনসোল থেকে
  2. কমান্ড-লাইন থেকে, অথবা
  3. কোড থেকে (সংক্ষিপ্ত পাইথন স্ক্রিপ্ট)

নিচের বিকল্পগুলো থেকে যেকোনো একটি বেছে নিন এবং আপনার পাব/সাব রিসোর্স তৈরি করতে সংশ্লিষ্ট নির্দেশাবলী অনুসরণ করুন।

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

ক্লাউড কনসোল থেকে একটি টপিক তৈরি করতে, এই ধাপগুলো অনুসরণ করুন:

  1. ক্লাউড কনসোলের পাব/সাব টপিকস পৃষ্ঠায় যান।
  2. উপরে থাকা 'Create topic'- এ ক্লিক করুন; একটি নতুন ডায়ালগ উইন্ডো খুলবে (নিচের ছবিটি দেখুন)।
  3. টপিক আইডি ফিল্ডে pullq লিখুন।
  4. টিক চিহ্ন দেওয়া সমস্ত অপশন তুলে দিন এবং গুগল-পরিচালিত এনক্রিপশন কী নির্বাচন করুন।
  5. Create topic বাটনটিতে ক্লিক করুন।

টপিক তৈরির ডায়ালগ বক্সটি দেখতে এইরকম:

a05cfdbf64571ceb.png

এখন যেহেতু আপনার একটি টপিক আছে, সেই টপিকের জন্য একটি সাবস্ক্রিপশন তৈরি করতে হবে:

  1. ক্লাউড কনসোলের পাব/সাব সাবস্ক্রিপশন পৃষ্ঠায় যান।
  2. উপরে থাকা 'সাবস্ক্রিপশন তৈরি করুন' বাটনে ক্লিক করুন (নিচের ছবিটি দেখুন)।
  3. সাবস্ক্রিপশন আইডি ফিল্ডে worker নাম লিখুন।
  4. "Select a Cloud Pub/Sub topic" পুলডাউন থেকে pullq নির্বাচন করুন এবং এর "fully-qualified pathname" লক্ষ্য করুন, যেমন, projects/PROJECT_ID/topics/pullq
  5. ডেলিভারি প্রকারের জন্য, পুল নির্বাচন করুন।
  6. অন্যান্য সমস্ত বিকল্প অপরিবর্তিত রেখে Create বোতামে ক্লিক করুন।

সাবস্ক্রিপশন তৈরির স্ক্রিনটি দেখতে এইরকম:

c5444375c20b0618.jpeg

আপনি টপিকস পেজ থেকেও একটি সাবস্ক্রিপশন তৈরি করতে পারেন —টপিকগুলোর সাথে সাবস্ক্রিপশন যুক্ত করতে এই 'শর্টকাট'টি আপনার কাজে আসতে পারে। সাবস্ক্রিপশন তৈরি করার বিষয়ে আরও জানতে, ডকুমেন্টেশন দেখুন।

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

Pub/Sub ব্যবহারকারীরা যথাক্রমে gcloud pubsub topics create TOPIC_ID এবং gcloud pubsub subscriptions create SUBSCRIPTION_ID --topic= TOPIC_ID কমান্ড ব্যবহার করে টপিক এবং সাবস্ক্রিপশন তৈরি করতে পারেন। pullq TOPIC_ID এবং worker SUBSCRIPTION_ID দিয়ে এগুলো এক্সিকিউট করলে PROJECT_ID প্রোজেক্টের জন্য নিম্নলিখিত আউটপুট পাওয়া যায়:

$ gcloud pubsub topics create pullq
Created topic [projects/PROJECT_ID/topics/pullq].

$ gcloud pubsub subscriptions create worker --topic=pullq
Created subscription [projects/PROJECT_ID/subscriptions/worker].

কুইকস্টার্ট ডকুমেন্টেশনের এই পৃষ্ঠাটিও দেখুন। যেসব ওয়ার্কফ্লোতে নিয়মিতভাবে টপিক এবং সাবস্ক্রিপশন তৈরি করা হয়, সেখানে কমান্ড-লাইন ব্যবহার করলে কাজ সহজ হতে পারে এবং এই উদ্দেশ্যে শেল স্ক্রিপ্টে এই ধরনের কমান্ড ব্যবহার করা যেতে পারে।

কোড থেকে (সংক্ষিপ্ত পাইথন স্ক্রিপ্ট)

টপিক এবং সাবস্ক্রিপশন তৈরি স্বয়ংক্রিয় করার আরেকটি উপায় হলো সোর্স কোডে পাব/সাব এপিআই (Pub/Sub API) ব্যবহার করা। নিচে মডিউল ১৯ রিপো ফোল্ডারের maker.py স্ক্রিপ্টটির কোড দেওয়া হলো।

from __future__ import print_function
import google.auth
from google.api_core import exceptions
from google.cloud import pubsub

_, PROJECT_ID = google.auth.default()
TOPIC = 'pullq'
SBSCR = 'worker'
ppc_client = pubsub.PublisherClient()
psc_client = pubsub.SubscriberClient()
TOP_PATH = ppc_client.topic_path(PROJECT_ID, TOPIC)
SUB_PATH = psc_client.subscription_path(PROJECT_ID, SBSCR)

def make_top():
    try:
        top = ppc_client.create_topic(name=TOP_PATH)
        print('Created topic %r (%s)' % (TOPIC, top.name))
    except exceptions.AlreadyExists:
        print('Topic %r already exists at %r' % (TOPIC, TOP_PATH))

def make_sub():
    try:
        sub = psc_client.create_subscription(name=SUB_PATH, topic=TOP_PATH)
        print('Subscription created %r (%s)' % (SBSCR, sub.name))
    except exceptions.AlreadyExists:
        print('Subscription %r already exists at %r' % (SBSCR, SUB_PATH))
    try:
        psc_client.close()
    except AttributeError:  # special Py2 handler for grpcio<1.12.0
        pass

make_top()
make_sub()

এই স্ক্রিপ্টটি চালালে প্রত্যাশিত আউটপুট পাওয়া যায় (যদি কোনো ত্রুটি না থাকে):

$ python3 maker.py
Created topic 'pullq' (projects/PROJECT_ID/topics/pullq)
Subscription created 'worker' (projects/PROJECT_ID/subscriptions/worker)

ইতিমধ্যে বিদ্যমান রিসোর্স তৈরি করার জন্য এপিআই কল করলে ক্লায়েন্ট লাইব্রেরি থেকে একটি google.api_core.exceptions.AlreadyExists এক্সেপশন থ্রো হয়, যা স্ক্রিপ্টটি সুন্দরভাবে হ্যান্ডেল করে:

$ python3 maker.py
Topic 'pullq' already exists at 'projects/PROJECT_ID/topics/pullq'
Subscription 'worker' already exists at 'projects/PROJECT_ID/subscriptions/worker'

আপনি যদি Pub/Sub-এ নতুন হন, তাহলে আরও বিশদ তথ্যের জন্য Pub/Sub আর্কিটেকচার হোয়াইট পেপারটি দেখুন।

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

কনফিগারেশন আপডেটের মধ্যে বিভিন্ন কনফিগারেশন ফাইল পরিবর্তন করার পাশাপাশি ক্লাউড পাব/সাব ইকোসিস্টেমের মধ্যে অ্যাপ ইঞ্জিন পুল কিউ-এর সমতুল্য ব্যবস্থা তৈরি করাও অন্তর্ভুক্ত।

queue.yaml মুছে ফেলুন

আমরা টাস্ক কিউ (Task Queue) পুরোপুরি ব্যবহার করা বন্ধ করে দিচ্ছি, তাই queue.yaml ডিলিট করে দিন, কারণ পাব/সাব (Pub/Sub) এই ফাইলটি ব্যবহার করে না। পুল কিউ (pull queue) তৈরি করার পরিবর্তে, আপনাকে একটি পাব/সাব টপিক (এবং সাবস্ক্রিপশন ) তৈরি করতে হবে।

requirements.txt

মডিউল ১৮ থেকে flask যুক্ত করার জন্য requirements.txt ফাইলে google-cloud-ndb এবং google-cloud-pubsub উভয়ই যুক্ত করুন। আপনার আপডেট করা মডিউল ১৯-এর requirements.txt এখন দেখতে এইরকম হবে:

flask
google-cloud-ndb
google-cloud-pubsub

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

app.yaml

আপনি পাইথন ২ ব্যবহার করছেন নাকি পাইথন ৩-এ আপগ্রেড করছেন, তার উপর নির্ভর করে app.yaml এর পরিবর্তনগুলো ভিন্ন হবে।

পাইথন ২

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

পূর্বে:

runtime: python27
threadsafe: yes
api_version: 1

handlers:
- url: /.*
  script: main.app

app.yaml এ একটি libraries সেকশন যোগ করুন এবং setuptoolsgrpcio উভয়ের জন্য তাদের সর্বশেষ সংস্করণ নির্বাচন করে এন্ট্রি দিন। এছাড়াও, Python 3-এর জন্য একটি প্লেসহোল্ডার runtime এন্ট্রি যোগ করুন, যা কমেন্ট করা থাকবে এবং এর সাথে একটি বর্তমান 3.x রিলিজ, যেমন এই লেখাটির সময়ে 3.10, উল্লেখ করুন। এই পরিবর্তনগুলোর পর, app.yaml এখন দেখতে এইরকম হবে:

পরে:

#runtime: python310
runtime: python27
threadsafe: yes
api_version: 1

handlers:
- url: /.*
  script: main.app

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

পাইথন ৩

পাইথন ৩ ব্যবহারকারী এবং app.yaml জন্য, মূল বিষয়টি হলো অপ্রয়োজনীয় জিনিস মুছে ফেলা। এই অংশে, আপনি handlers সেকশন, threadsafe এবং api_version ডিরেক্টিভগুলো ডিলিট করবেন এবং কোনো libraries সেকশন তৈরি করবেন না।

দ্বিতীয় প্রজন্মের রানটাইমগুলো বিল্ট-ইন থার্ড-পার্টি লাইব্রেরি সরবরাহ করে না, তাই app.yaml এ একটি libraries সেকশনের প্রয়োজন হয় না । এছাড়াও, নন -বিল্ট-ইন থার্ড-পার্টি প্যাকেজ কপি করার (যা কখনও কখনও ভেন্ডরিং বা সেলফ-বান্ডলিং নামে পরিচিত) আর প্রয়োজন নেই। আপনার অ্যাপ যে থার্ড-পার্টি লাইব্রেরিগুলো ব্যবহার করে, শুধু requirements.txt এ সেগুলোর তালিকা দিলেই চলবে।

app.yaml এর handlers সেকশনটি অ্যাপ্লিকেশন (স্ক্রিপ্ট) এবং স্ট্যাটিক ফাইল হ্যান্ডলার নির্দিষ্ট করার জন্য ব্যবহৃত হয়। যেহেতু পাইথন ৩ রানটাইমের জন্য ওয়েব ফ্রেমওয়ার্কগুলোকে তাদের নিজস্ব রাউটিং করতে হয়, তাই সমস্ত স্ক্রিপ্ট হ্যান্ডলারকে অবশ্যই auto তে পরিবর্তন করতে হবে। যদি আপনার অ্যাপ (মডিউল ১৮-এর মতো) স্ট্যাটিক ফাইল সার্ভ না করে, তাহলে সমস্ত রাউট auto হয়ে যাবে, যা সেগুলোকে অপ্রাসঙ্গিক করে তুলবে। ফলস্বরূপ, handlers সেকশনটিরও আর প্রয়োজন হবে না, তাই সেটি মুছে ফেলুন।

অবশেষে, পাইথন ৩-এ threadsafe বা api_version ডিরেক্টিভ কোনোটিই ব্যবহৃত হয় না, তাই সেগুলোও মুছে ফেলুন। মূল কথা হলো, আপনার app.yaml এর সমস্ত অংশ মুছে ফেলা উচিত, যাতে শুধুমাত্র runtime ডিরেক্টিভটি অবশিষ্ট থাকে, যা পাইথন ৩-এর একটি আধুনিক সংস্করণ, যেমন ৩.১০, নির্দিষ্ট করে। এই আপডেটগুলোর আগে ও পরে app.yaml দেখতে কেমন তা নিচে দেওয়া হলো:

পূর্বে:

runtime: python27
threadsafe: yes
api_version: 1

handlers:
- url: /.*
  script: main.app

পরে:

runtime: python310

যারা পাইথন ৩-এর জন্য তাদের app.yaml থেকে সবকিছু মুছে ফেলতে প্রস্তুত নন, তাদের জন্য আমরা মডিউল ১৯ রিপো ফোল্ডারে app3.yaml একটি বিকল্প ফাইল দিয়েছি। আপনি যদি ডেপ্লয়মেন্টের জন্য এর পরিবর্তে এটি ব্যবহার করতে চান, তাহলে আপনার কমান্ডের শেষে এই ফাইলের নামটি যোগ করতে ভুলবেন না: gcloud app deploy app3.yaml (অন্যথায়, এটি ডিফল্টভাবে আপনার অপরিবর্তিত রাখা পাইথন ২-এর app.yaml ফাইলটি ব্যবহার করে অ্যাপটি ডেপ্লয় করবে)।

appengine_config.py

আপনি যদি পাইথন ৩-এ আপগ্রেড করেন, তাহলে appengine_config.py এর কোনো প্রয়োজন নেই, তাই এটি মুছে ফেলুন। এর কারণ হলো, থার্ড-পার্টি লাইব্রেরি সাপোর্টের জন্য শুধু requirements.txt এ সেগুলোর উল্লেখ করলেই চলে। পাইথন ২ ব্যবহারকারীরা, পড়তে থাকুন।

মডিউল ১৮-এর appengine_config.py ফাইলে থার্ড-পার্টি লাইব্রেরি , যেমন – Flask এবং requirements.txt এ সদ্য যোগ করা ক্লাউড ক্লায়েন্ট লাইব্রেরিগুলোকে সাপোর্ট করার জন্য উপযুক্ত কোড রয়েছে।

পূর্বে:

from google.appengine.ext import vendor

# Set PATH to your libraries folder.
PATH = 'lib'
# Add libraries installed in the PATH folder.
vendor.add(PATH)

তবে, সদ্য যুক্ত হওয়া বিল্ট-ইন লাইব্রেরিগুলো ( setuptools , grpcio ) সাপোর্ট করার জন্য শুধু এই কোডটিই যথেষ্ট নয়। আরও কয়েকটি লাইন প্রয়োজন, তাই 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)

ক্লাউড ক্লায়েন্ট লাইব্রেরি সমর্থন করার জন্য প্রয়োজনীয় পরিবর্তনগুলির বিষয়ে আরও বিশদ বিবরণ বান্ডেল পরিষেবা স্থানান্তরের ডকুমেন্টেশনে পাওয়া যাবে।

অন্যান্য কনফিগারেশন আপডেট

আপনার যদি একটি lib ফোল্ডার থাকে, তবে সেটি মুছে ফেলুন। আপনি যদি পাইথন ২ ব্যবহারকারী হন, তবে নিম্নলিখিত কমান্ডটি দিয়ে lib ফোল্ডারটি পুনরায় পূরণ করুন:

pip install -t lib -r requirements.txt  # or pip2

আপনার ডেভেলপমেন্ট সিস্টেমে যদি পাইথন ২ এবং ৩ উভয়ই ইনস্টল করা থাকে, তাহলে আপনাকে pip এর পরিবর্তে pip2 ব্যবহার করতে হতে পারে।

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

এই বিভাগে মূল অ্যাপ্লিকেশন ফাইল, main.py তে কিছু আপডেট আনা হয়েছে, যেখানে App Engine Task Queue পুল কিউ-এর পরিবর্তে Cloud Pub/Sub ব্যবহার করা হয়েছে। ওয়েব টেমপ্লেট, templates/index.html এ কোনো পরিবর্তন নেই। উভয় অ্যাপই একই রকমভাবে কাজ করবে এবং একই ডেটা প্রদর্শন করবে।

আমদানি এবং প্রারম্ভিকীকরণ আপডেট করুন

ইম্পোর্ট এবং ইনিশিয়ালাইজেশনে বেশ কিছু আপডেট আনা হয়েছে:

  1. ইম্পোর্ট করার ক্ষেত্রে, App Engine NDB এবং Task Queue-কে Cloud NDB এবং Pub/Sub দিয়ে প্রতিস্থাপন করুন।
  2. pullq QUEUE নাম থেকে TOPIC নামে পরিবর্তন করুন।
  3. পুল টাস্কের ক্ষেত্রে, কর্মী সেগুলোকে এক ঘণ্টার জন্য লিজ নিত, কিন্তু পাব/সাব-এর ক্ষেত্রে টাইমআউট প্রতি-মেসেজ ভিত্তিতে পরিমাপ করা হয়, তাই HOUR কনস্ট্যান্টটি মুছে ফেলুন।
  4. ক্লাউড এপিআই ব্যবহারের জন্য একটি এপিআই ক্লায়েন্ট প্রয়োজন, তাই ক্লাউড এনডিবি এবং ক্লাউড পাব/সাব-এর জন্য সেগুলো চালু করুন, যার মধ্যে পাব/সাব টপিক এবং সাবস্ক্রিপশন উভয়ের জন্যই ক্লায়েন্ট সরবরাহ করে।
  5. Pub/Sub-এর জন্য ক্লাউড প্রজেক্ট আইডি প্রয়োজন, তাই এটি ইম্পোর্ট করুন এবং google.auth.default() থেকে সংগ্রহ করুন।
  6. Pub/Sub-এর টপিক এবং সাবস্ক্রিপশনের জন্য "সম্পূর্ণ-যোগ্য পাথনেম" প্রয়োজন, তাই *_path() সুবিধাজনক ফাংশন ব্যবহার করে সেগুলো তৈরি করুন।

নিচে মডিউল ১৮ থেকে ইম্পোর্ট এবং ইনিশিয়ালাইজেশন দেওয়া হলো এবং এরপর দেখানো হয়েছে যে উপরের পরিবর্তনগুলো প্রয়োগ করার পর সেকশনগুলো কেমন দেখতে হবে, যেখানে বেশিরভাগ নতুন কোডই হলো বিভিন্ন পাব/সাব রিসোর্স:

পূর্বে:

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

পরে:

from flask import Flask, render_template, request
import google.auth
from google.cloud import ndb, pubsub

LIMIT = 10
TASKS = 1000
TOPIC = 'pullq'
SBSCR = 'worker'

app = Flask(__name__)
ds_client  = ndb.Client()
ppc_client = pubsub.PublisherClient()
psc_client = pubsub.SubscriberClient()
_, PROJECT_ID = google.auth.default()
TOP_PATH = ppc_client.topic_path(PROJECT_ID, TOPIC)
SUB_PATH = psc_client.subscription_path(PROJECT_ID, SBSCR)

ডেটা মডেল আপডেট পরিদর্শন করুন

Visit ডেটা মডেল অপরিবর্তিত থাকে। ডেটাস্টোর অ্যাক্সেসের জন্য ক্লাউড এনডিবি এপিআই ক্লায়েন্ট কনটেক্সট ম্যানেজার, ds_client.context() -এর সুস্পষ্ট ব্যবহার প্রয়োজন। কোডে এর অর্থ হলো, store_visit() এবং fetch_visits() উভয় ডেটাস্টোর কলকে পাইথনের with ব্লকের মধ্যে রাখতে হবে। এই আপডেটটি মডিউল ২-এ আলোচিত বিষয়ের অনুরূপ।

Pub/Sub-এর জন্য সবচেয়ে প্রাসঙ্গিক পরিবর্তনটি হলো, একটি Task Queue pull টাস্ককে এনকিউ করার পরিবর্তে pullq টপিকে একটি Pub/Sub মেসেজ পাবলিশ করা। এই আপডেটগুলো করার আগে ও পরের কোড নিচে দেওয়া হলো:

পূর্বে:

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)

পরে:

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'
    with ds_client.context():
        Visit(visitor='{}: {}'.format(remote_addr, user_agent)).put()
    ppc_client.publish(TOP_PATH, remote_addr.encode('utf-8'))

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

ভিজিটরকাউন্ট ডেটা মডেল আপডেট

VisitorCount ডেটা মডেলটি অপরিবর্তিত থাকে এবং fetch_counts() ব্যবহার করে, শুধুমাত্র এর Datastore কোয়েরিটিকে একটি with ব্লকের মধ্যে রাখা হয়, যেমনটি নিচে দেখানো হয়েছে:

পূর্বে:

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

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

পরে:

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

def fetch_counts(limit):
    'get top visitors'
    with ds_client.context():
        return VisitorCount.query().order(-VisitorCount.counter).fetch(limit)

কর্মী কোড আপডেট করুন

ওয়ার্কার কোডটি NDB-কে Cloud NDB দ্বারা এবং Task Queue-কে Pub/Sub দ্বারা প্রতিস্থাপন করার ক্ষেত্রে আপডেট করা হয়েছে, কিন্তু এর কার্যপ্রবাহ একই রয়েছে।

  1. ক্লাউড এনডিবি কনটেক্সট ম্যানেজারে ডেটাস্টোর কলগুলোকে ব্লক with মুড়ে দিন।
  2. টাস্ক কিউ ক্লিনআপের মধ্যে পুল কিউ থেকে সমস্ত টাস্ক মুছে ফেলা অন্তর্ভুক্ত। পাব/সাব পদ্ধতিতে, 'অ্যাকনলেজমেন্ট আইডি'গুলো acks মধ্যে সংগ্রহ করা হয় এবং শেষে সেগুলো মুছে ফেলা বা অ্যাকনলেজ করা হয়।
  3. টাস্ক কিউ পুল টাস্কগুলো পাব/সাব মেসেজ পুল করার মতোই লিজ দেওয়া হয়। পুল টাস্ক ডিলিট করা হয় সরাসরি টাস্ক অবজেক্টগুলো ব্যবহার করে, কিন্তু পাব/সাব মেসেজ ডিলিট করা হয় তাদের অ্যাকনলেজমেন্ট আইডির মাধ্যমে।
  4. পাব/সাব মেসেজ পেলোডের জন্য বাইট প্রয়োজন হয় (পাইথন স্ট্রিং নয়), তাই কোনো টপিকে মেসেজ পাবলিশ এবং পুল করার সময় যথাক্রমে কিছু UTF-8 এনকোডিং এবং ডিকোডিং করা হয়।

এইমাত্র বর্ণিত পরিবর্তনগুলি বাস্তবায়ন করে নিচের আপডেট করা কোড দিয়ে log_visitors() ফাংশনটি প্রতিস্থাপন করুন:

পূর্বে:

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

পরে:

@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 = {}
    acks = set()
    rsp = psc_client.pull(subscription=SUB_PATH, max_messages=TASKS)
    msgs = rsp.received_messages
    for rcvd_msg in msgs:
        acks.add(rcvd_msg.ack_id)
        visitor = rcvd_msg.message.data.decode('utf-8')
        tallies[visitor] = tallies.get(visitor, 0) + 1
    if acks:
        psc_client.acknowledge(subscription=SUB_PATH, ack_ids=acks)
    try:
        psc_client.close()
    except AttributeError:  # special handler for grpcio<1.12.0
        pass

    # increment those counts in Datastore and return
    if tallies:
        with ds_client.context():
            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(msgs), len(tallies))

মূল অ্যাপ্লিকেশন হ্যান্ডলার root() এ কোনো পরিবর্তন নেই। HTML টেমপ্লেট ফাইল, templates/index.html এও কোনো পরিবর্তনের প্রয়োজন নেই, সুতরাং প্রয়োজনীয় সমস্ত আপডেট এখানেই শেষ। Cloud Pub/Sub ব্যবহার করে আপনার নতুন মডিউল ১৯ অ্যাপ্লিকেশনে পৌঁছানোর জন্য অভিনন্দন!

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

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

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

নিশ্চিত করুন যে আপনি ইতিমধ্যেই pullq টপিক এবং worker সাবস্ক্রিপশন তৈরি করেছেন। যদি তা সম্পন্ন হয়ে থাকে এবং আপনার স্যাম্পল অ্যাপটি ব্যবহারের জন্য প্রস্তুত থাকে, তাহলে gcloud app deploy দিয়ে আপনার অ্যাপটি ডিপ্লয় করুন। আউটপুটটি মডিউল ১৮ অ্যাপের মতোই হওয়া উচিত, তবে পার্থক্য হলো আপনি সফলভাবে সম্পূর্ণ অন্তর্নিহিত কিউইং মেকানিজমটি প্রতিস্থাপন করেছেন।

b667551dcbab1a09.png

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

আপনি এটি একটি অ্যাপ ইঞ্জিন ব্যাকএন্ড সার্ভিস, একটি cron জব, /log ব্রাউজ করে, অথবা একটি কমান্ড-লাইন HTTP অনুরোধ জারি করে সম্পাদন করতে পারেন। এখানে curl দিয়ে ওয়ার্কার কোড কল করার একটি নমুনা এক্সিকিউশন দেওয়া হলো (আপনার 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 " যদি আপনার অ্যাপটি মার্কিন যুক্তরাষ্ট্রে হোস্ট করা হয়।

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

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

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

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

এই টিউটোরিয়াল ছাড়াও, পুরোনো বান্ডেল পরিষেবাগুলো থেকে সরে আসার উপর আলোকপাত করে এমন অন্যান্য মাইগ্রেশন মডিউলগুলোর মধ্যে রয়েছে:

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

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

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

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

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

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

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

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

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

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

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

কোডল্যাব

পাইথন ২

পাইথন ৩

মডিউল ১৮

কোড

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

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

কোড

(পাইথন ২-এর মতোই, তবে উপরে বর্ণিত পদ্ধতি অনুযায়ী app.yaml আপডেট না করা হলে app3.yaml ব্যবহার করতে হবে)

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

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

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

ক্লাউড পাব/সাব

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

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

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

ভিডিও

লাইসেন্স

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