এই নিবন্ধে, আমি এআই-চালিত ট্রিপ প্ল্যানিং স্টার্টআপ PlanTripAI-এর বিকাশে Upstash-এর মুখ্য ভূমিকা অন্বেষণ করি। ব্যবহারকারীর অ্যাক্সেসের জন্য কী লাইসেন্স সংরক্ষণ এবং ট্রিপের বিষয়বস্তু দক্ষতার সাথে সংরক্ষণ এবং ক্যাশে করার মতো প্রয়োজনীয় দিকগুলি পরিচালনা করার জন্য Upstash Redis ব্যবহার করা অত্যন্ত গুরুত্বপূর্ণ। উপরন্তু, Upstash এর রেট লিমিট বৈশিষ্ট্য আমাদের সিস্টেমকে সুরক্ষিত রাখতে একটি গুরুত্বপূর্ণ ভূমিকা পালন করে। এটি কার্যকরভাবে অনুরোধের ফ্রিকোয়েন্সিগুলি পরিচালনা করে, সম্ভাব্য নিরাপত্তা হুমকির বিরুদ্ধে শক্তিশালী সুরক্ষা প্রদান করে এবং আমাদের ব্যবহারকারীদের জন্য একটি মসৃণ, নিরবচ্ছিন্ন পরিষেবা নিশ্চিত করে৷
plantripai.com হল একটি AI-ভিত্তিক ট্রিপ প্ল্যানার যেটি দ্রুত গন্তব্য, থাকার সময়কাল, ভ্রমণ শৈলী এবং বাজেটের মতো ব্যবহারকারীর পছন্দের উপর ভিত্তি করে ব্যক্তিগতকৃত যাত্রাপথ তৈরি করে। এটি সীমাহীন ভ্রমণ পরিকল্পনা এবং বিভিন্ন ডাউনলোড ফর্ম্যাট অফার করে৷
- @upstash/redis
- @upstash/ratelimit
- next.js
এটি কিভাবে কাজ করে
এআই কোম্পানিগুলি সাধারণত ব্যবহারকারীদের তাদের পণ্যগুলি চেষ্টা করার জন্য একাধিক উপায় অফার করে। PlanTripAI-তে, আমরা ফ্রিমিয়াম এবং পেইড প্ল্যান উভয়ই প্রদান করি।
আমাদের ফ্রিমিয়ামে, এবং সবচেয়ে জনপ্রিয় প্ল্যানে:যখনই একজন ব্যবহারকারী বৈধ লাইসেন্স ছাড়াই একটি ট্রিপ তৈরি করেন, তখন একটি নতুন র্যান্ডম কী তৈরি হয় এবং একটি Redis হ্যাশ (redis.hset(trip:${key}, data)) এ সংরক্ষণ করা হয় , ভ্রমণ সামগ্রী সহ। এই কী ট্রিপের বিশদ পৃষ্ঠায় অস্থায়ী অ্যাক্সেস দেয়। একবার এই অ্যাক্সেসের মেয়াদ শেষ হয়ে গেলে, ব্যবহারকারী সিদ্ধান্ত নিতে পারেন যে ট্রিপে স্থায়ী অ্যাক্সেস বজায় রাখতে হবে কিনা।
অতিরিক্তভাবে, ফ্রিমিয়াম ব্যবহারকারীরা একটি হারের সীমা সাপেক্ষে (fixedWindow ) প্রতি 10 সেকেন্ডে 3টি অনুরোধ, যা অ্যাপ্লিকেশনটিতে সম্ভাব্য আক্রমণ প্রতিরোধে সহায়তা করে।

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

ট্রিপ ডেটা সংরক্ষণ করা হচ্ছে
PlanTripAI ব্যবহারকারীর তৈরি ট্রিপগুলি সঞ্চয় করতে Redis ব্যবহার করে। দ্রুত কী-মূল্যের দোকান হিসেবে এর দক্ষতার কারণে Redis আমাদের জন্য একটি আদর্শ পছন্দ। প্রদত্ত যে ট্রিপগুলি, একবার তৈরি হয়ে গেলে, অপরিবর্তনীয়, এবং হ্যাশের ব্যবহার আমাদের মূল ডেটার পাশাপাশি মেটাডেটা সংরক্ষণ করতে সক্ষম করে৷
ট্রিপ ডেটা রেডিস হ্যাশে নিম্নরূপ গঠন করা হয়েছে:
{
"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
} HTTP এর উপর Upstash Redis API ব্যবহার করে, ডেটা ফ্রি রেডিস ডাটাবেসে সংরক্ষিত হয়, যা বিনামূল্যে প্রতিদিন 10,000 অনুরোধ অফার করে, যা আমাদের প্রয়োজনের জন্য যথেষ্ট।
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: "..." // UPSTASH_REDIS_REST_URL
token: "..." // UPSTASH_REDIS_REST_TOKEN
});
await redis.set(licenseKey, true); একজন ব্যবহারকারীর বৈধতা যাচাই করতে, আমরা এই কমান্ডটি ব্যবহার করি:
import { Redis } from "@upstash/redis";
const redis = new Redis({
url: "..." // UPSTASH_REDIS_REST_URL
token: "..." // UPSTASH_REDIS_REST_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,
}
);
}
// successful code here...
হার সীমা বাস্তবায়ন
আমাদের অ্যাপ্লিকেশানকে সুরক্ষিত করার একটি মূল বৈশিষ্ট্য হল রেট লিমিট লজিক, আপস্ট্যাশ রেট লিমিট দ্বারা সমর্থিত। আরও তথ্য এখানে পাওয়া যাবে. সামগ্রিক অ্যাপ্লিকেশনকে প্রভাবিত না করেই দূষিত ব্যবহারকারীদের আক্রমণ সফলভাবে ব্যর্থ করে, বিনামূল্যে এবং অর্থপ্রদানকারী উভয় ব্যবহারকারীর জন্যই একটি বিরামহীন অভিজ্ঞতা বজায় রাখার জন্য এই পরিষেবাটি অত্যন্ত গুরুত্বপূর্ণ৷
নিচে একটি মিডলওয়্যার হিসেবে next.js ব্যবহার করে একটি কোড স্নিপেট দেওয়া হল। এই কোড ব্যবহারকারীর আইপি চেক পরিচালনা করতে সাহায্য করে এবং পরবর্তী অনুরোধগুলির সাথে এগিয়ে যাবে কিনা তা সিদ্ধান্ত নেয়৷
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";
// optional hard coded IPs
const blockeds = [];
if (blockeds.includes(id.trim())) {
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 একটি পার্শ্ব প্রকল্প হিসাবে শুরু হয়েছিল, একটি SaaS ফ্রেমওয়ার্কে Next.js-এর সাথে Upstash Redis একীভূত করার বিষয়ে আমার কৌতূহল থেকে জন্ম।
আমি আন্তরিকভাবে আশা করি আপনি এই তথ্যপূর্ণ এবং অন্তর্দৃষ্টিপূর্ণ খুঁজে পেয়েছেন. আপনার প্রশ্ন বা প্রতিক্রিয়া অত্যন্ত প্রশংসা করা হয়. যেকোনো প্রশ্ন বা মন্তব্যের জন্য টুইটারে আমার সাথে নির্দ্বিধায় সংযোগ করুন।