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

1. ওভারভিউ

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

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

মডিউল 18 এ, আপনি শিখবেন কিভাবে আপনার অ্যাপে টাস্কের ব্যবহার যোগ করতে হয়। এই মডিউলে, আপনি সমাপ্ত মডিউল 18 অ্যাপটি নেবেন এবং সেই ব্যবহারটিকে Cloud Pub/Sub-এ স্থানান্তর করবেন। যারা পুশ টাস্কের জন্য টাস্ক কিউ ব্যবহার করে তারা পরিবর্তে ক্লাউড টাস্কে স্থানান্তরিত হবে এবং পরিবর্তে মডিউল 7-9 উল্লেখ করা উচিত।

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

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

সমীক্ষা

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

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

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

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

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

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

2. পটভূমি

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

মাইগ্রেশন মডিউল 7-9 কভার পুশ টাস্ক মাইগ্রেশন যখন মডিউল 18-19 টাস্ক মাইগ্রেশনে ফোকাস করে। যদিও ক্লাউড টাস্কগুলি টাস্ক কিউ পুশ টাস্কগুলিকে আরও ঘনিষ্ঠভাবে মেলে, পাব/সাব টাস্ক কিউ পুল টাস্কগুলির মতো একটি অ্যানালগ নয়৷

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

যদিও মডিউল 18 কোডটি পাইথন 2 নমুনা অ্যাপ হিসাবে "বিজ্ঞাপন" করা হয়েছে, উৎসটি নিজেই পাইথন 2 এবং 3 সামঞ্জস্যপূর্ণ, এবং এটি মডিউল 19-এ ক্লাউড পাব/সাব (এবং ক্লাউড এনডিবি) এ স্থানান্তরিত হওয়ার পরেও সেভাবেই রয়ে গেছে।

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

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

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

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

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

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

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

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

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

পূর্বশর্তগুলির মধ্যে একটি হল একটি কার্যকরী মডিউল 18 অ্যাপ ইঞ্জিন অ্যাপ, তাই হয় এর কোডল্যাবটি সম্পূর্ণ করুন (প্রস্তাবিত; উপরে লিঙ্ক) অথবা রেপো থেকে মডিউল 18 কোডটি অনুলিপি করুন। আপনি আপনার বা আমাদের ব্যবহার করুন না কেন, এখানেই আমরা শুরু করব ("স্টার্ট")। এই কোডল্যাব মডিউল 19 রেপো ফোল্ডারে ("FINISH") যা আছে তার সাথে সাদৃশ্যপূর্ণ কোডের সাথে উপসংহারে মাইগ্রেশনের মধ্য দিয়ে চলে।

আপনি যে মডিউল 18 অ্যাপটি ব্যবহার করেন তা নির্বিশেষে, ফোল্ডারটি নীচের মত হওয়া উচিত, সম্ভবত একটি lib ফোল্ডারের সাথেও:

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

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

মডিউল 18 অ্যাপটি স্থাপন করতে নিম্নলিখিত পদক্ষেপগুলি সম্পাদন করুন:

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

b667551dcbab1a09.png

মডিউল 18 নমুনা অ্যাপ স্থানান্তর করার আগে, আপনাকে প্রথমে ক্লাউড পরিষেবাগুলি সক্ষম করতে হবে যা পরিবর্তিত অ্যাপ ব্যবহার করবে।

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

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

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

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

c7a740304e9d35b.png

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

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.

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

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

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

মডিউল 18 থেকে টাস্ক কিউ ওয়ার্কফ্লো এর সিকোয়েন্স অর্ডার রিক্যাপিং:

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

আপনি পাব/সাবের সাথে অনুরূপ ওয়ার্কফ্লো প্রতিলিপি করতে যাচ্ছেন। পরবর্তী বিভাগে প্রয়োজনীয় পাব/সাব রিসোর্স তৈরি করার তিনটি ভিন্ন উপায় সহ মৌলিক পাব/সাব পরিভাষা উপস্থাপন করা হয়েছে।

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

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

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

যদিও সারিবদ্ধ পণ্য পরিবর্তিত হয়, কর্মপ্রবাহ তুলনামূলকভাবে একই রকম থাকে:

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

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

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

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

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

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

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

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

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

a05cfdbf64571ceb.png

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

  1. ক্লাউড কনসোল পাব/সাবস্ক্রিপশন পৃষ্ঠাতে যান।
  2. শীর্ষে সাবস্ক্রিপশন তৈরি করুন ক্লিক করুন (নীচের ছবিটি দেখুন)।
  3. সাবস্ক্রিপশন আইডি ক্ষেত্রে worker লিখুন।
  4. সিলেক্ট এ ক্লাউড পাব/সাব টপিক পুলডাউন থেকে pullq বেছে নিন, এটির "সম্পূর্ণ-যোগ্য পাথনাম" উল্লেখ করে, উদাহরণস্বরূপ, 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 এবং একটি SUBSCRIPTION_ID worker দিয়ে এগুলি কার্যকর করা হলে প্রকল্প 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].

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

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

স্বয়ংক্রিয়ভাবে বিষয় এবং সদস্যতা তৈরি করার আরেকটি উপায় হল সোর্স কোডে Pub/Sub API ব্যবহার করে। নীচে মডিউল 19 রেপো ফোল্ডারে 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)

ইতিমধ্যেই বিদ্যমান সংস্থানগুলি তৈরি করতে API-কে কল করার ফলে একটি 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'

আপনি যদি পাব/সাব-এ নতুন হন, অতিরিক্ত অন্তর্দৃষ্টির জন্য পাব/সাব আর্কিটেকচার সাদা কাগজ দেখুন।

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

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

queue.yaml মুছুন

আমরা টাস্ক কিউ থেকে সম্পূর্ণভাবে দূরে সরে যাচ্ছি, তাই queue.yaml মুছে দিন কারণ Pub/Sub এই ফাইলটি ব্যবহার করে না। একটি পুল সারি তৈরি করার পরিবর্তে, আপনি একটি পাব/সাব বিষয় (এবং সদস্যতা ) তৈরি করবেন।

requirements.txt

google-cloud-ndb এবং google-cloud-pubsub উভয়ই requirements.txt এ যোগ করুন যাতে মডিউল 18 থেকে flask যোগদান করা যায়। আপনার আপডেট হওয়া মডিউল 19 requirements.txt এখন এইরকম হওয়া উচিত:

flask
google-cloud-ndb
google-cloud-pubsub

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

app.yaml

আপনি Python 2-এর সাথে থাকছেন বা Python 3-তে আপগ্রেড করছেন কিনা তার উপর নির্ভর করে app.yaml এর পরিবর্তনগুলি আলাদা।

পাইথন 2

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

আগে:

runtime: python27
threadsafe: yes
api_version: 1

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

app.yaml এ একটি libraries বিভাগ যোগ করুন এবং setuptools এবং grpcio উভয়ের জন্য এন্ট্রি সহ, তাদের সর্বশেষ সংস্করণ নির্বাচন করুন। এছাড়াও 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

পাইথন 3

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

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

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

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

আগে:

runtime: python27
threadsafe: yes
api_version: 1

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

পরে:

runtime: python310

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

appengine_config.py

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

মডিউল 18 appengine_config.py 3য়-পক্ষের লাইব্রেরিগুলিকে সমর্থন করার জন্য উপযুক্ত কোড রয়েছে, উদাহরণস্বরূপ, 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 ফোল্ডার থাকে তবে এটি মুছুন। আপনি যদি পাইথন 2 ব্যবহারকারী হন তবে নিম্নলিখিত কমান্ডটি জারি করে lib ফোল্ডারটি পুনরায় পূরণ করুন:

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

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

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

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

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

আমদানি এবং আরম্ভ করার জন্য বেশ কয়েকটি আপডেট রয়েছে:

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

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

আগে:

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 ডেটা মডেল পরিবর্তন হয় না। ডেটাস্টোর অ্যাক্সেসের জন্য ক্লাউড NDB API ক্লায়েন্ট কনটেক্সট ম্যানেজার, ds_client.context() এর সুস্পষ্ট ব্যবহার প্রয়োজন। কোডে, এর মানে হল আপনি ব্লক with পাইথনের ভিতরে store_visit() এবং fetch_visits() উভয়েই ডেটাস্টোর কলগুলিকে মোড়ানো। এই আপডেটটি মডিউল 2-এ যা কভার করা হয়েছে তার অনুরূপ।

Pub/Sub-এর জন্য সবচেয়ে প্রাসঙ্গিক পরিবর্তন হল একটি টাস্ক কিউ পুল টাস্কের সারিবদ্ধকরণকে pullq বিষয়ে একটি পাব/সাব বার্তা প্রকাশের সাথে প্রতিস্থাপন করা। এই আপডেটগুলি করার আগে এবং পরে কোডটি নীচে দেওয়া হল:

আগে:

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() করে না তার ডেটাস্টোর ক্যোয়ারীটি 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 কে ক্লাউড NDB এবং টাস্ক কিউ পাব/সাবের সাথে প্রতিস্থাপন করা পর্যন্ত কর্মী কোড আপডেট হয়, কিন্তু এর কর্মপ্রবাহ একই থাকে।

  1. ব্লক with ক্লাউড এনডিবি কনটেক্সট ম্যানেজারে ডেটাস্টোর কলগুলি মোড়ানো।
  2. টাস্ক কিউ ক্লিনআপে টাস্ক কিউ থেকে সমস্ত কাজ মুছে ফেলা জড়িত। Pub/Sub-এর সাথে, "স্বীকৃতি আইডি" 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 ব্যবহার করে আপনার নতুন মডিউল 19 অ্যাপ্লিকেশনে আসার জন্য অভিনন্দন!

7. সারাংশ/পরিষ্কার

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

প্রয়োগ এবং আবেদন যাচাই

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

b667551dcbab1a09.png

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

আপনি এটি একটি অ্যাপ ইঞ্জিন ব্যাকএন্ড পরিষেবা, একটি cron কাজ, /log এ ব্রাউজিং বা একটি কমান্ড-লাইন HTTP অনুরোধ জারি করার মাধ্যমে কার্যকর করতে পারেন। এখানে একটি নমুনা এক্সিকিউশন এবং curl দিয়ে কর্মী কোড কল করার বাইরে (আপনার PROJECT_ID বিকল্প করুন):

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

আপডেট করা গণনা পরবর্তী ওয়েবসাইট পরিদর্শনে প্রতিফলিত হবে। তাই তো!

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

সাধারণ

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

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

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

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

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

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

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

এই টিউটোরিয়ালের বাইরে, অন্যান্য মাইগ্রেশন মডিউল যা বিবেচনা করার জন্য লিগ্যাসি বান্ডিল পরিষেবাগুলি থেকে দূরে সরে যাওয়ার উপর ফোকাস করে:

  • মডিউল 2 : App Engine ndb থেকে Cloud NDB-তে স্থানান্তর করুন
  • মডিউল 7-9 : অ্যাপ ইঞ্জিন টাস্ক কিউ (পুশ টাস্ক) থেকে ক্লাউড টাস্কে স্থানান্তর করুন
  • মডিউল 12-13 : অ্যাপ ইঞ্জিন মেমক্যাশ থেকে ক্লাউড মেমোরিস্টোরে স্থানান্তর করুন
  • মডিউল 15-16 : অ্যাপ ইঞ্জিন ব্লবস্টোর থেকে ক্লাউড স্টোরেজে স্থানান্তর করুন

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

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

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

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

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

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

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

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

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

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

কোডল্যাব

পাইথন 2

পাইথন 3

মডিউল 18

কোড

(n/a)

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

কোড

(Python 2 এর মতই app3.yaml ব্যবহার করা ছাড়া যদি না আপনি app.yaml আপডেট করে উপরে কভার করেছেন)

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

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

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

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

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

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

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

ভিডিও

লাইসেন্স

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