ক্লাউড রান থেকে সম্পূর্ণরূপে পরিচালিত ডেটাবেসে সংযোগ করা হচ্ছে

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

এই ল্যাবে, আপনি ক্লাউড রান-এ চলমান অ্যাপ্লিকেশনগুলির (Go এবং Node.js) সাথে সার্ভারলেস ডেটাবেস (স্প্যানার এবং ফায়ারস্টোর) ইন্টিগ্রেট করবেন। সিম্বাল ইটস অ্যাপ্লিকেশনটিতে একাধিক সার্ভিস রয়েছে যা ক্লাউড রান-এ চলে। নিম্নলিখিত ধাপগুলিতে, আপনি ক্লাউড স্প্যানার রিলেশনাল ডেটাবেস এবং ক্লাউড ফায়ারস্টোর , একটি NoSQL ডকুমেন্ট ডেটাবেস, ব্যবহার করার জন্য সার্ভিসগুলি কনফিগার করবেন। ডেটা টিয়ার এবং অ্যাপ্লিকেশন রানটাইমের জন্য সার্ভারলেস প্রোডাক্ট ব্যবহার করলে আপনি সমস্ত ইনফ্রাস্ট্রাকচার ম্যানেজমেন্টের ঝামেলা থেকে মুক্ত থাকতে পারবেন, ফলে অতিরিক্ত কাজের চাপ নিয়ে চিন্তা না করে আপনার অ্যাপ্লিকেশন তৈরির উপর মনোযোগ দিতে পারবেন।

২. আপনি যা শিখবেন

এই ল্যাবে, আপনারা নিম্নলিখিত বিষয়গুলো করতে শিখবেন:

  • ইন্টিগ্রেট স্প্যানার
  • স্প্যানার পরিচালিত পরিষেবাগুলি সক্ষম করুন
  • কোডে একীভূত করুন
  • স্প্যানারের সাথে সংযোগকারী কোড স্থাপন করুন
  • ফায়ারস্টোর একীভূত করুন
  • ফায়ারস্টোর পরিচালিত পরিষেবাগুলি সক্রিয় করুন
  • কোডে একীভূত করুন
  • ফায়ারস্টোরের সাথে সংযোগ স্থাপনকারী কোড ডিপ্লয় করুন

৩. সেটআপ এবং প্রয়োজনীয়তা

স্ব-গতিতে পরিবেশ সেটআপ

  1. Google Cloud Console- এ সাইন-ইন করুন এবং একটি নতুন প্রজেক্ট তৈরি করুন অথবা বিদ্যমান কোনো প্রজেক্ট পুনরায় ব্যবহার করুন। যদি আপনার আগে থেকে Gmail বা Google Workspace অ্যাকাউন্ট না থাকে, তবে আপনাকে অবশ্যই একটি তৈরি করতে হবে।

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • প্রজেক্টের নামটি হলো এই প্রজেক্টের অংশগ্রহণকারীদের প্রদর্শিত নাম। এটি একটি ক্যারেক্টার স্ট্রিং যা গুগল এপিআই ব্যবহার করে না। আপনি যেকোনো সময় এটি আপডেট করতে পারেন।
  • প্রজেক্ট আইডি সমস্ত গুগল ক্লাউড প্রজেক্ট জুড়ে অনন্য এবং অপরিবর্তনীয় (একবার সেট করার পর এটি পরিবর্তন করা যায় না)। ক্লাউড কনসোল স্বয়ংক্রিয়ভাবে একটি অনন্য স্ট্রিং তৈরি করে; সাধারণত এটি কী তা নিয়ে আপনার মাথা ঘামানোর দরকার নেই। বেশিরভাগ কোডল্যাবে, আপনাকে আপনার প্রজেক্ট আইডি উল্লেখ করতে হবে (যা সাধারণত PROJECT_ID হিসাবে চিহ্নিত করা হয়)। তৈরি করা আইডিটি আপনার পছন্দ না হলে, আপনি এলোমেলোভাবে আরেকটি তৈরি করতে পারেন। বিকল্পভাবে, আপনি আপনার নিজের আইডি দিয়ে চেষ্টা করে দেখতে পারেন যে সেটি উপলব্ধ আছে কিনা। এই ধাপের পরে এটি পরিবর্তন করা যাবে না এবং প্রজেক্টের পুরো সময়কাল জুড়ে এটি অপরিবর্তিত থাকবে।
  • আপনার অবগতির জন্য জানানো যাচ্ছে যে, তৃতীয় একটি ভ্যালু রয়েছে, যা হলো প্রজেক্ট নম্বর , এবং কিছু এপিআই এটি ব্যবহার করে থাকে। ডকুমেন্টেশনে এই তিনটি ভ্যালু সম্পর্কে আরও বিস্তারিত জানুন।
  1. এরপর, ক্লাউড রিসোর্স/এপিআই ব্যবহার করার জন্য আপনাকে ক্লাউড কনসোলে বিলিং চালু করতে হবে। এই কোডল্যাবটি সম্পন্ন করতে খুব বেশি খরচ হবে না, এমনকি আদৌ কোনো খরচ নাও হতে পারে। এই টিউটোরিয়ালের পর বিলিং এড়াতে রিসোর্সগুলো বন্ধ করার জন্য, আপনি আপনার তৈরি করা রিসোর্সগুলো অথবা প্রজেক্টটি ডিলিট করে দিতে পারেন। নতুন গুগল ক্লাউড ব্যবহারকারীরা ৩০০ মার্কিন ডলারের ফ্রি ট্রায়াল প্রোগ্রামের জন্য যোগ্য।

সেটআপ পরিবেশ

  1. একটি প্রজেক্ট আইডি ভেরিয়েবল তৈরি করুন
export PROJECT_ID=$(gcloud config get-value project)
export PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format='value(projectNumber)')
export SPANNER_INSTANCE=inventory-instance
export SPANNER_DB=inventory-db
export REGION=us-east1
export SPANNER_CONNECTION_STRING=projects/$PROJECT_ID/instances/$SPANNER_INSTANCE/databases/$SPANNER_DB
  1. স্প্যানার, ক্লাউড রান, ক্লাউড বিল্ড এবং আর্টিফ্যাক্ট রেজিস্ট্রি এপিআই সক্রিয় করুন
gcloud services enable \
     compute.googleapis.com \
     spanner.googleapis.com \
     run.googleapis.com \
     cloudbuild.googleapis.com \
     artifactregistry.googleapis.com \
     firestore.googleapis.com \
     appengine.googleapis.com \
     artifactregistry.googleapis.com
  1. রিপোজিটরি ক্লোন করুন
git clone https://github.com/GoogleCloudPlatform/cymbal-eats.git
  1. ডিরেক্টরিতে প্রবেশ করুন
cd cymbal-eats/inventory-service/spanner

৪. একটি স্প্যানার ইনস্ট্যান্স তৈরি ও কনফিগার করুন

স্প্যানার হলো ইনভেন্টরি সার্ভিসেসের ব্যাকএন্ড রিলেশনাল ডেটাবেস। নিম্নলিখিত ধাপগুলোতে আপনি একটি স্প্যানার ইনস্ট্যান্স, ডেটাবেস এবং স্কিমা তৈরি করবেন।

একটি ইনস্ট্যান্স তৈরি করুন

  1. একটি ক্লাউড স্প্যানার ইনস্ট্যান্স তৈরি করুন
gcloud spanner instances create $SPANNER_INSTANCE --config=regional-${REGION} \
--description="Cymbal Menu Inventory" --nodes=1

উদাহরণ আউটপুট

Creating instance...done.   
  1. স্প্যানার ইনস্ট্যান্সটি সঠিকভাবে কনফিগার করা আছে কিনা তা যাচাই করুন।
gcloud spanner instances list

উদাহরণ আউটপুট

NAME: inventory-instance
DISPLAY_NAME: Cymbal Menu Inventory
CONFIG: regional-us-east1
NODE_COUNT: 1
PROCESSING_UNITS: 100
STATE: READY

একটি ডাটাবেস এবং স্কিমা তৈরি করুন

একটি নতুন ডেটাবেস তৈরি করুন এবং ডেটাবেস স্কিমা তৈরির জন্য গুগলের স্ট্যান্ডার্ড SQL-এর ডেটা ডেফিনিশন ল্যাঙ্গুয়েজ (DDL) ব্যবহার করুন।

  1. একটি DDL ফাইল তৈরি করুন
echo "CREATE TABLE InventoryHistory (ItemRowID STRING (36) NOT NULL, ItemID INT64 NOT NULL, InventoryChange INT64, Timestamp TIMESTAMP) PRIMARY KEY(ItemRowID)" >> table.ddl
  1. স্প্যানার ডাটাবেস তৈরি করুন
gcloud spanner databases create $SPANNER_DB \
--instance=$SPANNER_INSTANCE \
--ddl-file=table.ddl

উদাহরণ আউটপুট

Creating database...done.

ডাটাবেসের অবস্থা এবং স্কিমা যাচাই করুন

  1. ডাটাবেসের অবস্থা দেখুন
gcloud spanner databases describe $SPANNER_DB \
--instance=$SPANNER_INSTANCE

উদাহরণ আউটপুট

createTime: '2022-04-22T15:11:33.559300Z'
databaseDialect: GOOGLE_STANDARD_SQL
earliestVersionTime: '2022-04-22T15:11:33.559300Z'
encryptionInfo:
- encryptionType: GOOGLE_DEFAULT_ENCRYPTION
name: projects/cymbal-eats-7-348013/instances/menu-inventory/databases/menu-inventory
state: READY
versionRetentionPeriod: 1h
  1. ডাটাবেসের স্কিমা দেখুন
gcloud spanner databases ddl describe $SPANNER_DB \
--instance=$SPANNER_INSTANCE

উদাহরণ আউটপুট

CREATE TABLE InventoryHistory (
  ItemRowID STRING(36) NOT NULL,
  ItemID INT64 NOT NULL,
  InventoryChange INT64,
  TimeStamp TIMESTAMP,
) PRIMARY KEY(ItemRowID);

৫. স্প্যানার একত্রিত করা

এই অংশে, আপনি শিখবেন কিভাবে আপনার অ্যাপ্লিকেশনে স্প্যানার (Spanner) ইন্টিগ্রেট করতে হয়। এছাড়াও, SQL স্প্যানার ক্লায়েন্ট লাইব্রেরি , JDBC ড্রাইভার , R2DBC ড্রাইভার , REST API এবং RPC API প্রদান করে, যা আপনাকে যেকোনো অ্যাপ্লিকেশনে স্প্যানার ইন্টিগ্রেট করার সুযোগ দেয়।

পরবর্তী অংশে, আপনি স্প্যানারে ডেটা ইনস্টল, প্রমাণীকরণ এবং পরিবর্তন করার জন্য গো ক্লায়েন্ট লাইব্রেরি ব্যবহার করবেন।

ক্লায়েন্ট লাইব্রেরি ইনস্টল করা হচ্ছে

ক্লাউড স্প্যানার ক্লায়েন্ট লাইব্রেরি অ্যাপ্লিকেশন ডিফল্ট ক্রেডেনশিয়ালস (ADC) স্বয়ংক্রিয়ভাবে ব্যবহার করে আপনার সার্ভিস অ্যাকাউন্টের ক্রেডেনশিয়ালস খুঁজে বের করার মাধ্যমে ক্লাউড স্প্যানারের সাথে ইন্টিগ্রেশনকে আরও সহজ করে তোলে।

প্রমাণীকরণ সেট আপ করুন

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

তবে, ডিফল্ট সার্ভিস অ্যাকাউন্টের পরিবর্তে একটি ইউজার-ম্যানেজড সার্ভিস অ্যাকাউন্ট অ্যাসাইন করে একটি ডেডিকেটেড আইডেন্টিটি তৈরি করাই শ্রেয়।

  1. সার্ভিস অ্যাকাউন্টটিকে স্প্যানার ডেটাবেস অ্যাডমিন রোলটি প্রদান করুন।
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:$PROJECT_NUMBER-compute@developer.gserviceaccount.com" \
--role="roles/spanner.databaseAdmin"

উদাহরণ আউটপুট

Updated IAM policy for project [cymbal-eats-6422-3462].
[...]

ক্লায়েন্ট লাইব্রেরি ব্যবহার করে

স্প্যানার ক্লায়েন্ট লাইব্রেরিগুলো স্প্যানারের সাথে ইন্টিগ্রেশনের জটিলতাগুলো দূর করে এবং অনেক জনপ্রিয় প্রোগ্রামিং ভাষায় উপলব্ধ।

একটি স্প্যানার ক্লায়েন্ট তৈরি করুন

স্প্যানার ক্লায়েন্ট হলো ক্লাউড স্প্যানার ডেটাবেসে ডেটা পড়া এবং লেখার জন্য ব্যবহৃত একটি ক্লায়েন্ট। একটি ক্লায়েন্ট তার Close মেথডটি ছাড়া অন্য সব ক্ষেত্রে একই সাথে নিরাপদে ব্যবহার করা যায়।

নিচের কোড স্নিপেটটি একটি স্প্যানার ক্লায়েন্ট তৈরি করে।

main.go

var dataClient *spanner.Client
...
dataClient, err = spanner.NewClient(ctx, databaseName)

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

ডেটা পরিবর্তন করুন

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

এই ল্যাবে, আপনারা স্প্যানারে ডেটা পরিবর্তন করার জন্য মিউটেশন ব্যবহার করবেন।

স্প্যানারে মিউটেশন

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

main.go

m := []*spanner.Mutation{}

m = append(m, spanner.Insert(
        "inventoryHistory",
         inventoryHistoryColumns,
        []interface{}{uuid.New().String(), element.ItemID, element.InventoryChange, time.Now()}))

এই কোড অংশটি ইনভেন্টরি হিস্ট্রি টেবিলে একটি নতুন সারি যোগ করে।

স্থাপন এবং পরীক্ষা

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

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

ক্লাউড রান একটিমাত্র কমান্ডের মাধ্যমে স্বয়ংক্রিয়ভাবে আপনার কোড বিল্ড, পুশ এবং ডিপ্লয় করতে পারে। নিম্নলিখিত কমান্ডে, আপনি run সার্ভিসে deploy কমান্ডটি কল করবেন এবং চলমান অ্যাপ্লিকেশন দ্বারা ব্যবহৃত ভ্যারিয়েবলগুলো, যেমন আপনার পূর্বে তৈরি করা SPANNER_CONNECTION_STRING, পাস করবেন।

  1. টার্মিনাল খুলুন ক্লিক করুন
  2. ক্লাউড রানে ইনভেন্টরি পরিষেবাটি স্থাপন করুন
gcloud run deploy inventory-service \
    --source . \
    --region $REGION \
    --update-env-vars SPANNER_CONNECTION_STRING=$SPANNER_CONNECTION_STRING \
    --allow-unauthenticated \
    --project=$PROJECT_ID \
    --quiet

উদাহরণ আউটপুট

Service [inventory-service] revision [inventory-service-00001-sug] has been deployed and is serving 100 percent of traffic.
Service URL: https://inventory-service-ilwytgcbca-uk.a.run.app
  1. পরিষেবার URL সংরক্ষণ করুন
INVENTORY_SERVICE_URL=$(gcloud run services describe inventory-service \
  --platform managed \
  --region $REGION \
  --format=json | jq \
  --raw-output ".status.url")

ক্লাউড রান অ্যাপ্লিকেশনটি পরীক্ষা করুন

একটি আইটেম প্রবেশ করান

  1. ক্লাউডশেলে নিম্নলিখিত কমান্ডটি প্রবেশ করান।
POST_URL=$INVENTORY_SERVICE_URL/updateInventoryItem
curl -i -X POST ${POST_URL} \
--header 'Content-Type: application/json' \
--data-raw '[
    {
        "itemID": 1,
        "inventoryChange": 5
    }
]'

উদাহরণ আউটপুট

HTTP/2 200
access-control-allow-origin: *
content-type: application/json
x-cloud-trace-context: 10c32f0863d26521497dc26e86419f13;o=1
date: Fri, 22 Apr 2022 21:41:38 GMT
server: Google Frontend
content-length: 2

OK

একটি আইটেম সম্পর্কে জিজ্ঞাসা করুন

  1. ইনভেন্টরি পরিষেবা সম্পর্কে জিজ্ঞাসা করুন
GET_URL=$INVENTORY_SERVICE_URL/getAvailableInventory
curl -i ${GET_URL}

উদাহরণ প্রতিক্রিয়া

HTTP/2 200
access-control-allow-origin: *
content-type: text/plain; charset=utf-8
x-cloud-trace-context: b94f921e4c2ae90210472c88eb05ace8;o=1
date: Fri, 22 Apr 2022 21:45:50 GMT
server: Google Frontend
content-length: 166

[{"ItemID":1,"Inventory":5}]

৬. স্প্যানার ধারণা

ক্লাউড স্প্যানার ডিক্লারেটিভ SQL স্টেটমেন্ট ব্যবহার করে তার ডাটাবেসগুলোতে কোয়েরি করে। SQL স্টেটমেন্টগুলো ব্যবহারকারী কী চায় তা নির্দেশ করে, কিন্তু ফলাফল কীভাবে পাওয়া যাবে তা বর্ণনা করে না।

  1. টার্মিনালে, পূর্বে তৈরি করা রেকর্ডটি টেবিলের মধ্যে খোঁজার জন্য এই কমান্ডটি প্রবেশ করান।
gcloud spanner databases execute-sql $SPANNER_DB \
--instance=$SPANNER_INSTANCE \
--sql='SELECT * FROM InventoryHistory WHERE ItemID=1'

উদাহরণ আউটপুট

ItemRowID: 1
ItemID: 1
InventoryChange: 3
Timestamp: 

কোয়েরি এক্সিকিউশন প্ল্যান

কোয়েরি এক্সিকিউশন প্ল্যান হলো এমন একটি ধারাবাহিক ধাপ যা স্প্যানার ফলাফল পেতে ব্যবহার করে। একটি নির্দিষ্ট SQL স্টেটমেন্টের ফলাফল পাওয়ার একাধিক উপায় থাকতে পারে। কোয়েরি এক্সিকিউশন প্ল্যানগুলো কনসোল এবং ক্লায়েন্ট লাইব্রেরিতে পাওয়া যায়। স্প্যানার কীভাবে SQL কোয়েরি পরিচালনা করে তা দেখতে:

  1. কনসোলে, ক্লাউড স্প্যানার ইনস্ট্যান্স পেজটি খুলুন।
  2. ক্লাউড স্প্যানার ইনস্ট্যান্সগুলিতে যান
  3. ক্লাউড স্প্যানার ইনস্ট্যান্সের নামে ক্লিক করুন। ডেটাবেস বিভাগ থেকে, আপনি যে ডেটাবেসটি কোয়েরি করতে চান তা নির্বাচন করুন।
  4. কোয়েরিতে ক্লিক করুন।
  5. কোয়েরি এডিটরে নিম্নলিখিত কোয়েরিটি লিখুন।
SELECT * FROM InventoryHistory WHERE ItemID=1
  1. রান-এ ক্লিক করুন
  2. ব্যাখ্যায় ক্লিক করুন

ক্লাউড কনসোল আপনার কোয়েরির একটি ভিজ্যুয়াল এক্সিকিউশন প্ল্যান প্রদর্শন করে।

149f8bae468f8b34.png

কোয়েরি অপ্টিমাইজার

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

ক্লাউড স্প্যানার নতুন কোয়েরি অপটিমাইজার সংস্করণ হিসেবে অপটিমাইজার আপডেটগুলো প্রকাশ করে। ডিফল্টরূপে, প্রতিটি ডেটাবেস অপটিমাইজারের সর্বশেষ সংস্করণটি প্রকাশিত হওয়ার ৩০ দিনের আগে ব্যবহার করা শুরু করে না।

gcloud spanner-এ কোয়েরি চালানোর সময় ব্যবহৃত সংস্করণটি দেখতে, –query-mode ফ্ল্যাগটিকে PROFILE-এ সেট করুন।

  1. অপ্টিমাইজার সংস্করণ দেখতে নিম্নলিখিত কমান্ডটি প্রবেশ করান।
gcloud spanner databases execute-sql $SPANNER_DB --instance=$SPANNER_INSTANCE \
--query-mode=PROFILE --sql='SELECT * FROM InventoryHistory'

উদাহরণ আউটপুট

TOTAL_ELAPSED_TIME: 6.18 msecs
CPU_TIME: 5.17 msecs
ROWS_RETURNED: 1
ROWS_SCANNED: 1
OPTIMIZER_VERSION: 3
 RELATIONAL Distributed Union
 (1 execution, 0.11 msecs total latency)
 subquery_cluster_node: 1
    |
    +- RELATIONAL Distributed Union
    |  (1 execution, 0.09 msecs total latency)
    |  call_type: Local, subquery_cluster_node: 2
    |   |
    |   \- RELATIONAL Serialize Result
    |      (1 execution, 0.08 msecs total latency)
    |       |
    |       +- RELATIONAL Scan
    |       |  (1 execution, 0.08 msecs total latency)
    |       |  Full scan: true, scan_target: InventoryHistory, scan_type: TableScan
    |       |   |
    |       |   +- SCALAR Reference
    |       |   |  ItemRowID
    |       |   |
    |       |   +- SCALAR Reference
    |       |   |  ItemID
    |       |   |
    |       |   +- SCALAR Reference
    |       |   |  InventoryChange
    |       |   |
    |       |   \- SCALAR Reference
    |       |      Timestamp
    |       |
    |       +- SCALAR Reference
    |       |  $ItemRowID
    |       |
    |       +- SCALAR Reference
    |       |  $ItemID
    |       |
    |       +- SCALAR Reference
    |       |  $InventoryChange
    |       |
    |       \- SCALAR Reference
    |          $Timestamp
    |
    \- SCALAR Constant
       true

ItemRowID: 1
ItemID: 1
InventoryChange: 3
Timestamp:

অপ্টিমাইজার সংস্করণ আপডেট করুন

এই ল্যাবের সময় সর্বশেষ সংস্করণটি হলো সংস্করণ ৪। এরপর, আপনি কোয়েরি অপটিমাইজারের জন্য সংস্করণ ৪ ব্যবহার করতে স্প্যানার টেবিলটি আপডেট করবেন।

  1. অপ্টিমাইজার আপডেট করুন
gcloud spanner databases ddl update $SPANNER_DB \
--instance=$SPANNER_INSTANCE \
--ddl='ALTER DATABASE InventoryHistory
SET OPTIONS (optimizer_version = 4)'

উদাহরণ আউটপুট

Schema updating...done. 
  1. অপ্টিমাইজার সংস্করণ আপডেট দেখতে নিম্নলিখিত কমান্ডটি প্রবেশ করান।
gcloud spanner databases execute-sql $SPANNER_DB --instance=$SPANNER_INSTANCE \
--query-mode=PROFILE --sql='SELECT * FROM InventoryHistory'

উদাহরণ আউটপুট

TOTAL_ELAPSED_TIME: 8.57 msecs
CPU_TIME: 8.54 msecs
ROWS_RETURNED: 1
ROWS_SCANNED: 1
OPTIMIZER_VERSION: 4
[...]

মেট্রিক্স এক্সপ্লোরারে কোয়েরি অপ্টিমাইজার সংস্করণটি দেখুন

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

  1. ক্লাউড কনসোলে মনিটরিং-এ যান এবং বাম দিকের মেনু থেকে মেট্রিক্স এক্সপ্লোরার নির্বাচন করুন।
  2. রিসোর্স টাইপ ফিল্ডে ক্লাউড স্প্যানার ইনস্ট্যান্স নির্বাচন করুন।
  3. মেট্রিক ফিল্ডে, কোয়েরির সংখ্যা নির্বাচন করুন এবং প্রয়োগ করুন।
  4. Group By ফিল্ডে database, optimizer_version, এবং status নির্বাচন করুন।

581b859c25790b21.png

৭. একটি ফায়ারস্টোর ডেটাবেস তৈরি এবং কনফিগার করুন

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

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

6843abaf4263e112.png

৮. ফায়ারস্টোর কনসেপ্টস

ডেটা মডেল

একটি ফায়ারস্টোর ডেটাবেস কালেকশন এবং ডকুমেন্ট নিয়ে গঠিত।

b60acd63d4793a6c.png

নথি

প্রতিটি ডকুমেন্টে এক সেট কী-ভ্যালু পেয়ার থাকে। ফায়ারস্টোর ছোট ছোট ডকুমেন্টের বড় সংগ্রহ সংরক্ষণের জন্য বিশেষভাবে তৈরি।

5571cb2f261d2dbe.png

সংগ্রহ

আপনাকে অবশ্যই সমস্ত ডকুমেন্ট কালেকশনে সংরক্ষণ করতে হবে। ডকুমেন্টের মধ্যে সাব-কালেকশন এবং নেস্টেড অবজেক্ট থাকতে পারে, যার মধ্যে স্ট্রিং-এর মতো প্রিমিটিভ ফিল্ড বা লিস্টের মতো জটিল অবজেক্টও অন্তর্ভুক্ত।

5811378cb721e5ec.png

একটি ফায়ারস্টোর ডাটাবেস তৈরি করুন

  1. ফায়ারস্টোর ডাটাবেস তৈরি করুন
gcloud firestore databases create --location=$REGION

উদাহরণ আউটপুট

Success! Selected Google Cloud Firestore Native database for cymbal-eats-6422-3462

৯. আপনার অ্যাপ্লিকেশনে ফায়ারস্টোর সংযুক্ত করা

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

প্রমাণীকরণ সেট আপ করুন

  1. সার্ভিস অ্যাকাউন্টকে ডেটাস্টোর ব্যবহারকারীর ভূমিকা প্রদান করুন।
gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member="serviceAccount:$PROJECT_NUMBER-compute@developer.gserviceaccount.com" \
  --role="roles/datastore.user"

উদাহরণ আউটপুট

Updated IAM policy for project [cymbal-eats-6422-3462].

ফায়ারস্টোর নিরাপত্তা নিয়মাবলী

নিরাপত্তা নিয়মাবলী প্রবেশাধিকার নিয়ন্ত্রণ এবং তথ্য যাচাইকরণের জন্য একটি সুস্পষ্ট ও সহজবোধ্য বিন্যাস প্রদান করে।

  1. order-service/starter-code ডিরেক্টরিতে যান
cd ~/cymbal-eats/order-service
  1. ক্লাউড এডিটরে firestore.rules ফাইলটি খুলুন।
cat firestore.rules

ফায়ারস্টোর.নিয়মাবলী

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents { ⇐ All database
    match /{document=**} { ⇐ All documents
      allow read: if true; ⇐ Allow reads
    }
    match /{document=**} {
      allow write: if false; ⇐ Deny writes
    }
  }
}

সতর্কীকরণ: ফায়ারস্টোর স্টোরেজে প্রবেশাধিকার সীমিত রাখাই উত্তম। এই ল্যাবের উদ্দেশ্যে, সমস্ত রিড অনুমোদিত। এটি প্রোডাকশন কনফিগারেশন হিসেবে সুপারিশযোগ্য নয়।

ফায়ারস্টোর পরিচালিত পরিষেবাগুলি সক্রিয় করুন

  1. টার্মিনাল খুলুন ক্লিক করুন
  2. বর্তমান প্রজেক্ট আইডি দিয়ে .firebaserc ফাইলটি তৈরি করুন। ডিপ্লয় টার্গেটের সেটিংস আপনার প্রজেক্ট ডিরেক্টরিতে থাকা .firebaserc ফাইলে সংরক্ষিত থাকে।

firebaserc.tmpl

sed "s/PROJECT_ID/$PROJECT_ID/g" firebaserc.tmpl > .firebaserc
  1. ফায়ারবেস বাইনারি ডাউনলোড করুন
curl -sL https://firebase.tools | upgrade=true bash

উদাহরণ আউটপুট

-- Checking for existing firebase-tools on PATH...
Your machine already has firebase-tools@10.7.0 installed. Nothing to do.
-- All done!
  1. ফায়ারস্টোর নিয়মগুলো প্রয়োগ করুন।
firebase deploy 

উদাহরণ আউটপুট

=== Deploying to 'cymbal-eats-6422-3462'...

i  deploying firestore
i  cloud.firestore: checking firestore.rules for compilation errors...
✔  cloud.firestore: rules file firestore.rules compiled successfully
i  firestore: uploading rules firestore.rules...
✔  firestore: released rules firestore.rules to cloud.firestore

✔  Deploy complete!

Project Console: https://console.firebase.google.com/project/cymbal-eats-6422-3462/overview

ডেটা পরিবর্তন করুন

ফায়ারস্টোরে কালেকশন এবং ডকুমেন্ট স্বয়ংক্রিয়ভাবে তৈরি হয়ে যায়। কোনো কালেকশনের মধ্যে থাকা ডকুমেন্টে শুধু ডেটা অ্যাসাইন করুন। যদি কালেকশন বা ডকুমেন্ট কোনোটিই বিদ্যমান না থাকে, ফায়ারস্টোর তা তৈরি করে দেয়।

ফায়ারস্টোরে ডেটা যোগ করুন

ক্লাউড ফায়ারস্টোরে ডেটা লেখার বিভিন্ন উপায় রয়েছে:

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

পরবর্তী বিভাগে সেট মেথড ব্যবহার করে একটি ডকুমেন্ট তৈরি করার পদ্ধতি সম্পর্কে নির্দেশনা দেওয়া হবে।

একটি নথি সেট করুন

একটি ডকুমেন্ট তৈরি করতে set() মেথড ব্যবহার করুন। set() মেথডের মাধ্যমে তৈরি করা ডকুমেন্টটির জন্য আপনাকে অবশ্যই একটি আইডি নির্দিষ্ট করতে হবে।

নিচের কোড স্নিপেটটি দেখুন।

index.js

const orderDoc = db.doc(`orders/123`);
await orderDoc.set({
    orderNumber: 123,
    name: Anne,
    address: 555 Bright Street,
    city: Mountain View,
    state: CA,
    zip: 94043,
    orderItems: [id: 1],
    status: 'New'
  });

এই কোডটি ব্যবহারকারী-সৃষ্ট ডকুমেন্ট আইডি ১২৩ উল্লেখ করে একটি ডকুমেন্ট তৈরি করবে। আপনার হয়ে ফায়ারস্টোরকে একটি আইডি তৈরি করতে দেওয়ার জন্য, add() বা create() মেথড ব্যবহার করুন।

নথি আপডেট করুন

` update() মেথডটি আপনাকে সম্পূর্ণ ডকুমেন্টটি ওভাররাইট না করেই ডকুমেন্টের কিছু ফিল্ড আপডেট করার সুযোগ দেয়।

নিচের কোড স্নিপেটে, অর্ডার 123 আপডেট করা হয়েছে।

index.js

const orderDoc = db.doc(`orders/123`);
await orderDoc.update(name: "Anna");

নথি মুছে ফেলুন

ফায়ারস্টোরে আপনি কালেকশন, ডকুমেন্ট অথবা কোনো ডকুমেন্টের নির্দিষ্ট ফিল্ড ডিলিট করতে পারেন। কোনো ডকুমেন্ট ডিলিট করতে delete() মেথডটি ব্যবহার করুন।

নিচের কোড স্নিপেটটি অর্ডার 123 মুছে দেয়।

index.js

const orderDoc = db.doc(`orders/123`);
await orderDoc.delete();

১০. স্থাপন এবং পরীক্ষা

এই অংশে, আপনি অ্যাপ্লিকেশনটি ক্লাউড রান-এ ডেপ্লয় করবেন এবং ক্রিয়েট, আপডেট ও ডিলিট মেথডগুলো পরীক্ষা করবেন।

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

  1. ইনভেন্টরি সার্ভিসের সাথে সংযুক্ত করার জন্য URL-টি INVENTORY_SERVICE_URL ভেরিয়েবলে সংরক্ষণ করুন।
INVENTORY_SERVICE_URL=$(gcloud run services describe inventory-service \
 --region=$REGION \
 --format=json | jq \
 --raw-output ".status.url")
  1. অর্ডার পরিষেবাটি স্থাপন করুন
gcloud run deploy order-service \
  --source . \
  --platform managed \
  --region $REGION \
  --allow-unauthenticated \
  --project=$PROJECT_ID \
  --set-env-vars=INVENTORY_SERVICE_URL=$INVENTORY_SERVICE_URL \
  --quiet

উদাহরণ আউটপুট

[...]
Done.
Service [order-service] revision [order-service-00001-qot] has been deployed and is serving 100 percent of traffic.
Service URL: https://order-service-3jbm3exegq-uk.a.run.app

ক্লাউড রান অ্যাপ্লিকেশনটি পরীক্ষা করুন

একটি নথি তৈরি করুন

  1. পরীক্ষার জন্য অর্ডার সার্ভিস অ্যাপ্লিকেশনটির ইউআরএল একটি ভেরিয়েবলে সংরক্ষণ করুন।
ORDER_SERVICE_URL=$(gcloud run services describe order-service \
  --platform managed \
  --region $REGION \
  --format=json | jq \
  --raw-output ".status.url")
  1. একটি অর্ডার অনুরোধ তৈরি করুন এবং ফায়ারস্টোর ডেটাবেসে একটি নতুন অর্ডার পোস্ট করুন।
curl --request POST $ORDER_SERVICE_URL/order \
--header 'Content-Type: application/json' \
--data-raw '{
    "name": "Jane Doe",
         "email": "Jane.Doe-cymbaleats@gmail.com",
    "address": "123 Maple",
    "city": "Buffalo",
    "state": "NY",
    "zip": "12346",
    "orderItems": [
        {
            "id": 1
        }
    ]
}'

উদাহরণ আউটপুট

{"orderNumber":46429}

পরবর্তী ব্যবহারের জন্য অর্ডার নম্বরটি সংরক্ষণ করুন।

export ORDER_NUMBER=<value_from_output>

ফলাফল দেখুন

ফায়ারস্টোরে ফলাফল দেখুন

  1. ফায়ারস্টোর কনসোলে যান
  2. ডেটাতে ক্লিক করুন

465ceca6198b2b88.png

একটি নথি আপডেট করুন

জমা দেওয়া অর্ডারে পরিমাণ উল্লেখ করা হয়নি।

  1. রেকর্ডটি আপডেট করুন এবং একটি পরিমাণ কী-ভ্যালু পেয়ার যোগ করুন।
curl --location -g --request PATCH $ORDER_SERVICE_URL/order/${ORDER_NUMBER} \
--header 'Content-Type: application/json' \
--data-raw '{
"orderItems": [
        {   
            "id": 1,
            "quantity": 1   
        }
    ]
}'

উদাহরণ আউটপুট

{"status":"success"}

ফলাফল দেখুন

ফায়ারস্টোরে ফলাফল দেখুন

  1. ফায়ারস্টোর কনসোলে যান
  2. ডেটাতে ক্লিক করুন

cfcf78d200e15b84.png

একটি নথি মুছে ফেলুন

  1. ফায়ারস্টোর অর্ডার সংগ্রহ থেকে আইটেম ৪৬৪২৯ মুছে ফেলুন
curl --location -g --request DELETE $ORDER_SERVICE_URL/order/${ORDER_NUMBER}

ফলাফল দেখুন

  1. ফায়ারস্টোর কনসোলে যান
  2. ডেটাতে ক্লিক করুন

73e14d69211d1539.png

১১. অভিনন্দন!

অভিনন্দন, আপনি ল্যাবটি শেষ করেছেন!

এরপর কী:

Cymbal Eats-এর অন্যান্য কোডল্যাবগুলি অন্বেষণ করুন:

পরিষ্কার করা

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

প্রকল্পটি মুছে ফেলা হচ্ছে

বিলিং বন্ধ করার সবচেয়ে সহজ উপায় হলো টিউটোরিয়ালের জন্য তৈরি করা প্রজেক্টটি ডিলিট করে দেওয়া।