<पी> पिछले लेख में, हमने चर्चा की थी कि हम आपके उपयोगकर्ता के कोटा की स्थिति को फुल-स्टैक नेक्स्ट.जेएस ऐप पर संग्रहीत करने के लिए रेडिस का उपयोग कैसे कर सकते हैं। ऐसा करने से हमें अपने एप्लिकेशन के प्रदर्शन में सुधार करने की अनुमति मिलती है, क्योंकि सामान्य तौर पर रेडिस डेटाबेस की तुलना में बहुत तेज़ है। <पी> अपस्टैश रेडिस विशेष रूप से इस उपयोग के मामले में एक बढ़िया विकल्प है, क्योंकि यह पूरी तरह से प्रबंधित रेडिस डेटाबेस है और HTTP के माध्यम से पहुंच योग्य है। इसका मतलब यह है कि हम अपने कोड को न्यूनतम विलंबता के साथ उपयोगकर्ता के करीब चलाने के लिए वर्सेल जैसे एज रनटाइम का भी उपयोग कर सकते हैं। QStash क्या है?
<पी> QStash सर्वर रहित और एज रनटाइम के लिए एक HTTP आधारित मैसेजिंग और शेड्यूलिंग समाधान है। . दूसरे शब्दों में, यह आपको HTTP अनुरोध भेजकर CRON नौकरियां चलाने की अनुमति देता है . <पी> सीआरओएन नौकरियां एक विशिष्ट समय पर चलने वाले कार्यों को शेड्यूल करने का एक शानदार तरीका है। यह CRON कार्य आपके एप्लिकेशन या अंतिम उपयोगकर्ताओं के प्रदर्शन को प्रभावित किए बिना चलने में जितना चाहे उतना समय ले सकता है। <पी> इस आलेख में हमारे सीआरओएन कार्य का लक्ष्य हमारे उपयोगकर्ताओं के कोटा की स्थिति को रेडिस से हमारे डेटाबेस में सिंक करना है। हम इस कार्य कोहर घंटे चलाएंगे . QStash के साथ CRON जॉब एंडपॉइंट बनाना
<पी> यहां पिछले लेख का एक त्वरित पुनर्कथन है कि हम रेडिस में अपने उपयोगकर्ताओं के कोटा की स्थिति को कैसे संभालते हैं: // 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 अनुरोधों तक का उपयोग कर सकते हैं . <पी> अपने अपस्टैश कंसोल के अंदर लॉगिन करें और QStash पर क्लिक करें टैब. <पी> फिर, चलिए रिक्वेस्ट बिल्डर का उपयोग करके एक नया शेड्यूल किया गया CRON जॉब बनाएं . सहज ज्ञान युक्त यूआई के लिए यह बहुत सरल है: <पी>
<पी> शेड्यूल पर क्लिक करने के बाद बटन, यदि आप नीचे स्क्रॉल करते हैं, तो आपको अनुसूचित नौकरियों पर अपना सीआरओएन कार्य दिखाई देगा। अनुभाग: <पी>
<पी> अंतिम चरण में, हमें 2 पर्यावरण चर सेटअप करने की आवश्यकता है हमारे Next.js एप्लिकेशन में। वे वेरिएबल वहां जोड़े जाएंगे जहां हमारा Next.js एप्लिकेशन होस्ट किया गया है, इस मामले में वर्सेल पर। <पी> अनुरोध बिल्डर में अनुभाग में, 2 पर्यावरण चर प्रतिलिपि बनाने के लिए तैयार हैं: QSTASH_CURRENT_SIGNING_KEY
QSTASH_NEXT_SIGNING_KEY
<पी> आने वाले संदेश को प्रमाणित करने के लिए ये आवश्यक हैं। अन्यथा कोई भी आपके समापन बिंदु पर कॉल करने में सक्षम होगा। <पी>
<पी> एक बार जब आपके पास वे वेरिएबल हों, तो आप उन्हें अपने वर्सेल प्रोजेक्ट में जोड़ सकते हैं। <पी> ऐसा करने के लिए, अपने वर्सेल प्रोजेक्ट पर जाएं, सेटिंग्स पर क्लिक करें और फिर पर्यावरण चर पर : <पी>
<पी> 2 पर्यावरण चर जोड़ने के बाद, अब आप अपना कोड पुश कर सकते हैं। <पी> QStash समय-समय पर CRON जॉब एंडपॉइंट को ट्रिगर करेगा और हर घंटे प्रत्येक उपयोगकर्ता के उपयोग को अपडेट करेगा। निष्कर्ष
<पी> अपस्टैश सर्वर रहित वातावरण के लिए बहुत सारे टूल प्रदान करता है। हम कई उपयोग के मामलों के लिए परफॉर्मेंट और स्केलेबल एप्लिकेशन बनाने के लिए QStash और Redis का एक साथ उपयोग कर सकते हैं। <पी> यदि आप इसे लाइव देखना चाहते हैं, तो वही सिस्टम फास्टशीट पर लागू किया गया है, एक उपकरण जो आपकी स्प्रेडशीट को एपीआई में बदल देता है।