কম্পিউটার টিউটোরিয়াল

Upstash এবং Next.js এর সাথে আপনার SaaS এর জন্য একটি নির্ভরযোগ্য কোটা সিস্টেম তৈরি করুন

এই পোস্টে, আমরা আপনাকে দেখাব কিভাবে Upstash ব্যবহার করে SaaS অ্যাপ্লিকেশনের জন্য একটি কোটা সিস্টেম তৈরি করতে হয়, যা Next.js দিয়ে তৈরি। এবং প্রিজমা . আমরা একটি সাধারণ API তৈরি করতে Next.js API রুট ব্যবহার করব।

অনেক SaaS অ্যাপ্লিকেশনে, আপনি একটি কোটা সিস্টেমের সম্মুখীন হতে পারেন। এটি এমন একটি সিস্টেম যা একটি নির্দিষ্ট সময়ে ব্যবহারকারীর কতগুলি কাজ করতে পারে তা সীমিত করে৷

আমাদের উদাহরণে, একজন ব্যবহারকারী শুধুমাত্র প্রতি মাসে 1,000 API অনুরোধ পাঠাতে পারেন "ফ্রি"-এ পরিকল্পনা যদি ব্যবহারকারী 1,000টির বেশি API অনুরোধ পাঠানোর চেষ্টা করে, তাহলে অ্যাপ্লিকেশনটি ব্যবহারকারীকে আরও অনুরোধ পাঠানো থেকে ব্লক করবে।

সেই API অনুরোধগুলি একটি স্প্রেডশীটের বিষয়বস্তু পুনরুদ্ধার করতে এবং এটিকে JSON-এ পরিণত করতে ব্যবহৃত হয়। ফাস্টশীট এটিই করে, যেকোনো Google পত্রক স্প্রেডশীটকে JSON API-তে পরিণত করুন৷

Upstash এবং Next.js এর সাথে আপনার SaaS এর জন্য একটি নির্ভরযোগ্য কোটা সিস্টেম তৈরি করুন

ডাটাবেস স্কিমা সংজ্ঞায়িত করা

আগেই বলা হয়েছে, ডাটাবেসের সাথে ইন্টারঅ্যাক্ট করার জন্য আমরা প্রিজমাকে একটি ORM হিসেবে ব্যবহার করব। এখানে একটি User এর একটি উদাহরণ মডেল যা একটি কোটা সিস্টেম প্রয়োগ করে, সেইসাথে তার Spreadsheet স্প্রেডশীট সঞ্চয় করার জন্য মডেল :

model User {
 id Int @id @default(autoincrement())
 planId String @default("FREE")
 email String @unique
 quota Int @default(0)
 spreadsheets Spreadsheet[]
}
model Spreadsheet {
 id Int @id @default(autoincrement())
 userId Int
 user User @relation(fields: [userId], references: [id])
 content String
}
  • planId ক্ষেত্র হল ব্যবহারকারীর সদস্যতা নেওয়ার পরিকল্পনা৷
  • quota ক্ষেত্র হল বর্তমান মাসে ব্যবহারকারীর করা API অনুরোধের সংখ্যা।
  • Spreadsheet মডেল একটি স্প্রেডশীট প্রতিনিধিত্ব করে, যেটি একটি User এর সাথে সংযুক্ত .
  • A User একাধিক Spreadsheet থাকতে পারে এটির সাথে সংযুক্ত।

জিনিসগুলি সহজ রাখতে, আমরা শুধুমাত্র "FREE" পরিচালনা করব পরিকল্পনা, যা প্রতি মাসে 1,000 API অনুরোধকে অনুমতি দেয় .

ব্যবহারকারীর কোটা বৃদ্ধি

আমরা প্রতিবার ব্যবহারকারীর এপিআই অনুরোধ করার সময় ব্যবহারকারীর কোটা বাড়াতে চাই।

প্রথম নজরে, এটি করা সহজ এবং সোজা বলে মনে হচ্ছে। আমরা সহজভাবে ব্যবহারকারীর কোটা 1 দ্বারা বৃদ্ধি করতে পারি যতবার ব্যবহারকারী একটি API অনুরোধ করে আমাদের Next.js API রুটে:

// pages/api/spreadsheets/[id]/index.ts
import type { NextApiRequest, NextApiResponse } from "next";
 
const MAX_FREE_TIER_QUOTA = 1000;
 
export default async function handler(
 req: NextApiRequest,
 res: NextApiResponse,
) {
 // Get the ID of the spreadsheet from the URL.
 const { id } = req.params;
 
 // Get the spreadsheet and its associated user from the database.
 const spreadsheet = await prisma.spreadsheet.findUnique({
 where: { id: Number(id) },
 include: { user: true },
 });
 
 // Verify that the spreadsheet exists.
 if (!spreadsheet) {
 return res.status(404).json({ error: "Spreadsheet not found" });
 }
 
 // Verify that the user is not over the quota.
 if (spreadsheet.user.quota >= MAX_FREE_TIER_QUOTA) {
 return res.status(429).json({ error: "Quota exceeded" });
 }
 
 // Increase the user's quota by 1.
 await prisma.user.update({
 where: { id: spreadsheet.user.id },
 data: { quota: { increment: 1 } },
 });
 
 // Return the spreadsheet's content.
 return res.json({ content: spreadsheet.content });
}

তবে এই পদ্ধতির সাথে একটি সমস্যা আছে, এটি যতটা দ্রুত হওয়া উচিত তা নয়।

প্রকৃতপক্ষে, প্রতিটি API অনুরোধে ব্যবহারকারীর কোটা বাড়ানোর জন্য আমরা একটি ডাটাবেস লেনদেন তৈরি করছি .

আমরা ব্যবহারকারীর কোটা পেতে ডাটাবেস অ্যাক্সেস করি, কোটা 1 বৃদ্ধি করার জন্য একটি লেনদেন তৈরি করুন , এবং তারপর স্প্রেডশীট সামগ্রী পাঠান।

এটি অনেক কারণে সর্বোত্তম নয়:

  • আপনার ডাটাবেস ধীর হতে পারে, এটি আপনার প্রতিক্রিয়ার সময়কে ধীর করে দেবে।
  • আপনার ডাটাবেস আপনার সার্ভার থেকে অনেক দূরে হতে পারে, এটি আবার আপনার প্রতিক্রিয়ার সময়কে ধীর করে দেবে।
  • এই কোডটিকে এজ সামঞ্জস্যপূর্ণ করা কঠিন , আপনাকে বিশ্বজুড়ে একাধিক ডাটাবেস প্রতিলিপি তৈরি করতে হবে (এটি করা সহজ কাজ নয়!) .

ব্যবহারকারীর কোটা বাড়াতে Upstash ব্যবহার করে

এই সমস্যা সমাধানের জন্য, আমরা ব্যবহারকারীর কোটা বাড়ানোর জন্য Upstash Redis® ব্যবহার করব। Upstash Redis® হল একটি দ্রুত এবং নির্ভরযোগ্য Redis® ডাটাবেস, সার্ভারহীন পরিবেশের জন্য তৈরি ক্লাউডে হোস্ট করা, এজ (আপনার ব্যবহারকারীদের কাছাকাছি কোড চালান) .

আমরা INCR ব্যবহার করব ব্যবহারকারীর কোটা 1 দ্বারা বাড়ানোর জন্য Redis® কমান্ড। এই কমান্ডটি পারমাণবিক, যার মানে এটি শুধুমাত্র একবার কার্যকর করা হবে এবং এটি দ্রুত কার্যকর করা হবে।

এখানে আগের মতই কোড আছে, কিন্তু ব্যবহারকারীর কোটা পরিচালনা করতে Upstash Redis® ব্যবহার করে:

// pages/api/spreadsheets/[id]/index.ts
import type { NextApiRequest, NextApiResponse } from "next";
 
import { Redis } from "@upstash/redis";
 
const MAX_FREE_TIER_QUOTA = 1000;
 
// Generate an Upstash Redis instance using environment variables.
// Make sure those are defined in your .env file.
const redis = new Redis({
 url: process.env.UPSTASH_REDIS_REST_URL!,
 token: process.env.UPSTASH_REDIS_REST_TOKEN!,
});
 
export default async function handler(
 req: NextApiRequest,
 res: NextApiResponse,
) {
 // Get the ID of the spreadsheet from the URL.
 const { id } = req.params;
 
 // Get the spreadsheet and its associated user from the database.
 const spreadsheet = await prisma.spreadsheet.findUnique({
 where: { id: Number(id) },
 include: { user: true },
 });
 
 // Verify that the spreadsheet exists.
 if (!spreadsheet) {
 return res.status(404).json({ error: "Spreadsheet not found" });
 }
 
 // Redis quota key, unique for each user by its ID.
 const quotaKey = `user:${spreadsheet.user.id}:quota`;
 
 // Retrieve the user's quota from Redis.
 const quota = await redis.incr(quotaKey);
 
 // If the key did not exist before, the returned value will be 1
 // and we set the expiration to 1 day.
 if (quota === 1) {
 await redis.expire(quotaKey, 60 * 60 * 24);
 }
 
 // Verify that the user is not over the quota.
 if (quota > MAX_FREE_TIER_QUOTA) {
 return res.status(429).json({ error: "Quota exceeded" });
 }
 
 // Return the spreadsheet's content.
 return res.json({ content: spreadsheet.content });
}

Upstash Redis® ব্যবহার করা আপনার কোডকে সহজেই স্কেলযোগ্য করে তোলে, কারণ আপনি Upstash Redis® Edge-এর শক্তি ব্যবহার করতে পারেন আপনার ব্যবহারকারীদের কাছাকাছি আপনার কোড চালানোর জন্য।

উপসংহার

Upstash Redis® একটি সার্ভারহীন পরিবেশের জন্য একটি ক্যাশিং সিস্টেম প্রয়োগ করা খুব সহজ করে তোলে৷

আমরা এটি একটি কোটা সিস্টেম বাস্তবায়নের জন্য ব্যবহার করেছি কিন্তু মূল ধারণাটি অনেক বেশি ব্যবহারের ক্ষেত্রে প্রয়োগ করা যেতে পারে, যেমন আরও ডেটাবেস কোয়েরি ক্যাশ করা, বা একটি API অনুরোধের ফলাফল ক্যাশ করা৷

ক্যাশিংয়ের চূড়ান্ত লক্ষ্য হল আপনার APIকে দ্রুততর করা এবং কম সংস্থানগুলি ব্যবহার করার সম্ভাবনা বেশি করা (যেমন প্ল্যানেটস্কেল ডাটাবেস প্রশ্নগুলি পড়া/লেখা) .

ভবিষ্যতের একটি প্রবন্ধে, আমরা দেখব কিভাবে Upstash QStash ব্যবহার করে Redis® থেকে ব্যবহারকারীর কোটা পুনরুদ্ধার করতে হয় এবং ডাটাবেসে সংরক্ষণ করতে হয়, যাতে ব্যবহারকারীর কোটা সর্বদা আপ-টু-ডেট থাকে এবং হারিয়ে না যায়।

এটি লাইভ দেখুন

আপনি যদি এই ধরনের অপ্টিমাইজেশন লাইভ দেখতে চান, আপনি ফাস্টশীট চেক করতে পারেন , একটি API পরিষেবা যা আপনার Google পত্রককে কয়েকটি ক্লিকে একটি API-তে পরিণত করে৷ এটি একটি উদার বিনামূল্যের স্তরের সাথে ব্যবহার করা বিনামূল্যে৷


  1. m-ary গাছ

  2. অ্যান্ড্রয়েডে ইন্টেন্ট সার্ভিস থেকে কীভাবে ইউআই আপডেট করবেন?

  3. Redis ZREVRANGEBYLEX - কিভাবে desc মান পরিসীমা দ্বারা সাজানো সেটের উপাদানগুলি পেতে হয়

  4. HTML DOM getAttributeNode() পদ্ধতি