এই আর্টিকেলে আমি PlanTripAI, একটি AI-চালিত ট্রিপ প্ল্যানিং স্টার্টআপের ডেভেলপমেন্টে Upstash-এর গুরুত্বপূর্ণ ভূমিকা অন্বেষণ করব। Upstash Redis ব্যবহারকারী অ্যাক্সেসের জন্য কি লাইসেন্স সংরক্ষণ এবং ট্রিপ কন্টেন্ট দক্ষতার সাথে সেভ ও ক্যাশ করার জন্য অত্যাবশ্যক ছিল। hơnন্তু, Upstash-এর Rate Limit ফিচার আমাদের সিস্টেম সুরক্ষায় জরুরি ভূমিকা পালন করে। এটি রিকোয়েস্ট ফ্রিকোয়েনسی ম্যানেজ করে, সম্ভাব্য সিকিউরিটি হুমকির বিরুদ্ধে রোবাস্ট প্রটেকশন দিয়ে ব্যবহারকারীদের জন্য স্মूद, অনব্যাহত সার্ভিস নিশ্চিত করে।
plantripai.com একটি AI-ভিত্তিক ট্রিপ প্ল্যানার যা ব্যবহারকারীর পছন্দ (ডেস্টিনেশন, থাকার দিন, ট্রাভেল স্টাইল, বাজেট) অনুযায়ী দ্রুত পার্সোনালাইজড ইটিনেরারি তৈরি করে। এটি অনলিমিটেড ইটিনেরারি ক্রিয়েশন এবং বিভিন্ন ডাউনলোড ফরম্যাট অফার করে।
- @upstash/redis
- @upstash/ratelimit
- next.js
কীভাবে কাজ করে
AI কোম্পানিগুলো সাধারণত ব্যবহারকারীদের প্রোডাক্ট ট্রাই করার একাধিক উপায় অফার করে। PlanTripAI-তে আমরা ফ্রিমিয়াম এবং পেড প্লান দুটোই অফার করি।
আমাদের ফ্রিমিয়াম (এবং সবচেয়ে জনপ্রিয়) প্ল্যানে: প্রতিবার কোনো ব্যবহারকারী ভ্যালিড লাইসেন্স ছাড়া ট্রিপ তৈরি করলে, একটি নতুন র্যান্ডম কি জেনারেট হয় এবং Redis hash-এ (redis.hset(trip:${key}, data)) সাথেই ট্রিপ কন্টেন্টসহ সংরক্ষিত হয়। এই কি ট্রিপের ডিটেইলস পেজে مؤقت অ্যাক্সেস দেয়। এক্সপায়ার হওয়ার পর ব্যবহারকারী সিদ্ধান্ত নিতে পারেন কি পেরমানেন্ট অ্যাক্সেস রাখবেন কিনা।
অতিরিক্তভাবে, ফ্রিমিয়াম ব্যবহারকারীদের জন্য রেট লিমিট (fixedWindow) ৩ রিকোয়েস্ট পার ১০ সেকেন্ড, যা অ্যাপ্লিকেশনে সম্ভাব্য আক্রমণ প্রতিরোধ করে।

পेड প্ল্যানের জন্য, ব্যবহারকারী পেমেন্ট গেটওয়ে মাধ্যমে কেনেন। সফল ট্রানজেকশনের পর পেমেন্ট গেটওয়ের ওয়েবহুক সাকসেস ইভেন্ট ইমিট করে, এবং একটি কি Redis-এ ভ্যালিড কি হিসেবে সংরক্ষিত হয় (redis.set(${licenseKey}, true))।
যখন কোনো ভ্যালিড লাইসেন্সহOLDER ট্রিপ তৈরি করে, তখনও র্যান্ডম কি জেনারেট হয় এবং Redis-এ সংরক্ষিত হয়। পাশাপাশি নতুন ট্রিপ তাদের ইউজার অবজেক্টে স্টোর হয় এবং লাইসেন্স কির সাথে লিংক করা হয়।
পেড ব্যবহারকারীদের ফ্রিমিয়াম ব্যবহারকারীদের চেয়ে বেশি উদার রেট লিমিট মেলে। এই উন্নত ফিচার Redis-এ ভ্যালিড কি চেক করে ডাইনামিক্যালি প্রদান করা হয়।

ট্রিপ ডেটা সংরক্ষণ করা
PlanTripAI ব্যবহারকারী-তৈরী ট্রিপ সংরক্ষণের জন্য Redis ব্যবহার করে। Redis আমাদের জন্য আইডিয়াল কারণ এটি একটি ফাস্ট key-value স্টোর। যেহেতু ট্রিপ একবার তৈরি হলে ইমিউটেবল, এবং হ্যাশ ব্যবহার করে মেটাডেটা কি ডেটার পাশাপাশি স্টোর করা যায়।
ট্রিপ ডেটা Redis hash-এ নিচের স্ট্রাকচারে থাকে:
{ "itinerary": [ { "day": "Day 1", "data": [...] } ], "info": "This itinerary is designed for a city explorer visiting Paris, France for 2 days.", "inputs": { "city": "Paris, France", "days": 2, "accommodation": "Paris France Hotel", "kind": "city explorer", "currency": "USD", "budget": 3000, "transportation": "bus" }, "createdAt": ..., "shareable": false }
Upstash Redis API over HTTP ব্যবহার করে ডেটা ফ্রি Redis ডেটাবেসে সংরক্ষিত হয়, যা দিনে ১০,০০০ রিকোয়েস্ট ফ্রি অফার করে, আমাদের প্রয়োজনের জন্য পর্যাপ্ত।
import { Redis } from "@upstash/redis"; const redis = new Redis({ url: "..." // UPSTASH_REDIS_REST_URL token: "..." // UPSTASH_REDIS_REST_TOKEN }); redis.hset(`trip:${id}`, data);
ভ্যালিড লাইসেন্স কি সংরক্ষণ করা
আগে বলা মতে, PlanTripAI-র সব ফিচার অ্যাক্সেসের একটি উপায় পেড সাবস্ক্রিপশন, যেখানে প্রতিটি পেড ইউজারকে একটি ভ্যালিড লাইসেন্স কি Redis-এ সংরক্ষিত করা হয়। Redis-এর কি-ভ্যালিউ ডেটাবেস হিসেবে দক্ষতা দেওয়ায় কুইক ভ্যালিডেশন চেকের জন্য এটি আইডিয়াল।
ইউজারকে ভ্যালিড চিহ্নিত করতে:
import { Redis } from "@upstash/redis"; const redis = new Redis({ url: "..." token: "..." }); await redis.set(licenseKey, true);
ইউজারের ভ্যালিডিটি ভেরিফাই করতে:
import { Redis } from "@upstash/redis"; const redis = new Redis({ url: "..." token: "..." }); const redisLicenseKey = await redis.get(licenseKey); const valid = Boolean(redisLicenseKey); if (!valid) { return new Response( JSON.stringify({ message: "The license key is invalid!" }), { status: 401, } ); } // সফল কোড এখানে...
রেট লিমিট বাস্তবায়ন করা
আমাদের অ্যাপ্লিকেশন সুরক্ষার একটি কি ফিচার হলো রেট লিমিট লজিক, যা Upstash Rate Limit দ্বারা সাপোর্টেড।詳細は こちら。 এই সার্ভিস ফ্রি এবং পেড উভয় ব্যবহারকারীর জন্য স্মूद এক্সপেরিয়েন্স মেইনটেইন করতে গুরুত্বপূর্ণ, যা ম্যালিশাস ইউজারদের আক্রমণ সফলভাবে থামিয়েছে পুরো অ্যাপ্লিকেশনকে প্রভাবিত না করে।
Next.js মিডলওয়্যার হিসেবে নিচের কোড স্নিপেট ব্যবহার করা হয়েছে। এটি ইউজার IP চেক করে এবং সাবসিকোয়েন্ট রিকোয়েস্ট প্রসিড করবে কিনা সেটি সিদ্ধান্ত নেয়।
import { NextResponse, type NextFetchEvent, type NextRequest, } from "next/server"; import { Ratelimit } from "@upstash/ratelimit"; import { Redis } from "@upstash/redis"; const cache = new Map(); const ratelimit = new Ratelimit({ redis: Redis.fromEnv(), limiter: Ratelimit.fixedWindow(3, "10s"), ephemeralCache: cache, analytics: true, }); export default async function middleware( request: NextRequest, event: NextFetchEvent ): Promise<Response | undefined> { const id = request.ip ?? "anonymous"; const blockeds = []; if (blockeds.includes(id.trim())) { return new NextResponse( JSON.stringify({ message: "Blocked :)" }), { status: 429, headers: { "Content-Type": "application/json" } } ); } const { success, pending, limit, reset, remaining } = await ratelimit.limit( id ); event.waitUntil(pending); request.headers.set("X-RateLimit-Limit", limit.toString()); request.headers.set("X-RateLimit-Remaining", remaining.toString()); request.headers.set("X-RateLimit-Reset", reset.toString()); return success ? NextResponse.next() : new NextResponse( JSON.stringify({ message: "Request cannot be processed! You sent too many requests in a given amount of time." }), { status: 429, headers: { "Content-Type": "application/json" } } ); } export const config = { matcher: ["/api/generate-trip", "/api/get-license/(.*)"], };
শেষ কথা
পড়ার জন্য ধন্যবাদ! PlanTripAI একটি সাইড প্রজেক্ট হিসেবে শুরু হয়েছিল, Upstash Redis এবং Next.js-কে SaaS ফ্রেমওয়ার্কে ইন্টিগ্রেট করার কৌতূহল থেকে। আশা করি এটি ইনফরমেটিভ এবং ইনসাইটফুল লেগেছে। আপনার প্রশ্ন বা ফিডব্যাক প্রশংসনীয়। Twitter-এ আমার সাথে কানেক্ট করতে পারেন।