পূর্ববর্তী একটি নিবন্ধে, আমরা আলোচনা করেছি কিভাবে আমরা একটি ফুল-স্ট্যাক Next.js অ্যাপে আপনার ব্যবহারকারীর কোটার অবস্থা সংরক্ষণ করতে Redis ব্যবহার করতে পারি। এটি করা আমাদের অ্যাপ্লিকেশনের কার্যকারিতা উন্নত করতে দেয়, কারণ রেডিস সাধারণভাবে একটি ডাটাবেসের চেয়ে অনেক দ্রুত।
Upstash Redis বিশেষ করে এই ব্যবহারের ক্ষেত্রে একটি দুর্দান্ত পছন্দ, কারণ এটি একটি সম্পূর্ণরূপে পরিচালিত Redis ডাটাবেস এবং HTTP এর মাধ্যমে অ্যাক্সেসযোগ্য। এর মানে হল আমরা ন্যূনতম লেটেন্সি সহ ব্যবহারকারীর কাছাকাছি আমাদের কোড চালানোর জন্য Vercel এর মত এজ রানটাইম ব্যবহার করতে পারি।
QStash কি?
QStash হল একটি HTTP ভিত্তিক মেসেজিং এবং সার্ভারহীন এবং প্রান্ত রানটাইম-এর জন্য নির্ধারিত সমাধান . অন্য কথায়, এটি আপনাকে HTTP অনুরোধ পাঠিয়ে CRON কাজ চালাতে অনুমতি দেয় .
CRON কাজগুলি একটি নির্দিষ্ট সময়ে চালানোর জন্য কাজগুলি নির্ধারণ করার একটি দুর্দান্ত উপায়৷ এই CRON কাজটি আপনার অ্যাপ্লিকেশন বা শেষ-ব্যবহারকারীদের কর্মক্ষমতা প্রভাবিত না করে যতটা সময় নিতে চায় ততটা সময় নিতে পারে৷
এই নিবন্ধে আমাদের CRON কাজের লক্ষ্য হল Redis থেকে আমাদের ডাটাবেসের সাথে আমাদের ব্যবহারকারীদের কোটার অবস্থা সিঙ্ক করা। আমরা এই কাজটিকে প্রতি ঘণ্টায় চালাব .
QStash এর সাথে CRON জব এন্ডপয়েন্ট তৈরি করা
এখানে পূর্ববর্তী নিবন্ধের একটি দ্রুত সংক্ষিপ্ত বিবরণ দেওয়া হল, কিভাবে আমরা Redis-এ আমাদের ব্যবহারকারীদের কোটার অবস্থা পরিচালনা করি:
// Key stored in Redis. A key is created for each user, and made unique by their ID.
const quotaKey = `user:${userId}:quota`;
// Call the INCR command to increment the value of the key by 1.
const quota = await redis.incr(quotaKey);
// If the value of the key is 1, it means the key has been created.
// We can set an expiration date of 24 hours to this key by using the EXPIRE command.
if (quota === 1) {
await redis.expire(quotaKey, 60 * 60 * 24);
}
এই কোডটি দেওয়া হলে, আমরা এখন QStash ব্যবহার করে একটি CRON জব এন্ডপয়েন্ট তৈরি করতে পারি। আমাদের CRON কাজের শেষ পয়েন্ট URL /api/cron/update-usage এ ট্রিগার করা হবে .
আসুন আমাদের Next.js এন্ডপয়েন্টের জন্য একটি নতুন ফাইল তৈরি করি:
touch pages/api/cron/update-usage.ts
তারপরে, আমরা নিশ্চিত করতে চাই যে শুধুমাত্র QStash এই শেষ পয়েন্টটি ট্রিগার করতে পারে, এটাই @upstash/qstash আমাদের জন্য হ্যান্ডেল. যদি আমরা এটি না করি, যে কেউ সম্ভাব্য করতে পারে৷ CRON জব এন্ডপয়েন্টকে ট্রিগার করে যা নিরাপত্তার সমস্যা হতে পারে।
চলুন @upstash/qstash ইনস্টল করি :
npm install @upstash/qstash আমরা এখন আমাদের CRON কাজের শেষ পয়েন্টের কোডে ফোকাস করতে পারি।
এখানে আমরা কি করব তার একটি দ্রুত সংক্ষিপ্ত বিবরণ:
-
SCANব্যবহার করে Redis থেকে সমস্ত ব্যবহারকারীর কোটা কী পান (পারফরম্যান্স কার্সার-ভিত্তিক পেজিনেশন) . -
SCANথেকে পাওয়া প্রতিটি কীর জন্য , একটিusersতৈরি করুন ব্যবহারকারীর আইডি এবং তাদের কোটা ধারণকারী বস্তুর বিন্যাস। -
users-এর ভিতরে প্রতিটি ব্যবহারকারীর জন্য একটি লেনদেন তৈরি করুন ডাটাবেসে তাদের কোটা আপডেট করার জন্য অ্যারে। এটি প্রিজমা ব্যবহার করে করা হয়। - এন্ডপয়েন্ট ফাংশনটি
verifySignatureদিয়ে রপ্তানি করুন@upstash/qstash/nextjsথেকে ফাংশন নিশ্চিত করতে শুধুমাত্র QStashই এন্ডপয়েন্ট ট্রিগার করতে পারে।
সম্পূর্ণ কোড এন্ডপয়েন্ট এখানে, আমি কোডের প্রতিটি দিক মন্তব্য করতে নিশ্চিত করেছি:
// /pages/api/cron/update-usage.ts
import type { NextApiRequest, NextApiResponse } from "next";
import { verifySignature } from "@upstash/qstash/nextjs";
import prisma from "@/lib/prisma";
// 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!,
});
// Required by `@upstash/qstash`.
export const config = { api: { bodyParser: false } };
// Update the usage of every user by pulling the data from the Redis database into the Prisma database.
async function handler(req: NextApiRequest, res: NextApiResponse) {
// Contains all the keys found during the `SCAN`.
const keys: string[] = [];
// Current position of the cursor, updated after each `SCAN`.
let cursor = 0;
// Execute the cursor-based pagination using the `SCAN` command.
// Redis return `0` when the cursor is at the end of the pagination.
do {
const [nextCursor, newKeys] = await redis.scan(cursor, {
// Match the pattern of the keys we want to find, where `*` is a wildcard.
match: "user:*:quota",
// Limit the number of keys returned by the `SCAN` command.
count: 10,
});
cursor = nextCursor;
keys.push(...newKeys);
} while (cursor !== 0);
// Array of objects containing the user's ID and their quota.
const users: { id: number; quota: number }[] = [];
// Get the usage of each user from Redis based on the keys found.
for (const key of keys) {
// A key should be in the format `user:${id}:quota`. Split the key to get the ID.
const id = key.split(":")[1];
// Get the current quota of the user using the `GET` command.
const quota = await redis.get(`user:${id}:quota`);
users.push({ id: parseInt(id, 10), quota });
}
// Create a transaction for each user to update their quota in the database.
const promises = users.map((user) =>
prisma.user.update({
where: { id: user.id },
data: { quota: user.quota },
}),
);
// Run all transactions.
await Promise.all(promises);
return res.status(200).json({ message: "OK" });
}
// Export the handler with the `verifySignature` function to make sure only
// QStash can authenticate to trigger the CRON job.
export default verifySignature(handler); সবচেয়ে কঠিন অংশ সম্পন্ন হয়েছে!
QStash সেট আপ করা হচ্ছে
এখন আমাদের কোড পুশ করার আগে, আমাদের QStash সেটআপ করতে হবে। QStash একটি উদার বিনামূল্যের স্তর প্রদান করে, আমরা প্রতিদিন 500টি পর্যন্ত অনুরোধ ব্যবহার করতে পারি .
আপনার Upstash কনসোলের ভিতরে লগইন করুন এবং QStash-এ ক্লিক করুন ট্যাব।
তারপর, আসুন অনুরোধ বিল্ডার ব্যবহার করে একটি নতুন নির্ধারিত CRON কাজ তৈরি করি৷ . স্বজ্ঞাত UI এর জন্য এটি খুবই সহজ ধন্যবাদ:

সূচি-এ ক্লিক করার পর বোতাম, যদি আপনি নীচে স্ক্রোল করেন, আপনি নির্ধারিত চাকরিতে আপনার CRON কাজ দেখতে পাবেন বিভাগ:

শেষ ধাপে, আমাদের 2টি পরিবেশ ভেরিয়েবল সেটআপ করতে হবে আমাদের Next.js অ্যাপ্লিকেশনে। সেই ভেরিয়েবলগুলি যোগ করা হবে যেখানে আমাদের Next.js অ্যাপ্লিকেশন হোস্ট করা হয়েছে, এই ক্ষেত্রে Vercel-এ।
অনুরোধ নির্মাতা-এ বিভাগে, 2টি পরিবেশের ভেরিয়েবল অনুলিপি করার জন্য প্রস্তুত:
QSTASH_CURRENT_SIGNING_KEYQSTASH_NEXT_SIGNING_KEY
ইনকামিং বার্তা প্রমাণীকরণের জন্য এগুলো প্রয়োজনীয়। অন্যথায় যে কেউ আপনার এন্ডপয়েন্টকে কল করতে সক্ষম হবে।

একবার আপনার কাছে সেই ভেরিয়েবলগুলি হয়ে গেলে, আপনি সেগুলিকে আপনার Vercel প্রকল্পে যুক্ত করতে পারেন৷
৷এটি করতে, আপনার Vercel প্রকল্পে যান, সেটিংস-এ ক্লিক করুন৷ এবং তারপরে এনভায়রনমেন্ট ভেরিয়েবলস-এ :

2টি এনভায়রনমেন্ট ভেরিয়েবল যোগ করার পর, আপনি এখন আপনার কোডটি পুশ করতে পারেন।
QStash পর্যায়ক্রমে CRON জব এন্ডপয়েন্ট ট্রিগার করবে এবং প্রতি ঘন্টায় প্রতিটি ব্যবহারকারীর ব্যবহার আপডেট করবে।
উপসংহার
Upstash সার্ভারহীন পরিবেশের জন্য অনেক সরঞ্জাম সরবরাহ করে। অনেক ব্যবহারের ক্ষেত্রে পারফরম্যান্ট এবং মাপযোগ্য অ্যাপ্লিকেশন তৈরি করতে আমরা QStash এবং Redis একসাথে ব্যবহার করতে পারি।
আপনি যদি এটিকে লাইভ দেখতে চান, একই সিস্টেম ফাস্টশীটে প্রয়োগ করা হয়েছে, একটি টুল যা আপনার স্প্রেডশীটগুলিকে একটি API-তে পরিণত করে৷