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

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

অনুক্রমিক সূচিবদ্ধ ক্ষেত্র

"অনুক্রমিক সূচীকৃত ক্ষেত্র" মানে নথির যেকোন সংগ্রহ যাতে একঘেয়ে ক্রমবর্ধমান বা হ্রাস সূচক ক্ষেত্র থাকে। অনেক ক্ষেত্রে, এর মানে হল একটি timestamp ক্ষেত্র, কিন্তু যেকোন একঘেয়েভাবে বাড়তে বা হ্রাস করা ক্ষেত্রের মান প্রতি সেকেন্ডে 500 লেখার লেখার সীমা ট্রিগার করতে পারে।

উদাহরণস্বরূপ, সীমাটি সূচীযুক্ত ফিল্ড userid সহ user নথির সংগ্রহের ক্ষেত্রে প্রযোজ্য হয় যদি অ্যাপটি userid মান নির্ধারণ করে:

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

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

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

একটি টাইমস্ট্যাম্প ক্ষেত্র ভাগ করা হচ্ছে

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

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

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

নিম্নলিখিত উদাহরণগুলি দেখায় যে কীভাবে একটি 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]);
    });

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

একটি শার্ড ক্ষেত্র যোগ করা হচ্ছে

আপনার নথিতে একটি shard ক্ষেত্র যোগ করুন। shard ক্ষেত্রটিকে x , y , বা z মানগুলিতে সেট করুন যা সংগ্রহের লেখার সীমা প্রতি সেকেন্ডে 1,500 লেখায় উন্নীত করে৷

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]);
    });

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

প্রতি সেকেন্ডে 500 রাইট অপসারণ করতে, বিদ্যমান একক-ক্ষেত্র এবং যৌগিক সূচীগুলি মুছুন যা timestamp ক্ষেত্র ব্যবহার করে।

যৌগিক সূচক সংজ্ঞা মুছুন

ফায়ারবেস কনসোল

  1. Firebase কনসোলে ক্লাউড ফায়ারস্টোর কম্পোজিট ইনডেক্স পৃষ্ঠাটি খুলুন।

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

  2. timestamp ক্ষেত্র রয়েছে এমন প্রতিটি সূচকের জন্য, বোতামে ক্লিক করুন এবং মুছুন ক্লিক করুন।

GCP কনসোল

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

    ডাটাবেসে যান

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

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

  4. timestamp ক্ষেত্র রয়েছে এমন সূচক সংজ্ঞা অনুসন্ধান করতে ফিল্টার ক্ষেত্রটি ব্যবহার করুন।

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

ফায়ারবেস 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
    

একক-ক্ষেত্র সূচক সংজ্ঞা আপডেট করুন

ফায়ারবেস কনসোল

  1. Firebase কনসোলে ক্লাউড ফায়ারস্টোর সিঙ্গেল ফিল্ড ইনডেক্স পৃষ্ঠা খুলুন।

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

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

  3. সংগ্রহ আইডির জন্য, instruments লিখুন। ফিল্ড পাথের জন্য, timestamp লিখুন।

  4. ক্যোয়ারী সুযোগের অধীনে, সংগ্রহ এবং সংগ্রহ উভয় গ্রুপ নির্বাচন করুন।

  5. Next ক্লিক করুন

  6. সমস্ত সূচক সেটিংস অক্ষম এ টগল করুন। Save এ ক্লিক করুন।

  7. shard ক্ষেত্রের জন্য একই পদক্ষেপগুলি পুনরাবৃত্তি করুন।

GCP কনসোল

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

    ডাটাবেসে যান

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

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

  4. একক ক্ষেত্র ট্যাবে ক্লিক করুন।

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

  6. সংগ্রহ আইডির জন্য, instruments লিখুন। ফিল্ড পাথের জন্য, timestamp লিখুন।

  7. ক্যোয়ারী সুযোগের অধীনে, সংগ্রহ এবং সংগ্রহ উভয় গ্রুপ নির্বাচন করুন।

  8. Next ক্লিক করুন

  9. সমস্ত সূচক সেটিংস অক্ষম এ টগল করুন। Save এ ক্লিক করুন।

  10. shard ক্ষেত্রের জন্য একই পদক্ষেপগুলি পুনরাবৃত্তি করুন।

ফায়ারবেস 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 ক্ষেত্র থাকতে হবে। উদাহরণস্বরূপ, উপরের প্রশ্নগুলি সমর্থন করতে, নিম্নলিখিত সূচীগুলি যোগ করুন:

সংগ্রহ ক্ষেত্রগুলি সূচীকৃত প্রশ্নের সুযোগ
যন্ত্র shard, price.currency, টাইমস্ট্যাম্প সংগ্রহ
যন্ত্র shard, exchange, টাইমস্ট্যাম্প সংগ্রহ
যন্ত্র shard, instrumentType, টাইমস্ট্যাম্প সংগ্রহ

ভুল বার্তা

আপনি আপডেট করা প্রশ্নগুলি চালিয়ে এই সূচীগুলি তৈরি করতে পারেন।

প্রতিটি ক্যোয়ারী 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
    

সীমাবদ্ধ অনুক্রমিক সূচী ক্ষেত্রগুলির জন্য লেখা বোঝা

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

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

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

এরপর কি