শার্ড করা টাইমস্ট্যাম্প

কোনও কালেকশনে যদি ক্রমিক ইন্ডেক্স করা ভ্যালু সহ ডকুমেন্ট থাকে, Cloud Firestore তাহলে লেখার রেট প্রতি সেকেন্ডে ৫০০ বার লেখার মধ্যে সীমাবদ্ধ থাকে। এই পৃষ্ঠা এই সীমা অতিক্রম করার জন্য কীভাবে একটি ডকুমেন্ট ফিল্ড শার্ড করতে হয় তা বর্ণনা করে। প্রথমে, "সিকোয়েন্সিয়াল ইন্ডেক্স করা ফিল্ড" বলতে আমরা কী বুঝি তা সংজ্ঞায়িত করা যাক এবং এই সীমা কখন প্রযোজ্য হয় তা স্পষ্ট করা যাক।

সিকোয়েন্সিয়াল ইন্ডেক্স করা ফিল্ড

"ক্রমিক ইন্ডেক্স করা ফিল্ড" বলতে এমন যেকোনও ডকুমেন্টের সংগ্রহকে বোঝায় যাতে একটানা বৃদ্ধি বা হ্রাস পাওয়া ইন্ডেক্স করা ফিল্ড থাকে। অনেক ক্ষেত্রে, এর অর্থ হল একটি timestamp ফিল্ড, তবে ফিল্ডের ভ্যালু একভাবে বাড়তে বা কমতে থাকলে প্রতি সেকেন্ডে ৫০০ বার লেখার সীমা ট্রিগার হতে পারে।

যেমন, ইনডেক্স করা ফিল্ড userid সহ userটি ডকুমেন্টের সংগ্রহে এই সীমা প্রযোজ্য হয়, যদি অ্যাপটি এইভাবে userid ভ্যালু অ্যাসাইন করে:

  • 1281, 1282, 1283, 1284, 1285, ...

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

  • 100000, 100001, 100002, 100003, ...
  • 0, 1, 2, 3, ...

টাইমস্ট্যাম্প ফিল্ড শার্ডিং করা

ধরে নিন যে আপনার অ্যাপ একটি একঘেয়ে ক্রমবর্ধমান timestamp ফিল্ড ব্যবহার করে। আপনার অ্যাপ কোনও কোয়েরিতে timestamp ফিল্ড ব্যবহার না করলে, আপনি টাইমস্ট্যাম্প ফিল্ড ইন্ডেক্স না করে প্রতি সেকেন্ডে ৫০০টি লেখার সীমা সরিয়ে দিতে পারবেন। আপনার কোয়েরির জন্য timestamp ফিল্ডের প্রয়োজন হলে, শার্ডেড টাইমস্ট্যাম্প ব্যবহার করে আপনি সীমা সংক্রান্ত সমস্যা সমাধান করতে পারবেন:

  1. timestamp ফিল্ডের পাশে একটি shard ফিল্ড যোগ করুন। shard ফিল্ডের জন্য 1..nটি স্বতন্ত্র ভ্যালু ব্যবহার করুন। এটি সংগ্রহের জন্য লেখার সীমা বাড়িয়ে 500*n করে, তবে আপনাকে অবশ্যই nটি কোয়েরি একত্রিত করতে হবে।
  2. প্রতিটি ডকুমেন্টে shard ভ্যালু র‍্যান্ডমভাবে অ্যাসাইন করতে আপনার রাইট লজিক আপডেট করুন।
  3. শার্ড করা ফলাফল সেট অ্যাগ্রিগেট করতে আপনার কোয়েরি আপডেট করুন।
  4. shard ফিল্ড এবং timestamp ফিল্ড, উভয়ের জন্যই সিঙ্গল-ফিল্ড ইন্ডেক্স বন্ধ করুন। আগে থেকে থাকা কম্পোজিট ইন্ডেক্স মুছে দিন যাতে timestamp ফিল্ড আছে।
  5. আপনার আপডেট করা কোয়েরি সাপোর্ট করার জন্য নতুন কম্পোজিট ইন্ডেক্স তৈরি করুন। ইনডেক্সে ফিল্ডের ক্রম গুরুত্বপূর্ণ এবং shard ফিল্ডটি অবশ্যই timestamp ফিল্ডের আগে থাকতে হবে। timestamp ফিল্ড অন্তর্ভুক্ত আছে এমন যেকোনও ইনডেক্সে অবশ্যই shard ফিল্ড অন্তর্ভুক্ত থাকতে হবে।

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

নিচের উদাহরণ থেকে জানতে পারবেন কীভাবে timestamp ফিল্ড শার্ড করতে হয় এবং কীভাবে শার্ড করা ফলাফল সেট কোয়েরি করতে হয়।

ডেটা মডেল ও কোয়েরির উদাহরণ

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

Node.js
async function insertData() {
  const instruments = [
    {
      symbol: 'AAA',
      price: {
        currency: 'USD',
        micros: 34790000
      },
      exchange: 'EXCHG1',
      instrumentType: 'commonstock',
      timestamp: Timestamp.fromMillis(
          Date.parse('2019-01-01T13:45:23.010Z'))
    },
    {
      symbol: 'BBB',
      price: {
        currency: 'JPY',
        micros: 64272000000
      },
      exchange: 'EXCHG2',
      instrumentType: 'commonstock',
      timestamp: Timestamp.fromMillis(
          Date.parse('2019-01-01T13:45:23.101Z'))
    },
    {
      symbol: 'Index1 ETF',
      price: {
        currency: 'USD',
        micros: 473000000
      },
      exchange: 'EXCHG1',
      instrumentType: 'etf',
      timestamp: Timestamp.fromMillis(
          Date.parse('2019-01-01T13:45:23.001Z'))
    }
  ];

  const batch = fs.batch();
  for (const inst of instruments) {
    const ref = fs.collection('instruments').doc();
    batch.set(ref, inst);
  }

  await batch.commit();
}

এই অ্যাপ নিম্নলিখিত কোয়েরি চালায় এবং timestamp ফিল্ড অনুযায়ী সাজায়:

Node.js
function createQuery(fieldName, fieldOperator, fieldValue, limit = 5) {
  return fs.collection('instruments')
      .where(fieldName, fieldOperator, fieldValue)
      .orderBy('timestamp', 'desc')
      .limit(limit)
      .get();
}

function queryCommonStock() {
  return createQuery('instrumentType', '==', 'commonstock');
}

function queryExchange1Instruments() {
  return createQuery('exchange', '==', 'EXCHG1');
}

function queryUSDInstruments() {
  return createQuery('price.currency', '==', 'USD');
}
insertData()
    .then(() => {
      const commonStock = queryCommonStock()
          .then(
              (docs) => {
                console.log('--- queryCommonStock: ');
                docs.forEach((doc) => {
                  console.log(`doc = ${util.inspect(doc.data(), {depth: 4})}`);
                });
              }
          );
      const exchange1Instruments = queryExchange1Instruments()
          .then(
              (docs) => {
                console.log('--- queryExchange1Instruments: ');
                docs.forEach((doc) => {
                  console.log(`doc = ${util.inspect(doc.data(), {depth: 4})}`);
                });
              }
          );
      const usdInstruments = queryUSDInstruments()
          .then(
              (docs) => {
                console.log('--- queryUSDInstruments: ');
                docs.forEach((doc) => {
                  console.log(`doc = ${util.inspect(doc.data(), {depth: 4})}`);
                });
              }
          );
      return Promise.all([commonStock, exchange1Instruments, usdInstruments]);
    });

কিছু রিসার্চ করার পরে, আপনি নির্ধারণ করেন যে অ্যাপটি প্রতি সেকেন্ডে ১,০০০ থেকে ১,৫০০টি ইনস্ট্রুমেন্ট আপডেট পাবে। এটি প্রতি সেকেন্ডে ৫০০টি লেখার সীমা অতিক্রম করে, যা ইনডেক্স করা টাইমস্ট্যাম্প ফিল্ড সহ ডকুমেন্ট থাকা কালেকশনের জন্য অনুমোদিত। রাইট থ্রুপুট বাড়াতে, আপনার ৩টি শার্ড ভ্যালু প্রয়োজন, MAX_INSTRUMENT_UPDATES/500 = 3। এই উদাহরণে শার্ড ভ্যালু x, y এবং z ব্যবহার করা হয়েছে। এছাড়াও, আপনার শার্ড ভ্যালুর জন্য সংখ্যা বা অন্যান্য অক্ষর ব্যবহার করতে পারেন।

শার্ড ফিল্ড যোগ করা হচ্ছে

আপনার ডকুমেন্টে shard ফিল্ড যোগ করুন। shard ফিল্ডের ভ্যালু x, y বা z-এ সেট করুন, যা কালেকশনে লেখার সীমা প্রতি সেকেন্ডে ১,৫০০ বার লেখার সমান করে দেয়।

Node.js
// Define our 'K' shard values
const shards = ['x', 'y', 'z'];
// Define a function to help 'chunk' our shards for use in queries.
// When using the 'in' query filter there is a max number of values that can be
// included in the value. If our number of shards is higher than that limit
// break down the shards into the fewest possible number of chunks.
function shardChunks() {
  const chunks = [];
  let start = 0;
  while (start < shards.length) {
    const elements = Math.min(MAX_IN_VALUES, shards.length - start);
    const end = start + elements;
    chunks.push(shards.slice(start, end));
    start = end;
  }
  return chunks;
}

// Add a convenience function to select a random shard
function randomShard() {
  return shards[Math.floor(Math.random() * Math.floor(shards.length))];
}
async function insertData() {
  const instruments = [
    {
      shard: randomShard(),  // add the new shard field to the document
      symbol: 'AAA',
      price: {
        currency: 'USD',
        micros: 34790000
      },
      exchange: 'EXCHG1',
      instrumentType: 'commonstock',
      timestamp: Timestamp.fromMillis(
          Date.parse('2019-01-01T13:45:23.010Z'))
    },
    {
      shard: randomShard(),  // add the new shard field to the document
      symbol: 'BBB',
      price: {
        currency: 'JPY',
        micros: 64272000000
      },
      exchange: 'EXCHG2',
      instrumentType: 'commonstock',
      timestamp: Timestamp.fromMillis(
          Date.parse('2019-01-01T13:45:23.101Z'))
    },
    {
      shard: randomShard(),  // add the new shard field to the document
      symbol: 'Index1 ETF',
      price: {
        currency: 'USD',
        micros: 473000000
      },
      exchange: 'EXCHG1',
      instrumentType: 'etf',
      timestamp: Timestamp.fromMillis(
          Date.parse('2019-01-01T13:45:23.001Z'))
    }
  ];

  const batch = fs.batch();
  for (const inst of instruments) {
    const ref = fs.collection('instruments').doc();
    batch.set(ref, inst);
  }

  await batch.commit();
}

শার্ড করা টাইমস্ট্যাম্প কোয়েরি করা হচ্ছে

shard ফিল্ড যোগ করার জন্য আপনাকে শার্ড করা ফলাফল অ্যাগ্রিগেট করতে কোয়েরি আপডেট করতে হবে:

Node.js
function createQuery(fieldName, fieldOperator, fieldValue, limit = 5) {
  // For each shard value, map it to a new query which adds an additional
  // where clause specifying the shard value.
  return Promise.all(shardChunks().map(shardChunk => {
        return fs.collection('instruments')
            .where('shard', 'in', shardChunk)  // new shard condition
            .where(fieldName, fieldOperator, fieldValue)
            .orderBy('timestamp', 'desc')
            .limit(limit)
            .get();
      }))
      // Now that we have a promise of multiple possible query results, we need
      // to merge the results from all of the queries into a single result set.
      .then((snapshots) => {
        // Create a new container for 'all' results
        const docs = [];
        snapshots.forEach((querySnapshot) => {
          querySnapshot.forEach((doc) => {
            // append each document to the new all container
            docs.push(doc);
          });
        });
        if (snapshots.length === 1) {
          // if only a single query was returned skip manual sorting as it is
          // taken care of by the backend.
          return docs;
        } else {
          // When multiple query results are returned we need to sort the
          // results after they have been concatenated.
          // 
          // since we're wanting the `limit` newest values, sort the array
          // descending and take the first `limit` values. By returning negated
          // values we can easily get a descending value.
          docs.sort((a, b) => {
            const aT = a.data().timestamp;
            const bT = b.data().timestamp;
            const secondsDiff = aT.seconds - bT.seconds;
            if (secondsDiff === 0) {
              return -(aT.nanoseconds - bT.nanoseconds);
            } else {
              return -secondsDiff;
            }
          });
          return docs.slice(0, limit);
        }
      });
}

function queryCommonStock() {
  return createQuery('instrumentType', '==', 'commonstock');
}

function queryExchange1Instruments() {
  return createQuery('exchange', '==', 'EXCHG1');
}

function queryUSDInstruments() {
  return createQuery('price.currency', '==', 'USD');
}
insertData()
    .then(() => {
      const commonStock = queryCommonStock()
          .then(
              (docs) => {
                console.log('--- queryCommonStock: ');
                docs.forEach((doc) => {
                  console.log(`doc = ${util.inspect(doc.data(), {depth: 4})}`);
                });
              }
          );
      const exchange1Instruments = queryExchange1Instruments()
          .then(
              (docs) => {
                console.log('--- queryExchange1Instruments: ');
                docs.forEach((doc) => {
                  console.log(`doc = ${util.inspect(doc.data(), {depth: 4})}`);
                });
              }
          );
      const usdInstruments = queryUSDInstruments()
          .then(
              (docs) => {
                console.log('--- queryUSDInstruments: ');
                docs.forEach((doc) => {
                  console.log(`doc = ${util.inspect(doc.data(), {depth: 4})}`);
                });
              }
          );
      return Promise.all([commonStock, exchange1Instruments, usdInstruments]);
    });

ইনডেক্সের সংজ্ঞা আপডেট করুন

প্রতি সেকেন্ডে ৫০০টি রাইট করার সীমাবদ্ধতা সরাতে, timestamp ফিল্ড ব্যবহার করে এমন আগে থেকে থাকা সিঙ্গল-ফিল্ড ও কম্পোজিট ইন্ডেক্স মুছে দিন।

কম্পোজিট ইন্ডেক্স সংক্রান্ত সংজ্ঞা মুছুন

Firebase কনসোল

  1. Firebase কনসোলে, ডেটাবেস ও স্টোরেজ > Firestore > কম্পোজিট ইন্ডেক্স ট্যাবে যান।

    কম্পোজিট ইনডেক্সে যান

  2. timestamp ফিল্ড আছে এমন প্রতিটি ইন্ডেক্সের জন্য, বোতামে ক্লিক করুন এবং মুছুন বিকল্পে ক্লিক করুন।

GCP Console

  1. Google Cloud কনসোলে, ডেটাবেস পৃষ্ঠায় যান।

    ডেটাবেসে যান

  2. ডেটাবেসের তালিকা থেকে প্রয়োজনীয় ডেটাবেস বেছে নিন।

  3. নেভিগেশন মেনুতে, ইনডেক্স বিকল্পে ক্লিক করুন এবং তারপরে কম্পোজিট ট্যাবে ক্লিক করুন।

  4. timestamp ফিল্ড আছে এমন ইন্ডেক্স সংজ্ঞা সার্চ করতে ফিল্টার ফিল্ড ব্যবহার করুন।

  5. এইসব ইন্ডেক্সের প্রতিটির জন্য, বোতামে ক্লিক করুন এবং মুছুন বিকল্পে ক্লিক করুন।

Firebase CLI

  1. আপনি Firebase CLI সেট-আপ না করে থাকলে, CLI ইনস্টল করতে এবং firebase init কমান্ড রান করতে এইসব নির্দেশাবলী অনুসরণ করুন। init কমান্ড চলাকালীন, Firestore: Deploy rules and create indexes for Firestore বেছে নিতে ভুলবেন না।
  2. সেট-আপ করার সময়, Firebase CLI আপনার বর্তমান ইন্ডেক্স সংজ্ঞা, ডিফল্ট হিসেবে, firestore.indexes.json নামের ফাইলে ডাউনলোড করে।
  3. timestamp ফিল্ড আছে এমন যেকোনও ইন্ডেক্স সংজ্ঞা সরিয়ে দিন, যেমন:

    {
    "indexes": [
      // Delete composite index definition that contain the timestamp field
      {
        "collectionGroup": "instruments",
        "queryScope": "COLLECTION",
        "fields": [
          {
            "fieldPath": "exchange",
            "order": "ASCENDING"
          },
          {
            "fieldPath": "timestamp",
            "order": "DESCENDING"
          }
        ]
      },
      {
        "collectionGroup": "instruments",
        "queryScope": "COLLECTION",
        "fields": [
          {
            "fieldPath": "instrumentType",
            "order": "ASCENDING"
          },
          {
            "fieldPath": "timestamp",
            "order": "DESCENDING"
          }
        ]
      },
      {
        "collectionGroup": "instruments",
        "queryScope": "COLLECTION",
        "fields": [
          {
            "fieldPath": "price.currency",
            "order": "ASCENDING"
          },
          {
            "fieldPath": "timestamp",
            "order": "DESCENDING"
          }
        ]
      },
     ]
    }
    
  4. আপনার আপডেট করা ইনডেক্স ডেফিনেশন ডিপ্লয় করুন:

    firebase deploy --only firestore:indexes
    

সিঙ্গেল-ফিল্ড ইনডেক্সের সংজ্ঞা আপডেট করুন

Firebase কনসোল

  1. Firebase কনসোলে, ডেটাবেস ও স্টোরেজ > Firestore > সিঙ্গেল ফিল্ড ইনডেক্স ট্যাবে যান।

    সিঙ্গেল ফিল্ড ইনডেক্সে যান

  2. ছাড় যোগ করুন বিকল্পে ক্লিক করুন।

  3. কালেকশন আইডি-এর জন্য, instruments লিখুন। ফিল্ড পাথ-এর জন্য, timestamp লিখুন।

  4. কোয়েরি স্কোপ বিকল্পের মধ্যে, কালেকশন এবং কালেকশন গ্রুপ, দুটিই বেছে নিন।

  5. পরবর্তী বিকল্পে ক্লিক করুন

  6. সব ইন্ডেক্স সেটিংস বন্ধ করা আছে বিকল্পে টগল করুন। সেভ করুন বিকল্পে ক্লিক করুন।

  7. shard ফিল্ডের জন্য একই ধাপগুলি আবার অনুসরণ করুন।

GCP Console

  1. Google Cloud কনসোলে, ডেটাবেস পৃষ্ঠায় যান।

    ডেটাবেসে যান

  2. ডেটাবেসের তালিকা থেকে প্রয়োজনীয় ডেটাবেস বেছে নিন।

  3. নেভিগেশন মেনুতে, ইনডেক্স বিকল্পে ক্লিক করুন এবং তারপরে সিঙ্গেল ফিল্ড ট্যাবে ক্লিক করুন।

  4. সিঙ্গেল ফিল্ড ট্যাবে ক্লিক করুন।

  5. ছাড় যোগ করুন বিকল্পে ক্লিক করুন।

  6. কালেকশন আইডি-এর জন্য, instruments লিখুন। ফিল্ড পাথ-এর জন্য, timestamp লিখুন।

  7. কোয়েরি স্কোপ বিকল্পের মধ্যে, কালেকশন এবং কালেকশন গ্রুপ, দুটিই বেছে নিন।

  8. পরবর্তী বিকল্পে ক্লিক করুন

  9. সব ইন্ডেক্স সেটিংস বন্ধ করা আছে বিকল্পে টগল করুন। সেভ করুন বিকল্পে ক্লিক করুন।

  10. shard ফিল্ডের জন্য একই ধাপগুলি আবার অনুসরণ করুন।

Firebase CLI

  1. আপনার ইন্ডেক্স সংজ্ঞার fieldOverrides বিভাগে নিম্নলিখিতগুলি যোগ করুন ফাইল:

    {
     "fieldOverrides": [
       // Disable single-field indexing for the timestamp field
       {
         "collectionGroup": "instruments",
         "fieldPath": "timestamp",
         "indexes": []
       },
     ]
    }
    
  2. আপনার আপডেট করা ইনডেক্স ডেফিনেশন ডিপ্লয় করুন:

    firebase deploy --only firestore:indexes
    

নতুন কম্পোজিট ইন্ডেক্স তৈরি করুন

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

সংগ্রহ ইন্ডেক্স করা ফিল্ড কোয়েরির সুযোগ
যন্ত্র শার্ড, price.currency, টাইমস্ট্যাম্প সংগ্রহ
যন্ত্র শার্ড, এক্সচেঞ্জ, টাইমস্ট্যাম্প সংগ্রহ
যন্ত্র শার্ড, instrumentType, টাইমস্ট্যাম্প সংগ্রহ

ত্রুটি মেসেজ

আপডেট করা কোয়েরি রান করে আপনি এইসব ইন্ডেক্স তৈরি করতে পারবেন।

প্রতিটি কোয়েরি একটি ত্রুটি মেসেজ দেখায়, যেখানে Firebase Console-এ প্রয়োজনীয় ইনডেক্স তৈরি করার লিঙ্ক থাকে।

Firebase CLI

  1. আপনার ইন্ডেক্স ডেফিনিশন ফাইলে নিম্নলিখিত ইন্ডেক্স যোগ করুন:

     {
       "indexes": [
       // New indexes for sharded timestamps
         {
           "collectionGroup": "instruments",
           "queryScope": "COLLECTION",
           "fields": [
             {
               "fieldPath": "shard",
               "order": "DESCENDING"
             },
             {
               "fieldPath": "exchange",
               "order": "ASCENDING"
             },
             {
               "fieldPath": "timestamp",
               "order": "DESCENDING"
             }
           ]
         },
         {
           "collectionGroup": "instruments",
           "queryScope": "COLLECTION",
           "fields": [
             {
               "fieldPath": "shard",
               "order": "DESCENDING"
             },
             {
               "fieldPath": "instrumentType",
               "order": "ASCENDING"
             },
             {
               "fieldPath": "timestamp",
               "order": "DESCENDING"
             }
           ]
         },
         {
           "collectionGroup": "instruments",
           "queryScope": "COLLECTION",
           "fields": [
             {
               "fieldPath": "shard",
               "order": "DESCENDING"
             },
             {
               "fieldPath": "price.currency",
               "order": "ASCENDING"
             },
             {
               "fieldPath": "timestamp",
               "order": "DESCENDING"
             }
           ]
         },
       ]
     }
    
  2. আপনার আপডেট করা ইনডেক্স ডেফিনেশন ডিপ্লয় করুন:

    firebase deploy --only firestore:indexes
    

সিকোয়েন্সিয়াল ইন্ডেক্স করা ফিল্ডের জন্য লেখার সীমা বোঝা

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

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

টাইমস্ট্যাম্প ফিল্ড শার্ডিং করার মাধ্যমে, আপনি Cloud Firestore-এর জন্য একাধিক ট্যাবলেট জুড়ে দক্ষতার সাথে কাজের লোড ভাগ করা সম্ভব করে তোলেন। টাইমস্ট্যাম্প ফিল্ডের ভ্যালু কাছাকাছি থাকলেও, কনক্যাটিনেট করা শার্ড ও ইন্ডেক্স ভ্যালু Cloud Firestore-কে ইন্ডেক্স এন্ট্রির মধ্যে পর্যাপ্ত জায়গা দেয় যাতে একাধিক ট্যাবলেটের মধ্যে এন্ট্রিগুলি ভাগ করা যায়।

এর পরে কী করতে হবে