মডিউল 6: ক্লাউড ডেটাস্টোর থেকে ক্লাউড ফায়ারস্টোরে স্থানান্তর করুন

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

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

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

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

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

  • ডেটাস্টোর এবং ফায়ারস্টোরের মধ্যে পার্থক্যগুলো চিনুন।
  • ক্লাউড ডেটাস্টোর থেকে ক্লাউড ফায়ারস্টোরে মাইগ্রেট করুন

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

জরিপ

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

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

২. পটভূমি

২০১৩ সালে অ্যাপ ইঞ্জিনের ডেটাস্টোর ‘গুগল ক্লাউড ডেটাস্টোর’ নামে একটি স্বতন্ত্র পণ্যে পরিণত হয় এবং এখন এটি অ্যাপ ইঞ্জিনের বাইরের ডেভেলপারদের জন্যও সহজলভ্য। পরের বছর, গুগল ফায়ারবেসকে অধিগ্রহণ করে। সেই সময়ে এটি তার রিয়েল-টাইম ডেটাবেসের জন্য পরিচিত ছিল।

পরবর্তী কয়েক বছর ধরে, ফায়ারবেস এবং ক্লাউড ডেটাস্টোর টিম ফায়ারবেসের কিছু ফিচার ডেটাস্টোরে একীভূত করার জন্য কাজ করে। ফলস্বরূপ, ২০১৭ সালে ক্লাউড ডেটাস্টোরের পরবর্তী প্রজন্ম প্রকাশিত হয় । ফায়ারবেসের কিছু ফিচার অন্তর্ভুক্ত করার বিষয়টি প্রতিফলিত করতে, এর নতুন নামকরণ করা হয় ক্লাউড ফায়ারস্টোর

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

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

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

  • আপনাকে অবশ্যই আপনার বর্তমান অ্যাপের প্রজেক্ট থেকে ভিন্ন একটি প্রজেক্ট ব্যবহার করতে হবে
  • যে প্রজেক্টের কোনো অ্যাপে ডেটাস্টোর এনটিটি যোগ করা হয়েছে, সেটিকে নেটিভ মোডে ফায়ারস্টোরে পরিবর্তন করা যাবে না।
  • একইভাবে, যে প্রজেক্টে নেটিভ মোডে ফায়ারস্টোর নির্বাচন করা হয়েছে, সেটি আর ডেটাস্টোর মোডে ফায়ারস্টোরে ফিরে যেতে পারে না।
  • এমন কোনো মাইগ্রেশন টুল নেই যা দিয়ে এক প্রজেক্ট থেকে অন্য প্রজেক্টে ডেটা স্ট্রিম করা যায়।
  • ডেটাস্টোরের কিছু গুরুত্বপূর্ণ বৈশিষ্ট্য, যেমন নেমস্পেস এবং উচ্চতর রাইট থ্রুপুট (>10k/s), ফায়ারস্টোরে পাওয়া যায় না
  • এক্সপোর্ট এবং ইম্পোর্ট টুলগুলো খুবই সাধারণ এবং এগুলোতে হয় সব পাওয়া যায়, নয়তো কিছুই পাওয়া যায় না।
    • আপনার অ্যাপে যদি অনেকগুলো ডেটাস্টোর এনটিটি থাকে, তাহলে সেগুলোকে এক্সপোর্ট করে ফায়ারস্টোরে ইম্পোর্ট করতে অনেক ঘন্টা সময় লাগতে পারে।
    • এই সময়ে, আপনার অ্যাপ্লিকেশন/পরিষেবা ডেটা লিখতে বা আপডেট করতে পারবে না।
    • মাইগ্রেশন কার্যক্রম সাধারণ ব্যবহারের অন্তর্ভুক্ত; খরচ কমাতে আপনি এটি ভাগ করে নিতে পারেন (সম্ভব হলে দৈনিক কোটা অনুযায়ী)।
    • যেহেতু আপনার নতুন পরিষেবাটি একটি ভিন্ন প্রকল্পে চলে, তাই DNS আপডেটগুলি ছড়িয়ে পড়ার জন্য কিছুটা সময় প্রয়োজন হবে।
  • Datastore এবং Firestore-এর ডেটা মডেলগুলো একই রকম হলেও ভিন্ন, তাই মাইগ্রেশনের জন্য অ্যাপ/সার্ভিসটির কার্যপদ্ধতি আপডেট করার প্রয়োজন হয়।
    • ডেটাস্টোর থেকে অ্যানসেস্টর কোয়েরিগুলো এখন ফায়ারস্টোর কালেকশন কোয়েরি (ডিফল্ট) হিসেবে গণ্য হবে।
    • ডেটাস্টোর থেকে করা ব্রড টাইপ কোয়েরিগুলো হলো ফায়ারস্টোর কালেকশন গ্রুপ কোয়েরি।
    • ইনডেক্স ও তার পরিচালনা পদ্ধতি ভিন্ন, ইত্যাদি।

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

পাইথন ২ ব্যবহারকারীগণ: এই ঐচ্ছিক মাইগ্রেশন কোডল্যাবটি শুধুমাত্র পাইথন ৩-এ উপস্থাপন করা হয়েছে, তবে যেহেতু ক্লাউড ফায়ারস্টোর ২.x সংস্করণও সমর্থন করে, তাই ব্যবহারকারীরা ব্যবহারের পার্থক্যগুলো বুঝে নিতে পারবেন। একটি উদাহরণ হলো, ফায়ারস্টোর রেকর্ডগুলো ইউনিকোড স্ট্রিং ব্যবহার করে (বাইট স্ট্রিং-এর পরিবর্তে), তাই পাইথন ২ স্ট্রিং লিটারেলের শুরুতে একটি u'' নির্দেশক প্রয়োজন হয়, যার অর্থ হলো একটি ২.x store_visit() ফাংশন দেখতে এইরকম হবে:

def store_visit(remote_addr, user_agent):
    doc_ref = fs_client.collection(u'Visit')
    doc_ref.add({
        u'timestamp': datetime.now(),
        u'visitor': u'{}: {}'.format(remote_addr, user_agent),
    })

এছাড়া, ক্লায়েন্ট লাইব্রেরিটিও একইভাবে কাজ করবে। আরেকটি বিষয় যা বিবেচনা করতে হবে তা হলো, 2.x ক্লাউড ফায়ারস্টোর লাইব্রেরির উন্নয়ন "স্থগিত" করা হয়েছে, তাই ক্রমবর্ধমান নতুন ফিচারগুলো শুধুমাত্র 3.x ফায়ারস্টোর ক্লায়েন্ট লাইব্রেরিতেই পাওয়া যাবে।

এই মাইগ্রেশনটি সম্পন্ন করার জন্য, এই টিউটোরিয়ালের প্রধান ধাপগুলো হলো নিম্নরূপ:

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

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

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

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

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

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

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

আপনি আপনার নিজের বা আমাদের কোড ব্যবহার করুন না কেন, আমরা মডিউল ৩-এর কোড থেকেই শুরু করব। এই মডিউল ৬-এর কোডল্যাবটি আপনাকে প্রতিটি ধাপের মধ্য দিয়ে নিয়ে যাবে, এবং এটি সম্পূর্ণ হলে, কোডটি চূড়ান্ত পর্যায়ের কোডের মতো দেখতে হবে। (এই টিউটোরিয়ালটি শুধুমাত্র পাইথন ৩-এর জন্য উপলব্ধ।)

মডিউল ৩-এর ফাইলগুলোর ডিরেক্টরি (আপনার বা আমাদের) দেখতে এইরকম হবে:

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

৩. মডিউল ৩ অ্যাপ (পুনরায়) স্থাপন করুন

এখন আপনার বাকি প্রস্তুতিমূলক ধাপগুলো সম্পন্ন করতে হবে:

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

একবার আপনি সফলভাবে সেই ধাপগুলো সম্পন্ন করে এর কার্যকারিতা নিশ্চিত করলে, আমরা এই টিউটোরিয়ালে কনফিগারেশন ফাইলগুলো দিয়ে শুরু করে এগিয়ে যাব।

পাইথন ২ এর প্রয়োজনীয়তা

  • নিশ্চিত করুন যে app.yaml ফাইলে এখনও grpcio এবং setuptools এই থার্ড-পার্টি বান্ডেল প্যাকেজগুলোর উল্লেখ রয়েছে।
  • নিশ্চিত করুন appengine_config.py এখনও pkg_resources এবং google.appengine.ext.vendor ব্যবহৃত হচ্ছে, যাতে অ্যাপটি থার্ড-পার্টি রিসোর্সের দিকে নির্দেশিত থাকে।
  • পরবর্তী বিভাগে requirements.txt আপডেট করার সময়, আপনাকে অবশ্যই google-cloud-firestore==1.9.0 ব্যবহার করতে হবে, কারণ এটিই পাইথন ফায়ারস্টোর ক্লায়েন্ট লাইব্রেরির সর্বশেষ 2.x-সামঞ্জস্যপূর্ণ সংস্করণ।
    • আপনার requirements.txt যদি google-cloud-core এর জন্য কোনো এন্ট্রি থাকে, তাহলে তা অপরিবর্তিত রাখুন।
    • lib ডিলিট করুন এবং pip install -t lib -r requirements.txt দিয়ে পুনরায় ইনস্টল করুন।

৪. কনফিগারেশন ফাইল আপডেট করুন (ক্লাউড ফায়ারস্টোর লাইব্রেরি যোগ করুন)

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

requirements.txt ফাইলে google-cloud-datastore লাইনটির পরিবর্তে google-cloud-firestore লিখুন, যাতে ফাইলটি দেখতে এইরকম হয়:

Flask==1.1.2
google-cloud-firestore==2.0.2

আমরা প্রতিটি লাইব্রেরির সর্বশেষ সংস্করণ ব্যবহার করার পরামর্শ দিই; উপরের সংস্করণ নম্বরগুলো এই লেখাটির সময়কার সর্বশেষ সংস্করণ। FINISH রিপো ফোল্ডারের কোড আরও ঘন ঘন আপডেট করা হয় এবং এতে আরও নতুন সংস্করণ থাকতে পারে।

অন্য কোনো কনফিগারেশন পরিবর্তন করা হয়নি, তাই app.yaml এবং templates/index.html অপরিবর্তিত থাকবে।

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

অ্যাপ্লিকেশন ফাইল একটাই, main.py , তাই এই অংশের সমস্ত পরিবর্তন শুধু সেই ফাইলটিকেই প্রভাবিত করে।

১. আমদানি

প্যাকেজ ইম্পোর্ট পরিবর্তন করা datastore থেকে firestore একটি সামান্য পরিবর্তন:

  • পূর্বে:
from google.cloud import datastore
  • পরে:
from google.cloud import firestore

২. ফায়ারস্টোর অ্যাক্সেস

Flask ইনিশিয়ালাইজ করার পর, আপনার Firestore ক্লায়েন্ট তৈরি করুন। উপরের মতো একই পরিবর্তন করুন, তবে তা ক্লায়েন্ট ইনিশিয়ালাইজেশনের জন্য:

  • পূর্বে:
app = Flask(__name__)
ds_client = datastore.Client()
  • পরে:
app = Flask(__name__)
fs_client = firestore.Client()

ক্লাউড এনডিবি থেকে ক্লাউড ডেটাস্টোরে মাইগ্রেশন করার মাধ্যমে, আপনি ক্লাউড ফায়ারস্টোরে যাওয়ার জন্য প্রয়োজনীয় কঠিন কাজটি ইতিমধ্যেই করে ফেলেছেন। ডেটাস্টোরে, আপনি সাধারণ প্রোপার্টি দিয়ে গঠিত এনটিটি (Entities) আকারে ডেটা রেকর্ড তৈরি করেন এবং সেগুলোকে কী (Key) দ্বারা গ্রুপ করেনফায়ারস্টোরের ডেটা রেকর্ডগুলো হলো ডকুমেন্ট, যা কী-ভ্যালু পেয়ার (key-value pairs) দিয়ে গঠিত এবং এগুলোকে কালেকশন (Collections) হিসেবে একসাথে গ্রুপ করা হয় । ডেটাস্টোর থেকে মাইগ্রেট করার জন্য আপনাকে এই পার্থক্যগুলো সম্পর্কে ভাবতে হবে, কারণ ডেটা রেকর্ড তৈরি করার সময় এবং সেগুলোর জন্য কোয়েরি করার সময় এই পার্থক্যগুলো দৃশ্যমান হবে। আপনার ডেটাস্টোর কোড কতটা জটিল, তার উপর নির্ভর করে ফলাফল ভিন্ন হতে পারে।

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

from datetime import datetime
from firestore.Query import DESCENDING

OCT1 = datetime(2020, 10, 1)
LIMIT = 10

ডেটাস্টোরের জন্য, ২০২০ সালের ১ অক্টোবরের পরের দশটি সাম্প্রতিকতম Visit এনটিটি অবরোহী ক্রমে কোয়েরি করা যাক:

query = ds_client.query(kind='Visit')
query.add_filter('timestamp', '>=', datetime(2020, 10, 1))
query.order = ['-timestamp']
return query.fetch(limit=LIMIT)

Visit কালেকশন থেকে ফায়ারস্টোরের জন্যও একই কাজ করা হচ্ছে:

query = fs_client.collection('Visit')
query.where('timestamp', '>=', datetime(2020, 10, 1))
query.order_by('timestamp', direction=DESCENDING)
return query.limit(LIMIT).stream()

নমুনা অ্যাপের কোয়েরিটি আরও সরল (এতে কোনো "WHERE" ক্লজ নেই)। পর্যালোচনার জন্য, এখানে ক্লাউড ডেটাস্টোরের কোডটি দেওয়া হলো:

  • পূর্বে:
def store_visit(remote_addr, user_agent):
    entity = datastore.Entity(key=ds_client.key('Visit'))
    entity.update({
        'timestamp': datetime.now(),
        'visitor': '{}: {}'.format(remote_addr, user_agent),
    })
    ds_client.put(entity)

def fetch_visits(limit):
    query = ds_client.query(kind='Visit')
    query.order = ['-timestamp']
    return query.fetch(limit=limit)

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

  • পরে:
def store_visit(remote_addr, user_agent):
    doc_ref = fs_client.collection('Visit')
    doc_ref.add({
        'timestamp': datetime.now(),
        'visitor': '{}: {}'.format(remote_addr, user_agent),
    })

def fetch_visits(limit):
    visits_ref = fs_client.collection('Visit')
    visits = (v.to_dict() for v in visits_ref.order_by('timestamp',
            direction=firestore.Query.DESCENDING).limit(limit).stream())
    return visits

মূল ফাংশন root() এবং index.html টেমপ্লেট ফাইল অপরিবর্তিত থাকবে। আপনার পরিবর্তনগুলো পুনরায় যাচাই করুন, সেভ করুন, ডিপ্লয় করুন এবং যাচাই করে নিন।

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

অ্যাপ্লিকেশন স্থাপন করুন

gcloud app deploy দিয়ে আপনার অ্যাপটি পুনরায় ডিপ্লয় করুন এবং অ্যাপটি ঠিকমতো কাজ করছে কিনা তা নিশ্চিত করুন। আপনার কোডটি এখন মডিউল ৬ রিপোজিটরিতে থাকা কোডের সাথে মিলে যাবে (অথবা আপনার পছন্দ অনুযায়ী ২.x সংস্করণের সাথেও মিলতে পারে)।

আপনি যদি আগের কোনো কোডল্যাব না করেই এই সিরিজে চলে আসেন, তাহলেও অ্যাপটির নিজের কোনো পরিবর্তন হয় না; এটি মূল ওয়েব পেজে ( / ) সমস্ত ভিজিট রেকর্ড করে এবং যথেষ্ট সংখ্যকবার সাইটটি ভিজিট করার পর এটি দেখতে এইরকম হয়ে যায়:

ভিজিটমি অ্যাপ

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

ঐচ্ছিক: পরিষ্কার করা

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

ঐচ্ছিক: অ্যাপটি নিষ্ক্রিয় করুন

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

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

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

এই টিউটোরিয়ালটি ছাড়াও, আরও বেশ কয়েকটি মাইগ্রেশন মডিউল কোডল্যাব রয়েছে যা আপনি বিবেচনা করতে পারেন:

  • মডিউল ৭: অ্যাপ ইঞ্জিন পুশ টাস্ক কিউ (যদি আপনি [push] টাস্ক কিউ ব্যবহার করেন তবে এটি আবশ্যক)
    • মডিউল ১ অ্যাপে অ্যাপ ইঞ্জিন taskqueue পুশ টাস্ক যোগ করে।
    • মডিউল ৮-এ ক্লাউড টাস্ক- এ স্থানান্তরের জন্য ব্যবহারকারীদের প্রস্তুত করে।
  • মডিউল ৪: ডকারের সাহায্যে ক্লাউড রানে মাইগ্রেট করুন
    • ডকারের সাহায্যে আপনার অ্যাপকে কন্টেইনারাইজ করে ক্লাউড রানে চালান।
    • এই মাইগ্রেশন আপনাকে পাইথন ২ ব্যবহার করার সুযোগ দেবে।
  • মডিউল ৫: ক্লাউড বিল্ডপ্যাকস সহ ক্লাউড রান-এ মাইগ্রেট করুন
    • Cloud Buildpacks ব্যবহার করে আপনার অ্যাপকে Cloud Run-এ চালানোর জন্য কন্টেইনারাইজ করুন।
    • আপনার ডকার, কন্টেইনার বা Dockerfile সম্পর্কে কিছুই জানার প্রয়োজন নেই।
    • আপনার অ্যাপটিকে অবশ্যই আগে থেকে পাইথন ৩-এ স্থানান্তরিত হতে হবে (বিল্ডপ্যাকস পাইথন ২ সমর্থন করে না)।

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

অ্যাপ ইঞ্জিন মাইগ্রেশন মডিউল কোডল্যাবস সমস্যা/মতামত

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

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

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

কোডল্যাব

পাইথন ২

পাইথন ৩

মডিউল ৩

( কোড )

কোড

মডিউল ৬

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

কোড

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

এই নির্দিষ্ট মাইগ্রেশন সম্পর্কিত অতিরিক্ত তথ্যসূত্র নিচে দেওয়া হলো: