Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Redis

Upstash thúc đẩy tăng trưởng nhanh chóng cho PlanTripAI:Chiến lược chính và câu chuyện thành công

Trong bài viết này, tôi khám phá vai trò quan trọng của Upstash trong việc phát triển PlanTripAI, một công ty khởi nghiệp lập kế hoạch chuyến đi dựa trên AI. Việc sử dụng Upstash Redis rất quan trọng để quản lý các khía cạnh thiết yếu như lưu trữ các giấy phép chính để người dùng truy cập cũng như lưu và lưu vào bộ nhớ đệm nội dung chuyến đi một cách hiệu quả. Hơn nữa, tính năng Giới hạn tỷ lệ của Upstash đóng một vai trò quan trọng trong việc bảo vệ hệ thống của chúng tôi. Nó quản lý tần suất yêu cầu một cách hiệu quả, cung cấp khả năng bảo vệ mạnh mẽ trước các mối đe dọa bảo mật tiềm ẩn và đảm bảo dịch vụ suôn sẻ, không bị gián đoạn cho người dùng của chúng tôi.

plantripai.com là công cụ lập kế hoạch chuyến đi dựa trên AI, nhanh chóng tạo các hành trình được cá nhân hóa dựa trên sở thích của người dùng như điểm đến, thời gian lưu trú, phong cách du lịch và ngân sách. Nó cung cấp tính năng tạo hành trình không giới hạn và nhiều định dạng tải xuống khác nhau.

  • @upstash/redis
  • @upstash/ratelimit
  • next.js

Cách thức hoạt động

Các công ty AI thường cung cấp nhiều cách để người dùng dùng thử sản phẩm của họ. Tại PlanTripAI, chúng tôi cung cấp cả gói miễn phí và gói trả phí.

Trong gói freemium và phổ biến nhất của chúng tôi:Mỗi khi người dùng tạo một chuyến đi mà không có giấy phép hợp lệ, một khóa ngẫu nhiên mới sẽ được tạo và lưu trữ trong hàm băm Redis (redis.hset(trip:${key}, data)) , cùng với nội dung chuyến đi. Khóa này cấp quyền truy cập tạm thời vào trang chi tiết của chuyến đi. Khi quyền truy cập này hết hạn, người dùng có thể quyết định có duy trì quyền truy cập vĩnh viễn vào chuyến đi hay không.

Ngoài ra, người dùng freemium phải tuân theo giới hạn tỷ lệ (fixedWindow ) trong số 3 yêu cầu mỗi 10 giây, giúp ngăn chặn các cuộc tấn công tiềm ẩn vào ứng dụng.

Upstash thúc đẩy tăng trưởng nhanh chóng cho PlanTripAI:Chiến lược chính và câu chuyện thành công

Về gói trả phí, người dùng có thể mua sản phẩm thông qua cổng thanh toán. Sau khi giao dịch thành công, webhook của cổng thanh toán sẽ phát ra sự kiện thành công và khóa được lưu trữ trong Redis dưới dạng khóa hợp lệ (redis.set(${licenseKey}, true)) .

Khi người dùng có giấy phép hợp lệ tạo chuyến đi, khóa ngẫu nhiên vẫn được tạo và lưu trữ trong Redis. Ngoài ra, chuyến đi mới được lưu trữ trong đối tượng người dùng của họ và được liên kết với mã cấp phép của họ.

Người dùng trả phí được hưởng mức giới hạn hào phóng hơn so với người dùng freemium. Tính năng nâng cao này được cung cấp linh hoạt bằng cách kiểm tra khóa hợp lệ trong Redis.

Upstash thúc đẩy tăng trưởng nhanh chóng cho PlanTripAI:Chiến lược chính và câu chuyện thành công

Lưu trữ dữ liệu chuyến đi

PlanTripAI tận dụng Redis để lưu trữ các chuyến đi do người dùng tạo. Redis là một lựa chọn lý tưởng cho chúng tôi vì tính hiệu quả của nó như một kho lưu trữ khóa-giá trị nhanh. Vì các chuyến đi sau khi được tạo sẽ không thể thay đổi và việc sử dụng hàm băm cho phép chúng tôi lưu trữ siêu dữ liệu cùng với dữ liệu chính.

Dữ liệu chuyến đi được cấu trúc theo hàm băm Redis như sau:

{
 "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
}

Bằng cách sử dụng API Upstash Redis qua HTTP, dữ liệu được lưu trữ trong cơ sở dữ liệu Redis miễn phí, cung cấp miễn phí 10.000 yêu cầu mỗi ngày, quá đủ cho nhu cầu của chúng tôi.

import { Redis } from "@upstash/redis";
 
const redis = new Redis({
 url: "..." // UPSTASH_REDIS_REST_URL
 token: "..." // UPSTASH_REDIS_REST_TOKEN
});
 
redis.hset(`trip:${id}`, data);

Lưu trữ khóa cấp phép hợp lệ

Như đã đề cập trước đó, một cách để truy cập tất cả các tính năng của PlanTripAI là thông qua đăng ký trả phí, trong đó mỗi người dùng trả phí sẽ được cấp một khóa cấp phép hợp lệ được lưu trữ trong Redis. Thiết lập này lý tưởng để kiểm tra xác thực nhanh chóng, nhờ tính hiệu quả của Redis dưới dạng cơ sở dữ liệu khóa-giá trị.

Để đánh dấu người dùng là hợp lệ, chúng tôi thực hiện lệnh sau:

import { Redis } from "@upstash/redis";
 
const redis = new Redis({
 url: "..." // UPSTASH_REDIS_REST_URL
 token: "..." // UPSTASH_REDIS_REST_TOKEN
});
 
await redis.set(licenseKey, true);

Để xác minh tính hợp lệ của người dùng, chúng tôi sử dụng lệnh này:

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...
 

Thực hiện giới hạn tỷ lệ

Một tính năng chính trong việc bảo vệ ứng dụng của chúng tôi là logic giới hạn tốc độ, được hỗ trợ bởi Giới hạn tốc độ nâng cao. Thông tin thêm có thể được tìm thấy ở đây. Dịch vụ này rất quan trọng để duy trì trải nghiệm liền mạch cho cả người dùng miễn phí và người dùng trả phí, đồng thời ngăn chặn thành công các cuộc tấn công từ người dùng độc hại mà không ảnh hưởng đến ứng dụng tổng thể.

Dưới đây là đoạn mã sử dụng next.js làm phần mềm trung gian. Mã này giúp quản lý việc kiểm tra IP của người dùng và quyết định xem có tiếp tục các yêu cầu tiếp theo hay không.

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/(.*)"],
};

Lời cuối cùng

Cảm ơn bạn đã dành thời gian để đọc! PlanTripAI bắt đầu như một dự án phụ, xuất phát từ sự tò mò của tôi về việc tích hợp Upstash Redis với Next.js trong khung SaaS.

Tôi chân thành hy vọng bạn tìm thấy thông tin này đầy đủ thông tin và sâu sắc. Câu hỏi hoặc phản hồi của bạn được đánh giá cao. Vui lòng kết nối với tôi trên Twitter nếu có bất kỳ thắc mắc hoặc nhận xét nào.