এই পোস্টে, আমরা আপনাকে দেখাব কীভাবে আপস্ট্যাশ ব্যবহার করে একটি SaaS অ্যাপ্লিকেশনের জন্য একটি কোটা সিস্টেম তৈরি করা যায়, যা Next.js এবং Prisma দিয়ে তৈরি। আমরা Next.js API রুট ব্যবহার করে একটি সিম্পল API তৈরি করব।
অনেক SaaS অ্যাপ্লিকেশনে, আপনি একটি কোটা সিস্টেমের সাথে মুখোমুখি হয়ে থাকতে পারেন। এটি একটি সিস্টেম যা একজন ব্যবহারকারী একটি নির্দিষ্ট সময়ে কতগুলো অ্যাকশন করতে পারবে সেটি লিমিট করে।
আমাদের উদাহরণে, একজন ব্যবহারকারী "Free" প্ল্যানে মাসে শুধু ১,০০০ API রিকোয়েস্ট পাঠাতে পারবে। যদি ব্যবহারকারী ১,০০০-এর বেশি API রিকোয়েস্ট পাঠাতে চায়, অ্যাপ্লিকেশন ব্যবহারকারীকে আরও রিকোয়েস্ট পাঠাতে ব্লক করবে।
এই API রিকোয়েস্টগুলো একটি স্প্রেডশিটের কন্টেন্ট রিট্রিভ করতে এবং এটি JSON-এ রূপান্তর করতে ব্যবহৃত হয়। এটি হলো fastsheet-এর কাজ, যেকোনো Google Sheets স্প্রেডশিটকে একটি JSON API-এ রূপান্তর করা।

ডেটাবেস স্কিমা সংজ্ঞায়িত করা
আগে বলা মত, আমরা ডেটাবেসের সাথে ইন্টারঅ্যাক্ট করার জন্য Prisma 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-এর সাথে সংযুক্ত।- একজন
User-এর একাধিকSpreadsheetলিংকড থাকতে পারে।
সহজ রাখতে, আমরা শুধু "FREE" প্ল্যান হ্যান্ডেল করব, যা মাসে ১,০০০ API রিকোয়েস্ট অনুমতি দেয়।
ব্যবহারকারীর কোটা বাড়ানো
আমরা চাই প্রতিবার ব্যবহারকারী API রিকোয়েস্ট করলে ব্যবহারকারীর কোটা ১ বাড়ে।
প্রথম নজরে, এটি সহজ এবং সহজলভ্য মনে হয়। আমরা সহজে ব্যবহারকারীর কোটা ১ বাড়াতে পারি প্রতিবার ব্যবহারকারী 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,
) {
// URL থেকে স্প্রেডশিটের আইডি পান।
const { id } = req.params;
// ডেটাবেস থেকে স্প্রেডশিট এবং এর সংশ্লিষ্ট ব্যবহারকারী পান।
const spreadsheet = await prisma.spreadsheet.findUnique({
where: { id: Number(id) },
include: { user: true },
});
// স্প্রেডশিটটি বিদ্যমান কিনা ভেরিফাই করুন।
if (!spreadsheet) {
return res.status(404).json({ error: "Spreadsheet not found" });
}
// ব্যবহারকারী কোটা অতিক্রম করেছে কিনা ভেরিফাই করুন।
if (spreadsheet.user.quota >= MAX_FREE_TIER_QUOTA) {
return res.status(429).json({ error: "Quota exceeded" });
}
// ব্যবহারকারীর কোটা ১ বাড়ান।
await prisma.user.update({
where: { id: spreadsheet.user.id },
data: { quota: { increment: 1 } },
});
// স্প্রেডশিটের কন্টেন্ট ফেরত দিন।
return res.json({ content: spreadsheet.content });
}
তবে এই পদ্ধতিতে একটি সমস্যা আছে, এটি যত দ্রুত হওয়া উচিত তত দ্রুত নয়।
সচমুচ, আমরা প্রতিটি API রিকোয়েস্টে ব্যবহারকারীর কোটা বাড়াতে একটি ডেটাবেস ট্রানজেকশন তৈরি করছি।
আমরা ডেটাবেস অ্যাক্সেস করি ব্যবহারকারীর কোটা পেতে, কোটা ১ বাড়াতে একটি ট্রানজেকশন তৈরি করি, এবং তারপর স্প্রেডশিট কন্টেন্ট পাঠাই।
এটি অনেক কারণে অপ্টিমাল নয়:
- আপনার ডেটাবেস ধীর হতে পারে, এটি আপনার রেসপন্স টাইম ধীর করবে।
- আপনার ডেটাবেস আপনার সার্ভার থেকে দূরে হতে পারে, এটি আবার আপনার রেসপন্স টাইম ধীর করবে।
- এই কোডকে Edge কম্প্যাটিবল বানানো কঠিন, আপনাকে সারা বিশ্বে একাধিক ডেটাবেস রেপ্লিকা তৈরি করতে হবে (যা সহজ কাজ নয়!)।
ব্যবহারকারীর কোটা বাড়াতে আপস্ট্যাশ ব্যবহার
এই সমস্যা সমাধান করার জন্য, আমরা আপস্ট্যাশ রেডিস® ব্যবহার করব ব্যবহারকারীর কোটা বাড়াতে। আপস্ট্যাশ রেডিস® একটি দ্রুত и নির্ভরযোগ্য রেডিস® ডেটাবেস, ক্লাউডে হোস্ট করা সার্ভারলেস এনভায়রনমেন্টের জন্য তৈরি, Edge-র জন্য রেডি (আপনার ব্যবহারকারীদের কাছাকাছি কোড চালান)।
আমরা রেডিস®-র INCR কমান্ড ব্যবহার করব ব্যবহারকারীর কোটা ১ বাড়াতে। এই কমান্ডটি অ্যাটমিক, অর্থাৎ এটি শুধু একবার এক্সিকিউট হবে, এবং এটি খুব দ্রুত এক্সিকিউট হবে।
এখানে আগের মতো একই কোড, কিন্তু ব্যবহারকারীর কোটা ম্যানেজ করতে আপস্ট্যাশ রেডিস® ব্যবহার করে:
// pages/api/spreadsheets/[id]/index.ts
import type { NextApiRequest, NextApiResponse } from "next";
import { Redis } from "@upstash/redis";
const MAX_FREE_TIER_QUOTA = 1000;
// এনভায়রনমেন্ট ভেরিয়েবল ব্যবহার করে একটি আপস্ট্যাশ রেডিস ইন্সট্যান্স জেনারেট করুন।
// নিশ্চিত করুন সেগুলো আপনার .env ফাইলে সংজ্ঞায়িত।
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,
) {
// URL থেকে স্প্রেডশিটের আইডি পান।
const { id } = req.params;
// ডেটাবেস থেকে স্প্রেডশিট এবং এর সংশ্লিষ্ট ব্যবহারকারী পান।
const spreadsheet = await prisma.spreadsheet.findUnique({
where: { id: Number(id) },
include: { user: true },
});
// স্প্রেডশিটটি বিদ্যমান কিনা ভেরিফাই করুন।
if (!spreadsheet) {
return res.status(404).json({ error: "Spreadsheet not found" });
}
// রেডিস কোটা কী, ব্যবহারকারীর আইডি দ্বারা প্রতিটি ব্যবহারকারীর জন্য ইউনিক।
const quotaKey = `user:${spreadsheet.user.id}:quota`;
// রেডিস থেকে ব্যবহারকারীর কোটা রিট্রিভ করুন।
const quota = await redis.incr(quotaKey);
// যদি কীটি আগেexist না করত, ফেরত আসা মান ১ হবে
// এবং আমরা এক্সপায়ারেশন ১ দিন সেট করি।
if (quota === 1) {
await redis.expire(quotaKey, 60 * 60 * 24);
}
// ব্যবহারকারী কোটা অতিক্রম করেছে কিনা ভেরিফাই করুন।
if (quota > MAX_FREE_TIER_QUOTA) {
return res.status(429).json({ error: "Quota exceeded" });
}
// স্প্রেডশিটের কন্টেন্ট ফেরত দিন।
return res.json({ content: spreadsheet.content });
}
আপস্ট্যাশ রেডিস® ব্যবহার করে আপনার কোড সহজে স্কেলযোগ্য হয়, কারণ আপনি আপস্ট্যাশ রেডিস® Edge-র শক্তি 활용 করে আপনার কোড আপনার ব্যবহারকারীদের কাছাকাছি चलाাতে পারেন।
উপসংহার
আপস্ট্যাশ রেডিস® একটি সার্ভারলেস এনভায়রনমেন্টের জন্য একটি ক্যাশিং সিস্টেম বাস্তবায়ন করা খুব সহজ করে তোলে।
আমরা এটি একটি কোটা সিস্টেম বাস্তবায়ন করতে ব্যবহার করেছি কিন্তু মূল আইডিয়াটি আরও অনেক ব্যবহারের ক্ষেত্রে প্রয়োগ করা যায়, যেমন আরও ডেটাবেস কোয়েরি ক্যাশ করা, বা একটি API রিকোয়েস্টের ফলাফল ক্যাশ করা।
ক্যাশিংয়ের চূড়ান্ত লক্ষ্য হলো আপনার API-কে দ্রুত এবং কম রিসোর্স 소비 করা (যেমন Planetscale ডেটাবেস রিড/রাইট কোয়েরি)।
একটি ভবিষ্যৎ আর্টিকেলে, আমরা দেখব কীভাবে আপস্ট্যাশ QStash ব্যবহার করে ব্যবহারকারীর কোটা রেডিস® থেকে নিয়ে ডেটাবেসে সংরক্ষণ করা যায়, যাতে ব্যবহারকারীর কোটা সবসময় আপ-টু-ডেট থাকে এবং হারিয়ে না যায়।
লাইভ দেখুন
আপনি যদি এই ধরনের অপ্টিমাইজেশন লাইভ দেখতে চান, আপনি fastsheet চেক আউট করতে পারেন, একটি API সার্ভিস যা আপনার Google Sheets কে কয়েক ক্লিকে একটি API-এ রূপান্তর করে। এটি উদার ফ্রি টিয়ারসহ ফ্রি ব্যবহার করা যায়।