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

1. ওভারভিউ

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

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

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

  • একটি ক্লাউড মেমোরিস্টোর ইনস্ট্যান্স সেট আপ করুন (ক্লাউড কনসোল বা gcloud টুল থেকে)
  • একটি ক্লাউড সার্ভারহীন ভিপিসি অ্যাক্সেস সংযোগকারী সেট আপ করুন (ক্লাউড কনসোল বা gcloud টুল থেকে)
  • App Engine Memcache থেকে Cloud Memorystore এ স্থানান্তর করুন
  • একটি নমুনা অ্যাপে ক্লাউড মেমোরিস্টোরের সাথে ক্যাশিং প্রয়োগ করুন
  • App Engine ndb থেকে Cloud NDB-তে স্থানান্তর করুন

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

সমীক্ষা

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

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

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

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

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

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

2. পটভূমি

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

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

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

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

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

  1. সেটআপ/প্রিওয়ার্ক
  2. ক্যাশিং পরিষেবা সেট আপ করুন
  3. কনফিগারেশন ফাইল আপডেট করুন
  4. প্রধান অ্যাপ্লিকেশন আপডেট করুন

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

ক্লাউড প্রকল্প প্রস্তুত করুন

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

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

বেসলাইন নমুনা অ্যাপ্লিকেশন পান

বেসলাইন মডিউল 12 কোড থেকে আমরা শুরু করছি, এই কোডল্যাব আপনাকে ধাপে ধাপে মাইগ্রেশনের মাধ্যমে নিয়ে যাবে। সম্পূর্ণ হয়ে গেলে, আপনি একটি কার্যকরী মডিউল 13 অ্যাপে পৌঁছাবেন যা ফিনিশ ফোল্ডারগুলির একটিতে কোডটির সাথে ঘনিষ্ঠভাবে সাদৃশ্যপূর্ণ। এখানে সেই সম্পদগুলি রয়েছে:

START ফোল্ডারে নিম্নলিখিত ফাইলগুলি থাকা উচিত:

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

আপনি যদি Python 2 সংস্করণ থেকে শুরু করেন, তাহলে সেখানে একটি appengine_config.py ফাইল এবং সম্ভবত একটি lib ফোল্ডার থাকবে যদি আপনি মডিউল 12 কোডল্যাবটি সম্পূর্ণ করেন।

(পুনঃ) মডিউল 12 অ্যাপ স্থাপন করুন

আপনার অবশিষ্ট কাজ পূর্ববর্তী পদক্ষেপ:

  1. gcloud কমান্ড-লাইন টুলের সাথে নিজেকে পুনরায় পরিচিত করুন (যদি প্রয়োজন হয়)
  2. (পুনরায়) অ্যাপ ইঞ্জিনে মডিউল 12 কোড স্থাপন করুন (যদি প্রয়োজন হয়)

Python 2 ব্যবহারকারীদের এই কমান্ডগুলির সাথে lib ফোল্ডারটি মুছে ফেলা এবং পুনরায় ইনস্টল করা উচিত:

rm -rf ./lib; pip install -t lib -r requirements.txt                

এখন প্রত্যেকের (পাইথন 2 এবং 3 ব্যবহারকারীদের) এই কমান্ডের সাথে অ্যাপ ইঞ্জিনে কোড আপলোড করা উচিত:

gcloud app deploy                

একবার সফলভাবে মোতায়েন হয়ে গেলে, মডিউল 12-এর অ্যাপের মতো অ্যাপের চেহারা এবং কার্যকারিতা নিশ্চিত করুন, একটি ওয়েব অ্যাপ যা ভিজিট ট্র্যাক করে, একই ব্যবহারকারীর জন্য এক ঘণ্টার জন্য ক্যাশ করে:

dfe56a02ae59dd8.png

যেহেতু সাম্প্রতিক ভিজিটগুলি ক্যাশে করা হয়েছে, তাই পৃষ্ঠা রিফ্রেশগুলি মোটামুটি দ্রুত লোড হওয়া উচিত৷

4. ক্যাশিং পরিষেবা সেট আপ করুন৷

ক্লাউড মেমোরিস্টোর সার্ভারহীন নয় । একটি উদাহরণ প্রয়োজন; এই ক্ষেত্রে একটি চলমান Redis. Memcache থেকে ভিন্ন, Memorystore হল একটি স্বতন্ত্র ক্লাউড পণ্য এবং এটির একটি বিনামূল্যের স্তর নেই , তাই এগিয়ে যাওয়ার আগে Redis মূল্য সংক্রান্ত তথ্যের জন্য Memorystore চেক করতে ভুলবেন না। এই অনুশীলনের জন্য খরচ কমানোর জন্য, আমরা পরিচালনা করার জন্য সর্বনিম্ন সম্পদের সুপারিশ করি: একটি মৌলিক পরিষেবা স্তর এবং একটি 1 GB ক্ষমতা।

মেমোরিস্টোর ইনস্ট্যান্সটি আপনার অ্যাপ ইঞ্জিন অ্যাপের (দৃষ্টান্ত) থেকে আলাদা নেটওয়ার্কে রয়েছে এবং সেই কারণেই একটি সার্ভারহীন ভিপিসি অ্যাক্সেস সংযোগকারী তৈরি করতে হবে যাতে অ্যাপ ইঞ্জিন আপনার মেমোরিস্টোর সংস্থানগুলি অ্যাক্সেস করতে পারে। ভিপিসি খরচ কমাতে, ইনস্ট্যান্স টাইপ ( f1-micro ) এবং অনুরোধ করার জন্য সবচেয়ে কম সংখ্যক দৃষ্টান্ত বেছে নিন (আমরা সর্বনিম্ন 2 , সর্বোচ্চ 3 প্রস্তাব করি)। এছাড়াও VPC মূল্য তথ্য পৃষ্ঠাটি দেখুন।

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

7eb35ebf7248c010.png

উভয় সংস্থানই প্রয়োজন, এবং আপনি প্রথমে কোনটি তৈরি করেন তা বিবেচ্য নয়। আপনি যদি প্রথমে মেমোরিস্টোর ইনস্ট্যান্স তৈরি করেন, তাহলে আপনার অ্যাপ ইঞ্জিন অ্যাপ VPC সংযোগকারী ছাড়া এটিতে পৌঁছাতে পারবে না। একইভাবে, আপনি যদি প্রথমে VPC সংযোগকারী তৈরি করেন, আপনার অ্যাপ ইঞ্জিন অ্যাপের সাথে কথা বলার জন্য সেই VPC নেটওয়ার্কে কিছুই নেই৷ এই টিউটোরিয়ালটি আপনাকে প্রথমে VPC সংযোগকারী দ্বারা অনুসরণ করে মেমোরিস্টোর উদাহরণ তৈরি করেছে।

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

একটি ক্লাউড মেমোরিস্টোর উদাহরণ তৈরি করুন

যেহেতু ক্লাউড মেমোরিস্টোরের কোনো বিনামূল্যের স্তর নেই, তাই আমরা কোডল্যাব সম্পূর্ণ করার জন্য ন্যূনতম পরিমাণ সম্পদ বরাদ্দ করার পরামর্শ দিই। আপনি এই সেটিংস ব্যবহার করে খরচ ন্যূনতম রাখতে পারেন:

  • সর্বনিম্ন পরিষেবা স্তর নির্বাচন করুন: মৌলিক (কনসোল ডিফল্ট: "স্ট্যান্ডার্ড", gcloud ডিফল্ট: "বেসিক")।
  • সর্বনিম্ন পরিমাণ সঞ্চয়স্থান চয়ন করুন: 1 GB (কনসোল ডিফল্ট: 16 GB, gcloud ডিফল্ট: 1 GB)।
  • সাধারণত যেকোন সফ্টওয়্যারের নতুন সংস্করণের জন্য সর্বাধিক পরিমাণ সম্পদের প্রয়োজন হয়, তবে সবচেয়ে পুরানো সংস্করণ নির্বাচন করাও সম্ভবত সুপারিশ করা হয় না। দ্বিতীয় সর্বশেষ সংস্করণটি বর্তমানে Redis সংস্করণ 5.0 (কনসোল ডিফল্ট: 6.x)

সেই সেটিংসগুলি মাথায় রেখে, পরবর্তী বিভাগটি আপনাকে ক্লাউড কনসোল থেকে উদাহরণ তৈরি করার মাধ্যমে নেতৃত্ব দেবে। আপনি যদি কমান্ড-লাইন থেকে এটি করতে পছন্দ করেন তবে এড়িয়ে যান।

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

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

68318997e3105db6.png

একবার আপনি এটি সক্ষম করলে (এবং সম্ভবত বিলিং সহ), আপনি মেমোরিস্টোর ড্যাশবোর্ডে পৌঁছাবেন। এখানে আপনি আপনার প্রকল্পে তৈরি সমস্ত উদাহরণ দেখতে পারেন। নীচে দেখানো প্রজেক্টের কোনটি নেই, তাই আপনি দেখতে পাচ্ছেন, "প্রদর্শনের জন্য কোন সারি নেই"। একটি মেমোরিস্টোর ইনস্ট্যান্স তৈরি করতে, উপরে ইনস্ট্যান্স তৈরি করুন ক্লিক করুন:

63547aa575838a36.png

এই পৃষ্ঠাটি মেমোরিস্টোর উদাহরণ তৈরি করতে আপনার পছন্দসই সেটিংসের সাথে সম্পূর্ণ করার জন্য একটি ফর্ম বৈশিষ্ট্যযুক্ত:

b77d927287fdf4c7.png

এই টিউটোরিয়াল এবং এর নমুনা অ্যাপের জন্য খরচ কম রাখতে, আগে কভার করা সুপারিশগুলি অনুসরণ করুন। আপনি আপনার নির্বাচন করার পরে, তৈরি করুন ক্লিক করুন। সৃষ্টি প্রক্রিয়া কয়েক মিনিট সময় নেয়। এটি শেষ হলে, app.yaml এ যোগ করতে উদাহরণের আইপি ঠিকানা এবং পোর্ট নম্বর কপি করুন।

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

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

ক্লাউড কনসোলের মতো, রেডিসের জন্য ক্লাউড মেমোরিস্টোর অবশ্যই সক্রিয় থাকতে হবে। gcloud services enable redis.googleapis.com এবং এটি সম্পূর্ণ হওয়ার জন্য অপেক্ষা করুন, যেমন এই উদাহরণ:

$ gcloud services enable redis.googleapis.com
Operation "operations/acat.p2-aaa-bbb-ccc-ddd-eee-ffffff" finished successfully.

যদি পরিষেবাটি ইতিমধ্যে সক্ষম করা থাকে, কমান্ডটি চালানোর (আবার) কোন (নেতিবাচক) পার্শ্ব প্রতিক্রিয়া নেই। পরিষেবাটি সক্ষম করে, আসুন একটি মেমোরিস্টোর উদাহরণ তৈরি করি। এই আদেশটি এইরকম দেখাচ্ছে:

gcloud redis instances create NAME --redis-version VERSION \
    --region REGION --project PROJECT_ID

আপনার মেমোরিস্টোর উদাহরণের জন্য একটি নাম চয়ন করুন; এই ল্যাবটি " my-project " এর একটি প্রজেক্ট আইডি সহ নাম হিসাবে " demo-ms " ব্যবহার করে। এই নমুনা অ্যাপটির অঞ্চল হল us-central1 ( us-central এর মতো), কিন্তু লেটেন্সি একটি উদ্বেগের বিষয় হলে আপনি আপনার কাছাকাছি একটি ব্যবহার করতে পারেন। আপনাকে অবশ্যই আপনার অ্যাপ ইঞ্জিন অ্যাপের মতো একই অঞ্চল নির্বাচন করতে হবে। আপনি আপনার পছন্দের যেকোনো Redis সংস্করণ নির্বাচন করতে পারেন, কিন্তু আমরা পূর্বে প্রস্তাবিত সংস্করণ 5 ব্যবহার করছি। সেই সেটিংস দেওয়া হলে, আপনি যে কমান্ডটি জারি করবেন (সংশ্লিষ্ট আউটপুট সহ):

$ gcloud redis instances create demo-ms --region us-central1 \
    --redis-version redis_5_0 --project my-project

Create request issued for: [demo-ms]
Waiting for operation [projects/my-project/locations/us-central1/operations/operation-xxxx] to complete...done.
Created instance [demo-ms].

ক্লাউড কনসোল ডিফল্টের বিপরীতে, gcloud ডিফল্ট ন্যূনতম সম্পদে। ফলাফল হল যে সেই কমান্ডে পরিষেবা স্তর বা সঞ্চয়ের পরিমাণের প্রয়োজন ছিল না। একটি মেমোরিস্টোর ইনস্ট্যান্স তৈরি করতে কয়েক মিনিট সময় লাগে এবং এটি হয়ে গেলে, ইনস্ট্যান্সের আইপি ঠিকানা এবং পোর্ট নম্বর নোট করুন কারণ সেগুলি শীঘ্রই app.yaml এ যোগ করা হবে।

দৃষ্টান্ত তৈরি নিশ্চিত করুন

ক্লাউড কনসোল বা কমান্ড-লাইন থেকে

আপনি ক্লাউড কনসোল বা কমান্ড-লাইন থেকে আপনার উদাহরণ তৈরি করেছেন কিনা, আপনি নিশ্চিত করতে পারেন যে এটি উপলব্ধ এবং এই কমান্ডের সাথে ব্যবহারের জন্য প্রস্তুত: gcloud redis instances list --region REGION

এখানে us-central1 অঞ্চলে দৃষ্টান্ত পরীক্ষা করার জন্য কমান্ডটি প্রত্যাশিত আউটপুট সহ আমরা এইমাত্র তৈরি করা উদাহরণটি দেখায়:

$ gcloud redis instances list --region us-central1
INSTANCE_NAME  VERSION    REGION       TIER   SIZE_GB  HOST         PORT  NETWORK  RESERVED_IP     STATUS  CREATE_TIME
demo-ms        REDIS_5_0  us-central1  BASIC  1        10.aa.bb.cc  6379  default  10.aa.bb.dd/29  READY   2022-01-28T09:24:45

উদাহরণের তথ্য বা আপনার অ্যাপ কনফিগার করার জন্য জিজ্ঞাসা করা হলে, HOST এবং PORT ব্যবহার করতে ভুলবেন না ( RESERVED_IP নয়)। ক্লাউড কনসোলের ক্লাউড মেমোরিস্টোর ড্যাশবোর্ডটি এখন সেই উদাহরণটি প্রদর্শন করা উচিত:

c5a6948ec1c056ed.png

কম্পিউট ইঞ্জিন ভার্চুয়াল মেশিন থেকে

আপনার যদি একটি কম্পিউট ইঞ্জিন ভার্চুয়াল মেশিন (ভিএম) থাকে তবে আপনি এটি কাজ করছে কিনা তা নিশ্চিত করতে একটি VM থেকে আপনার মেমোরিস্টোর ইনস্ট্যান্স সরাসরি কমান্ড পাঠাতে পারেন। সচেতন থাকুন যে VM ব্যবহারে আপনি ইতিমধ্যে যে সংস্থানগুলি ব্যবহার করছেন তার থেকে স্বতন্ত্র খরচ যুক্ত হতে পারে।

সার্ভারহীন ভিপিসি অ্যাক্সেস সংযোগকারী তৈরি করুন

ক্লাউড মেমোরিস্টোরের মতো, আপনি ক্লাউড কনসোলে বা কমান্ড-লাইনে সার্ভারহীন ক্লাউড ভিপিসি সংযোগকারী তৈরি করতে পারেন। একইভাবে, ক্লাউড ভিপিসি-র কোনো বিনামূল্যের স্তর নেই, তাই আমরা সর্বনিম্ন খরচ রাখার স্বার্থে কোডল্যাব সম্পূর্ণ করার জন্য সর্বনিম্ন সম্পদ বরাদ্দ করার পরামর্শ দিই, এবং এটি এই সেটিংসের মাধ্যমে অর্জন করা যেতে পারে:

  • সর্বনিম্ন সর্বাধিক সংখ্যক দৃষ্টান্ত নির্বাচন করুন: 3 (কনসোল এবং gcloud ডিফল্ট: 10)
  • সর্বনিম্ন-মূল্যের মেশিনের ধরন চয়ন করুন: f1-micro (কনসোল ডিফল্ট: e2-micro , কোনো gcloud ডিফল্ট নেই)

পরবর্তী বিভাগটি উপরের ক্লাউড ভিপিসি সেটিংস ব্যবহার করে ক্লাউড কনসোল থেকে সংযোগকারী তৈরির মাধ্যমে আপনাকে নেতৃত্ব দেবে। আপনি যদি কমান্ড-লাইন থেকে এটি করতে পছন্দ করেন তবে পরবর্তী বিভাগে যান।

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

ক্লাউড কনসোলে ক্লাউড নেটওয়ার্কিং "সার্ভারলেস ভিপিসি অ্যাক্সেস" পৃষ্ঠাতে যান (আপনাকে বিলিং তথ্যের জন্য অনুরোধ করা হতে পারে)। আপনি যদি এখনও API সক্ষম না করে থাকেন তবে আপনাকে তা করতে বলা হবে:

e3b9c0651de25e97.png

একবার আপনি API (এবং সম্ভবত বিলিং সহ) সক্ষম করলে, আপনি তৈরি করা সমস্ত VPC সংযোগকারী প্রদর্শন করে ড্যাশবোর্ডে পৌঁছাবেন। নীচের স্ক্রিনশটটিতে ব্যবহৃত প্রজেক্টের কোনটি নেই, তাই এটি বলে, "প্রদর্শনের জন্য কোন সারি নেই"। আপনার কনসোলে, শীর্ষে সংযোগকারী তৈরি করুন ক্লিক করুন:

b74b49b9d73b7dcf.png

পছন্দসই সেটিংস সহ ফর্মটি পূরণ করুন:

6b26b2aafa719f73.png

আপনার নিজের অ্যাপ্লিকেশনের জন্য উপযুক্ত সেটিংস চয়ন করুন. এই টিউটোরিয়াল এবং ন্যূনতম প্রয়োজন সহ এর নমুনা অ্যাপের জন্য, খরচ কমিয়ে আনার জন্য এটি বোধগম্য, তাই আগে কভার করা সুপারিশগুলি অনুসরণ করুন। একবার আপনি আপনার নির্বাচন করা হয়ে গেলে, তৈরি করুন ক্লিক করুন। একটি VPC সংযোগকারীর অনুরোধ সম্পূর্ণ হতে কয়েক মিনিট সময় লাগবে৷

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

একটি VPC সংযোগকারী তৈরি করার আগে, প্রথমে সার্ভারহীন VPC অ্যাক্সেস API সক্ষম করুন৷ নিম্নলিখিত কমান্ড জারি করার পরে আপনি অনুরূপ আউটপুট দেখতে হবে:

$ gcloud services enable vpcaccess.googleapis.com
Operation "operations/acf.p2-aaa-bbb-ccc-ddd-eee-ffffff" finished successfully.

API সক্ষম হলে, একটি VPC সংযোগকারী একটি কমান্ড দিয়ে তৈরি করা হয় যা দেখতে এইরকম:

gcloud compute networks vpc-access connectors create CONNECTOR_NAME \
    --range 10.8.0.0/28 --region REGION --project PROJECT_ID

আপনার সংযোগকারীর জন্য একটি নাম বাছুন সেইসাথে একটি অব্যবহৃত /28 CIDR ব্লক শুরুর IP ঠিকানা। এই টিউটোরিয়ালটি নিম্নলিখিত অনুমান করে:

  • প্রজেক্ট আইডি : my-project
  • ভিপিসি সংযোগকারীর নাম : demo-vpc
  • সর্বনিম্ন দৃষ্টান্ত : 2 (ডিফল্ট) এবং সর্বাধিক দৃষ্টান্ত : 3
  • উদাহরণ টাইপ : f1-micro
  • অঞ্চল : us-central1
  • IPv4 CIDR ব্লক : 10.8.0.0/28 (ক্লাউড কনসোলে প্রস্তাবিত)

আপনি যদি উপরের অনুমানগুলিকে মাথায় রেখে নিম্নলিখিত কমান্ডটি কার্যকর করেন তবে আপনি নীচে যা দেখছেন তার অনুরূপ আউটপুট আশা করুন:

$ gcloud compute networks vpc-access connectors create demo-vpc \
    --max-instances 3 --range 10.8.0.0/28 --machine-type f1-micro \
    --region us-central1  --project my-project

Create request issued for: [demo-vpc]
Waiting for operation [projects/my-project/locations/us-central1/operations/xxx] to complete...done.
Created connector [demo-vpc].

উপরের কমান্ডটি ডিফল্ট মানগুলিকে বাদ দেয়, যেমন 2-এর মিন ইনস্ট্যান্স এবং default নামে একটি নেটওয়ার্ক। একটি VPC সংযোগকারী তৈরি করা সম্পূর্ণ হতে কয়েক মিনিট সময় নেয়।

সংযোগকারী তৈরি করা নিশ্চিত করুন

প্রক্রিয়াটি শেষ হয়ে গেলে, এটি তৈরি করা হয়েছে এবং ব্যবহারের জন্য প্রস্তুত হয়েছে তা নিশ্চিত করতে, এটি us-central1 অঞ্চল বলে ধরে নিয়ে নিম্নলিখিত gcloud কমান্ডটি জারি করুন:

$ gcloud compute networks vpc-access connectors list --region us-central1
CONNECTOR_ID  REGION       NETWORK  IP_CIDR_RANGE  SUBNET  SUBNET_PROJECT  MIN_THROUGHPUT  MAX_THROUGHPUT  STATE
demo-vpc      us-central1  default  10.8.0.0/28                            200             300             READY

একইভাবে, ড্যাশবোর্ডটি এখন আপনার তৈরি করা সংযোগকারীটি প্রদর্শন করবে:

e03db2c8140ed014.png

ক্লাউড প্রকল্প আইডি, ভিপিসি সংযোগকারীর নাম এবং অঞ্চলটি নোট করুন।

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

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

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

requirements.txt

এই বিভাগে, আমরা ক্লাউড মেমোরিস্টোরের পাশাপাশি ক্লাউড এনডিবি সমর্থন করার জন্য প্যাকেজ যোগ করছি। রেডিস-এর জন্য ক্লাউড মেমোরিস্টোরের জন্য, পাইথন ( redis ) এর জন্য স্ট্যান্ডার্ড রেডিস ক্লায়েন্ট ব্যবহার করা যথেষ্ট কারণ এখানে কোনও ক্লাউড মেমোরিস্টোর ক্লায়েন্ট লাইব্রেরি নেই। redis এবং google-cloud-ndb উভয়ই requirements.txt এ যোগ করুন, মডিউল 12 থেকে flask যোগ দিন:

flask
redis
google-cloud-ndb

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

app.yaml

নতুন বিভাগ যোগ করতে

পাইথন 2 অ্যাপ ইঞ্জিন রানটাইমের জন্য ক্লাউড এপিআই যেমন ক্লাউড এনডিবি, যেমন grpcio এবং setuptools ব্যবহার করার সময় নির্দিষ্ট তৃতীয় পক্ষের প্যাকেজের প্রয়োজন হয়। Python 2 ব্যবহারকারীদের অবশ্যই app.yamlউপলব্ধ সংস্করণ সহ এই ধরনের অন্তর্নির্মিত লাইব্রেরি তালিকাভুক্ত করতে হবে। আপনার যদি এখনও একটি libraries বিভাগ না থাকে তবে একটি তৈরি করুন এবং নিম্নলিখিতগুলির মতো উভয় লাইব্রেরি যুক্ত করুন:

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

আপনার অ্যাপ স্থানান্তর করার সময়, এটি ইতিমধ্যে একটি libraries বিভাগ থাকতে পারে। যদি এটি হয়, এবং হয় grpcio এবং setuptools অনুপস্থিত, শুধু আপনার বিদ্যমান libraries বিভাগে যোগ করুন।

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

env_variables:
    REDIS_HOST: 'YOUR_REDIS_HOST'
    REDIS_PORT: 'YOUR_REDIS_PORT'

vpc_access_connector:
    name: projects/PROJECT_ID/locations/REGION/connectors/CONNECTOR

এটা যতদূর প্রয়োজনীয় আপডেট যেতে. আপনার আপডেট করা 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

env_variables:
    REDIS_HOST: 'YOUR_REDIS_HOST'
    REDIS_PORT: 'YOUR_REDIS_PORT'

vpc_access_connector:
    name: projects/PROJECT_ID/locations/REGION/connectors/CONNECTOR

নীচে একটি "আগে এবং পরে" আপডেটগুলিকে চিত্রিত করে যা আপনাকে app.yaml এ আবেদন করতে হবে:

ec2bb027a67debb6.png

*পাইথন 3 পার্থক্য

এই বিভাগটি ঐচ্ছিক এবং শুধুমাত্র যদি আপনি Python 3 এ পোর্ট করছেন। এটি করার জন্য, আপনার Python 2 কনফিগারেশনে অনেক পরিবর্তন করতে হবে। আপনি যদি এই সময়ে আপগ্রেড না করেন তবে এই বিভাগটি এড়িয়ে যান৷

Python 3 রানটাইমের জন্য threadsafe বা api_version উভয়ই ব্যবহার করা হয় না, তাই এই দুটি সেটিংস মুছে দিন। সর্বশেষ অ্যাপ ইঞ্জিন রানটাইম বিল্ট-ইন থার্ড-পার্টি লাইব্রেরি বা নন -বিল্ট-ইন লাইব্রেরিগুলির অনুলিপি সমর্থন করে না। থার্ড-পার্টি প্যাকেজগুলির জন্য একমাত্র প্রয়োজনীয়তা হল সেগুলিকে requirements.txt এ তালিকাভুক্ত করা। ফলস্বরূপ, app.yaml এর সম্পূর্ণ libraries বিভাগটি মুছে ফেলা যেতে পারে।

এর পরে, Python 3 রানটাইমের জন্য ওয়েব ফ্রেমওয়ার্ক ব্যবহার করা প্রয়োজন যা তাদের নিজস্ব রাউটিং করে, তাই কেন আমরা ডেভেলপারদের দেখিয়েছি কিভাবে webp2 থেকে ফ্লাস্কে মডিউল 1-এ স্থানান্তর করা যায় । ফলস্বরূপ, সমস্ত স্ক্রিপ্ট হ্যান্ডলারকে auto পরিবর্তন করতে হবে। যেহেতু এই অ্যাপটি কোনো স্ট্যাটিক ফাইল পরিবেশন করে না, তাই হ্যান্ডলারদের তালিকাভুক্ত করা "অর্থহীন" (যেহেতু তারা সবই auto ), তাই পুরো handlers বিভাগটিও সরানো যেতে পারে। ফলস্বরূপ, পাইথন 3-এর জন্য আপনার নতুন, সংক্ষিপ্ত app.yaml টুইক করা এইরকম দেখতে ছোট করা উচিত:

runtime: python39

env_variables:
    REDIS_HOST: 'YOUR_REDIS_HOST'
    REDIS_PORT: 'YOUR_REDIS_PORT'

vpc_access_connector:
    name: projects/PROJECT_ID/locations/REGION/connectors/CONNECTOR

Python 3 এ পোর্ট করার সময় app.yaml এর মধ্যে পার্থক্যের সংক্ষিপ্ত বিবরণ:

  • threadsafe এবং api_version সেটিংস মুছুন
  • libraries বিভাগ মুছুন
  • handlers বিভাগ মুছুন (বা শুধুমাত্র script হ্যান্ডলার যদি আপনার অ্যাপ স্ট্যাটিক ফাইল পরিবেশন করে)

মান প্রতিস্থাপন

মেমোরিস্টোর এবং ভিপিসি সংযোগকারীর জন্য নতুন বিভাগে মানগুলি কেবল স্থানধারক। সেই বড়িকৃত মানগুলি ( YOUR_REDIS_HOST, YOUR_REDIS_PORT, PROJECT_ID, REGION, CONNECTOR_NAME ) প্রতিস্থাপন করুন যখন আপনি সেই সংস্থানগুলি আগে তৈরি করেছিলেন তখন থেকে সংরক্ষিত মানগুলি দিয়ে৷ আপনার মেমোরিস্টোর ইনস্ট্যান্সের ক্ষেত্রে, HOST ( RESERVED_IP নয়) এবং PORT ব্যবহার করতে ভুলবেন না। HOST এবং PORT পাওয়ার জন্য এখানে একটি দ্রুত কমান্ড-লাইন উপায় রয়েছে যা demo-ms একটি উদাহরণের নাম ধরে নেয় এবং REGION হল us-central1 :

$ gcloud redis instances describe demo-ms --region us-central1 \
    --format "value(host,port)"
10.251.161.51   6379

যদি আমাদের উদাহরণ Redis ইনস্ট্যান্স আইপি ঠিকানাটি পোর্ট 6379 ব্যবহার করে 10.10.10.10 হয় আমাদের প্রজেক্ট my-project এ অবস্থিত অঞ্চল us-central1 demo-vpc এর একটি VPC সংযোগকারী নামের সাথে, app.yaml এর এই বিভাগগুলি এইরকম দেখাবে:

env_variables:
    REDIS_HOST: '10.10.10.10'
    REDIS_PORT: '6379'

vpc_access_connector:
    name: projects/my-project/locations/us-central1/connectors/demo-vpc

appengine_config.py তৈরি বা আপডেট করুন

অন্তর্নির্মিত তৃতীয় পক্ষের লাইব্রেরির জন্য সমর্থন যোগ করুন

ঠিক যেমন আমরা আগে app.yaml দিয়ে করেছি, grpcio এবং setuptools লাইব্রেরির ব্যবহার যোগ করুন। বিল্ট-ইন থার্ড-পার্টি লাইব্রেরি সমর্থন করতে appengine_config.py পরিবর্তন করুন। যদি এটি পরিচিত বলে মনে হয়, এর কারণ হল App Engine ndb থেকে Cloud NDB-তে স্থানান্তরিত করার সময় মডিউল 2-এও এটির প্রয়োজন ছিল৷ সঠিক পরিবর্তনের প্রয়োজন হল lib ফোল্ডারটিকে setuptools.pkg_resources ওয়ার্কিং সেটে যুক্ত করা:

4140b3800694f77e.png

*পাইথন 3 পার্থক্য

এই বিভাগটি ঐচ্ছিক এবং শুধুমাত্র যদি আপনি Python 3-এ পোর্ট করছেন। স্বাগত অ্যাপ ইঞ্জিনের দ্বিতীয় প্রজন্মের পরিবর্তনগুলির মধ্যে একটি হল যে (কখনও কখনও "ভেন্ডরিং" বলা হয়) (নন-বিল্ট-ইন) থার্ড-পার্টি প্যাকেজগুলির অনুলিপি করা এবং বিল্ট-এর উল্লেখ করা। app.yaml এ থার্ড-পার্টি প্যাকেজগুলির আর প্রয়োজন নেই, মানে আপনি সম্পূর্ণ appengine_config.py ফাইলটি মুছে ফেলতে পারেন।

6. অ্যাপ্লিকেশন ফাইল আপডেট করুন

শুধুমাত্র একটি অ্যাপ্লিকেশন ফাইল আছে, main.py , তাই এই বিভাগে সমস্ত পরিবর্তন শুধুমাত্র সেই ফাইলটিকে প্রভাবিত করে। এই অ্যাপ্লিকেশনটিকে ক্লাউড মেমোরিস্টোরে স্থানান্তর করতে আমরা যে পরিবর্তনগুলি করতে যাচ্ছি তার একটি সচিত্র উপস্থাপনা প্রদান করেছি৷ এটি শুধুমাত্র দৃষ্টান্তমূলক উদ্দেশ্যে এবং আপনার ঘনিষ্ঠভাবে বিশ্লেষণ করার জন্য নয়। সমস্ত কাজ আমরা কোডে যে পরিবর্তনগুলি করি তার মধ্যে রয়েছে।

5d043768ba7be742.png

শীর্ষ থেকে শুরু করে, এক সময়ে এই একটি বিভাগ মোকাবেলা করা যাক।

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

মডিউল 12-এর জন্য main.py এ আমদানি বিভাগটি ক্লাউড এনডিবি এবং ক্লাউড টাস্ক ব্যবহার করে; এখানে তাদের আমদানি আছে:

আগে:

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

মেমোরিস্টোরে স্যুইচ করার জন্য এনভায়রনমেন্ট ভেরিয়েবল পড়তে হবে, যার অর্থ আমাদের পাইথন os মডিউলের পাশাপাশি redis , Python Redis ক্লায়েন্ট প্রয়োজন। যেহেতু রেডিস পাইথন অবজেক্টকে ক্যাশে করতে পারে না, তাই pickle ব্যবহার করে সাম্প্রতিক ভিজিট তালিকাটি মার্শাল করুন, তাই এটিও আমদানি করুন। মেমক্যাশের একটি সুবিধা হল যে অবজেক্ট সিরিয়ালাইজেশন স্বয়ংক্রিয়ভাবে ঘটে যেখানে মেমোরিস্টোর একটু বেশি "DIY"। অবশেষে, google.appengine.ext.ndb google.cloud.ndb দিয়ে প্রতিস্থাপন করে App Engine ndb থেকে Cloud NDB-তে আপগ্রেড করুন। এই পরিবর্তনের পরে, আপনার আমদানি এখন নিম্নরূপ হওয়া উচিত:

পরে:

import os
import pickle
from flask import Flask, render_template, request
from google.cloud import ndb
import redis

সূচনা আপডেট করুন

মডিউল 12 ইনিশিয়ালাইজেশনের মধ্যে রয়েছে ফ্লাস্ক অ্যাপ্লিকেশন অবজেক্ট app ইনস্ট্যান্টিয়েটিং করা এবং এক ঘন্টার ক্যাশিংয়ের জন্য একটি ধ্রুবক সেট করা:

আগে :

app = Flask(__name__)
HOUR = 3600

ক্লাউড এপিআই ব্যবহার করার জন্য একটি ক্লায়েন্ট প্রয়োজন, তাই ফ্লাস্কের ঠিক পরে একটি ক্লাউড এনডিবি ক্লায়েন্ট ইনস্ট্যান্টিয়েট করুন। এরপরে, app.yaml এ আপনার সেট করা এনভায়রনমেন্ট ভেরিয়েবল থেকে মেমোরিস্টোর ইনস্ট্যান্সের জন্য IP ঠিকানা এবং পোর্ট নম্বর পান। যে তথ্য দিয়ে সশস্ত্র, একটি Redis ক্লায়েন্ট ইনস্ট্যান্ট. এই আপডেটগুলির পরে আপনার কোডটি কেমন দেখায় তা এখানে:

পরে:

app = Flask(__name__)
ds_client = ndb.Client()
HOUR = 3600
REDIS_HOST = os.environ.get('REDIS_HOST', 'localhost')
REDIS_PORT = os.environ.get('REDIS_PORT', '6379')
REDIS = redis.Redis(host=REDIS_HOST, port=REDIS_PORT)

*পাইথন 3 মাইগ্রেশন

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

প্রথমত, যেহেতু মেমক্যাশে একটি অ্যাপ ইঞ্জিন বান্ডেলড পরিষেবা, পাইথন 3 অ্যাপে এটির ব্যবহারের জন্য অ্যাপ ইঞ্জিন SDK প্রয়োজন, বিশেষভাবে WSGI অ্যাপ্লিকেশন (পাশাপাশি অন্যান্য প্রয়োজনীয় কনফিগারেশন ) মোড়ানো:

আগে:

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

app = Flask(__name__)
app.wsgi_app = wrap_wsgi_app(app.wsgi_app)
HOUR = 3600

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

পরে:

import os
import pickle
from flask import Flask, render_template, request
from google.cloud import ndb
import redis

app = Flask(__name__)
ds_client = ndb.Client()
HOUR = 3600
REDIS_HOST = os.environ.get('REDIS_HOST', 'localhost')
REDIS_PORT = os.environ.get('REDIS_PORT', '6379')
REDIS = redis.Redis(host=REDIS_HOST, port=REDIS_PORT)

অবশেষে, app.yaml (লাইনটি মুছুন: app_engine_apis: true ) এবং requirements.txt (লাইনটি মুছুন: appengine-python-standard ) থেকে SDK-এর ব্যবহার সরিয়ে দিন।

ক্লাউড মেমোরিস্টোরে (এবং ক্লাউড এনডিবি) মাইগ্রেট করুন

ক্লাউড এনডিবি-এর ডেটা মডেলটি অ্যাপ ইঞ্জিন ndb এর সাথে সামঞ্জস্যপূর্ণ হওয়ার উদ্দেশ্যে তৈরি করা হয়েছে, যার অর্থ Visit অবজেক্টের সংজ্ঞা একই থাকে৷ ক্লাউড NDB-তে মডিউল 2 মাইগ্রেশনের অনুকরণ করে, store_visit() এবং fetch_visits() এ সমস্ত ডেটাস্টোর কলগুলিকে ব্লক with একটি নতুন এম্বেড করা হয়েছে (ক্লাউড NDB কনটেক্সট ম্যানেজার ব্যবহার করা প্রয়োজন)। এখানে সেই পরিবর্তনের আগে সেই কলগুলি রয়েছে:

আগে:

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)

উভয় ফাংশনে with ds_client.context() ব্লক যুক্ত করুন এবং ডেটাস্টোর কলগুলি ভিতরে রাখুন (এবং ইন্ডেন্টেড)। এই ক্ষেত্রে, কলগুলির জন্য কোনও পরিবর্তনের প্রয়োজন নেই:

পরে:

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 Visit.query().order(-Visit.timestamp).fetch(limit)

এর পরে, ক্যাশে পরিবর্তনগুলি দেখুন। এখানে মডিউল 12 থেকে main() ফাংশন রয়েছে:

আগে:

@app.route('/')
def root():
    'main application (GET) handler'
    # check for (hour-)cached visits
    ip_addr, usr_agt = request.remote_addr, request.user_agent
    visitor = '{}: {}'.format(ip_addr, usr_agt)
    visits = memcache.get('visits')

    # register visit & run DB query if cache empty or new visitor
    if not visits or visits[0].visitor != visitor:
        store_visit(ip_addr, usr_agt)
        visits = list(fetch_visits(10))
        memcache.set('visits', visits, HOUR)  # set() not add()

    return render_template('index.html', visits=visits)

মেমক্যাশের মতোই রেডিসের "গেট" এবং "সেট" কল রয়েছে। আমরা যা করি তা হল নিজ নিজ ক্লায়েন্ট লাইব্রেরিগুলিকে অদলবদল করা, তাই না? প্রায়। আগেই উল্লেখ করা হয়েছে, আমরা Redis-এর সাথে পাইথন তালিকা ক্যাশে করতে পারি না (কারণ এটি প্রথমে সিরিয়াল করা দরকার, মেমক্যাচে স্বয়ংক্রিয়ভাবে কিছু যত্ন নেয়), তাই set() কলে, ভিজিটগুলিকে pickle.dumps() । একইভাবে, ক্যাশে থেকে ভিজিট পুনরুদ্ধার করার সময়, আপনাকে get() ঠিক পরে pickle.loads() দিয়ে এটিকে আনপিকল করতে হবে। এই পরিবর্তনগুলি বাস্তবায়ন করার পরে এখানে প্রধান হ্যান্ডলার রয়েছে:

পরে:

@app.route('/')
def root():
    'main application (GET) handler'
    # check for (hour-)cached visits
    ip_addr, usr_agt = request.remote_addr, request.user_agent
    visitor = '{}: {}'.format(ip_addr, usr_agt)
    rsp = REDIS.get('visits')
    visits = pickle.loads(rsp) if rsp else None

    # register visit & run DB query if cache empty or new visitor
    if not visits or visits[0].visitor != visitor:
        store_visit(ip_addr, usr_agt)
        visits = list(fetch_visits(10))
        REDIS.set('visits', pickle.dumps(visits), ex=HOUR)

    return render_template('index.html', visits=visits)

এটি মেমক্যাশের নমুনা অ্যাপের ব্যবহারকে ক্লাউড মেমোরিস্টোরে রূপান্তর করার জন্য main.py এ প্রয়োজনীয় পরিবর্তনগুলি শেষ করে৷ এইচটিএমএল টেমপ্লেট এবং পাইথন 3 এ পোর্টিং সম্পর্কে কি?

পাইথন 3 এ এইচটিএমএল টেমপ্লেট ফাইল এবং পোর্ট আপডেট করবেন?

আশ্চর্য! এখানে কিছু করার নেই কারণ অ্যাপ্লিকেশনটি কোন কোড পরিবর্তন বা সামঞ্জস্যপূর্ণ লাইব্রেরি ছাড়াই পাইথন 2 এবং 3 উভয় ক্ষেত্রে চালানোর জন্য ডিজাইন করা হয়েছিল। আপনি main.py খুঁজে পাবেন। mod13a (2.x) এবং mod13b (3.x) "FINISH" ফোল্ডার জুড়ে অভিন্ন৷ সংস্করণ সংখ্যার (যদি ব্যবহার করা হয়) কোনো পার্থক্য বাদ দিয়ে, requirements.txt এর ক্ষেত্রেও একই কথা। যেহেতু ইউজার ইন্টারফেস অপরিবর্তিত থাকে, তাই templates/index.html এ কোন আপডেট নেই।

Python 3 অ্যাপ ইঞ্জিনে এই অ্যাপটি চালানোর জন্য প্রয়োজনীয় সবকিছু কনফিগারেশনের আগে সম্পন্ন করা হয়েছিল: app.yaml থেকে অপ্রয়োজনীয় নির্দেশাবলী সরানো হয়েছিল এবং appengine_config.py এবং lib ফোল্ডার উভয়ই মুছে ফেলা হয়েছিল কারণ সেগুলি Python 3-এ অব্যবহৃত ছিল।

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

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

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

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

rm -rf ./lib
pip install -t lib -r requirements.txt

Python 2 এবং 3 উভয় ডেভেলপারেরই এখন তাদের অ্যাপস এর সাথে স্থাপন করা উচিত:

gcloud app deploy

যেহেতু আপনি সম্পূর্ণ ভিন্ন ক্যাশিং পরিষেবার জন্য হুডের নীচে জিনিসগুলিকে নতুন করে তৈরি করেছেন, অ্যাপটি নিজেই আপনার মডিউল 12 অ্যাপের সাথে অভিন্নভাবে কাজ করবে:

মডিউল 7 ভিজিটমি অ্যাপ

এই ধাপ কোডল্যাব সম্পূর্ণ করে। আমরা আপনাকে আপনার আপডেট করা নমুনা অ্যাপটিকে মডিউল 13 ফোল্ডার, mod13a (পাইথন 2) বা mod13b (পাইথন 3) এর সাথে তুলনা করার জন্য আমন্ত্রণ জানাচ্ছি।

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

সাধারণ

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

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

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

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

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

এই টিউটোরিয়ালটি চারটি ক্লাউড পণ্যের ব্যবহার জড়িত:

  • অ্যাপ ইঞ্জিন
  • ক্লাউড ডেটাস্টোর
  • ক্লাউড মেমোরিস্টোর
  • ক্লাউড ভিপিসি

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

শাটডাউন মেমোরিস্টোর ইনস্ট্যান্স এবং ভিপিসি সংযোগকারী

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

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

মেমোরিস্টোর ইনস্ট্যান্স মুছতে, মেমোরিস্টোর ড্যাশবোর্ডে ফিরে যান এবং ইনস্ট্যান্স আইডিতে ক্লিক করুন:

2b09baf1aa2e0a25.png

একবার সেই উদাহরণের বিশদ পৃষ্ঠায়, "মুছুন" এ ক্লিক করুন এবং নিশ্চিত করুন:

f9d9eb1c1d4c6107.png

VPC সংযোগকারী মুছে ফেলতে, এর ড্যাশবোর্ডে যান এবং আপনি যে সংযোগকারীটি মুছতে চান তার পাশের চেকবক্সটি নির্বাচন করুন, তারপর "মুছুন" এ ক্লিক করুন এবং নিশ্চিত করুন:

ca5fbd9f4c7c9b60.png

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

নিম্নলিখিত জোড়া gcloud কমান্ড যথাক্রমে Memorystore ইনস্ট্যান্স এবং VPC সংযোগকারী উভয় মুছে দেয়:

  • gcloud redis instances delete INSTANCE --region REGION
  • gcloud compute networks vpc-access connectors delete CONNECTOR --region REGION

আপনি যদি gcloud config set project সাথে আপনার প্রকল্প আইডি সেট না করে থাকেন, তাহলে আপনাকে --project PROJECT_ID প্রদান করতে হতে পারে। যদি আপনার মেমোরিস্টোর ইনস্ট্যান্সকে demo-ms বলা হয় এবং ভিপিসি কানেক্টরকে demo-vpc বলা হয়, এবং উভয়ই us-central1 অঞ্চলে থাকে, তাহলে নিম্নলিখিত জোড়া কমান্ড জারি করুন এবং নিশ্চিত করুন:

$ gcloud redis instances delete demo-ms --region us-central1
You are about to delete instance [demo-ms] in [us-central1].
Any associated data will be lost.

Do you want to continue (Y/n)?

Delete request issued for: [demo-ms]
Waiting for operation [projects/PROJECT/locations/REGION/operations/operation-aaaaa-bbbbb-ccccc-ddddd] to complete...done.
Deleted instance [demo-ms].
$
$ gcloud compute networks vpc-access connectors delete demo-vpc --region us-central1
You are about to delete connector [demo-vpc] in [us-central1].
Any associated data will be lost.

Do you want to continue (Y/n)?

Delete request issued for: [demo-vpc]
Waiting for operation [projects/PROJECT/locations/REGION/operations/aaaaa-bbbb-cccc-dddd-eeeee] to complete...done.
Deleted connector [demo-vpc].

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

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

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

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

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

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

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

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

8. অতিরিক্ত সংস্থান

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

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

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

মাইগ্রেশন রিসোর্স

মডিউল 12 (স্টার্ট) এবং মডিউল 13 (ফিনিস) এর জন্য রেপো ফোল্ডারগুলির লিঙ্কগুলি নীচের সারণীতে পাওয়া যাবে। এগুলি সমস্ত অ্যাপ ইঞ্জিন কোডেল্যাব মাইগ্রেশনগুলির জন্য রেপো থেকেও অ্যাক্সেস করা যেতে পারে যা আপনি একটি জিপ ফাইল ক্লোন বা ডাউনলোড করতে পারেন।

কোডল্যাব

পাইথন 2

পাইথন 3

মডিউল 12

কোড

কোড

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

কোড

কোড

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

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

অ্যাপ ইঞ্জিন

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

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

ক্লাউড ভিপিসি

অন্যান্য মেঘের তথ্য

লাইসেন্স

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