<पी> इस लेख में, मैं वर्सेल एज मिडलवेयर और @upstash/ratelimit लाइब्रेरी का उपयोग करके आपके वेब एप्लिकेशन में दर सीमित करने की प्रक्रिया के माध्यम से आपका मार्गदर्शन करूंगा। उत्तरार्द्ध दर सीमा डेटा के भंडारण और प्रबंधन के लिए बैकएंड पर रेडिस का उपयोग करता है। वर्सेल एज का उपयोग करने के लाभ
<पी> वर्सेल एज एक कंप्यूटिंग प्लेटफ़ॉर्म है जो उपयोगकर्ता के निकटतम स्थानों में गणना करता है। मैं वर्सेल एज मिडलवेयर का उपयोग करूंगा, जो अनुरोधों को बैकएंड तक पहुंचने से पहले ही रोक लेता है। मेरा मानना है कि यह कई कारणों से दर सीमित कार्यान्वयन के लिए आदर्श रूप से उपयुक्त है: - इसे आपके बैकएंड से अलग कर दिया गया है, जिससे आप ट्रैफ़िक को बैकएंड तक पहुंचने से पहले किनारे वाले स्थान पर रोक सकते हैं।
- यह तेज़ है और इसमें कोल्ड स्टार्ट की समस्या नहीं है, जिसके परिणामस्वरूप न्यूनतम ओवरहेड होता है।
- यह सर्वर रहित कार्यों की तुलना में अधिक लागत प्रभावी है।
@upstash/ratelimit क्यों?
- @upstash/ratelimit एक दर सीमित करने वाली लाइब्रेरी है जिसे विशेष रूप से एज फ़ंक्शंस के लिए डिज़ाइन और परीक्षण किया गया है।
- यह किनारे के स्थानों से इष्टतम विलंबता के लिए बहु-क्षेत्र रेडिस का समर्थन करता है।
- अपस्टैश रेडिस एकमात्र प्रबंधित रेडिस है जिसे इसके REST API की बदौलत एज फ़ंक्शंस से एक्सेस किया जा सकता है।
<पी> इतना कहने के साथ, आइए कार्यान्वयन शुरू करें: चरण 1:रेडिस सेटअप
<पी> अपस्टैश कंसोल या अपस्टैश सीएलआई पर एक रेडिस डेटाबेस बनाएं। UPSTASH_REDIS_REST_URL और UPSTASH_REDIS_REST_TOKEN अगले चरणों के लिए इसकी आवश्यकता होगी। <पी>
चरण 2:Next.js सेटअप
<पी> Next.js एप्लिकेशन बनाएं. (अन्य ढांचों के लिए इसे जांचें) npx create-next-app@latest --typescript
<पी> @upstash/ratelimit स्थापित करें: npm i @upstash/ratelimit
<पी> मिडिलवेयर.ts बनाएं (अपने प्रोजेक्ट फ़ोल्डर में शीर्ष स्तर): import { NextFetchEvent, NextRequest, NextResponse } from "next/server";
import { Ratelimit } from "@upstash/ratelimit";
import { Redis } from "@upstash/redis";
const redis = new Redis({
url: "https://us1-merry-snake-32728.upstash.io",
token: "AX_sAdsdfsgODM5ZjExZGEtMmmVjNmE345445kGVmZTk5MzQ=",
});
const ratelimit = new Ratelimit({
redis: redis,
limiter: Ratelimit.slidingWindow(5, "10 s"),
});
export default async function middleware(
request: NextRequest,
event: NextFetchEvent,
): Promise<Response | undefined> {
const ip = request.ip ?? "127.0.0.1";
const { success, pending, limit, reset, remaining } =
await ratelimit.limit(ip);
return success
? NextResponse.next()
: NextResponse.redirect(new URL("/blocked", request.url));
}
export const config = {
matcher: "/",
};
<पी> अपने रेडिस यूआरएल और टोकन को बदलना न भूलें। कोड slidingWindow का उपयोग करता है एल्गोरिदम और 10 सेकंड में एक ही आईपी से 5 अनुरोधों की अनुमति देता है। यदि आपके पास किसी उपयोगकर्ता के लिए अद्वितीय संपत्ति (उपयोगकर्ता आईडी, ईमेल आदि) है तो आप आईपी के बजाय इसका उपयोग कर सकते हैं। यदि अनुरोध दर सीमित है तो मिडलवेयर इसे blocked पर पुनर्निर्देशित करता है पेज. <पी> चलिए pages/blocked.tsx बनाते हैं : import styles from "@/styles/Home.module.css";
export default function Blocked() {
return (
<div>
<main className={styles.main}>
<h3>Access blocked.</h3>
</main>
</div>
);
}
<पी> बस इतना ही! अब आप ऐप को वर्सेल:vercel deploy पर तैनात कर सकते हैं पी> <पी> पृष्ठ को ताज़ा करें, आपको 3 बार के बाद अवरुद्ध पृष्ठ पर पुनः निर्देशित किया जाना चाहिए। कैशिंग के साथ कम रिमोट कॉल
<पी> प्रत्येक अनुरोध के साथ रिमोट कॉल करना कारगर नहीं है। @uptash/ratelimit पैकेज की एक उपयोगी विशेषता यह है कि यह डेटा को तब तक कैश करता है जब तक कि एज फ़ंक्शन "हॉट" है। इसका मतलब यह है कि डेटा केवल रेडिस से प्राप्त किया जाता है जब फ़ंक्शन "ठंडा" होता है, जिससे दूरस्थ कॉल की संख्या कम हो जाती है। कैशिंग को ratelimit घोषित करके लागू किया जा सकता है हैंडलर के बाहर ऑब्जेक्ट function middleware . दर सीमित एल्गोरिदम
<पी> उपरोक्त उदाहरण में हमने स्लाइडिंग विंडो एल्गोरिदम का उपयोग किया है। अपनी आवश्यकताओं के आधार पर, आप फिक्स्ड विंडो और लीकिंग बकेट एल्गोरिदम का उपयोग कर सकते हैं। यहां देखें मल्टी रीजन रेडिस
<पी> एज फ़ंक्शंस के प्रदर्शन को बेहतर बनाने के लिए विभिन्न क्षेत्रों में एकाधिक रेडिस डेटाबेस रखना समझ में आता है। जैसा कि यहां बताया गया है आप एकाधिक क्षेत्र रेडिस को कॉन्फ़िगर कर सकते हैं लिंक
<पी> Next.js (नॉन-एज) के साथ दर सीमित करना <पी> वर्सेल एज मिडलवेयर <पी> रेटलिमिटिंग एसडीकेपी>