مصطفی جعفرزاده
مصطفی جعفرزاده
خواندن ۴ دقیقه·۲ ماه پیش

مدیریت رزرو لحظه‌ای با به‌روزرسانی قیمت در سیستم‌های مشابه Airbnb


در سیستم‌های پیچیده‌ای مانند Airbnb که از مدل قیمت‌گذاری لحظه‌ای استفاده می‌شود، مدیریت قیمت‌ها در حین فرآیند رزرو یکی از چالش‌های اساسی است. برای جلوگیری از خطاهای ناشی از عدم تطابق قیمت‌ها و ایجاد تجربه کاربری مناسب، از روش‌های به‌روزرسانی لحظه‌ای قیمت و مدیریت همزمانی استفاده می‌شود. در ادامه به تشریح این فرآیند و پیاده‌سازی حرفه‌ای می‌پردازیم:

نکته: در تهیه مقاله از هوش مصنوعی کمک گرفته شده است

1. مدیریت قیمت با استفاده از Cache

استفاده از Cache برای ذخیره‌سازی موقت داده‌های مربوط به قیمت‌ها باعث می‌شود که درخواست‌های مکرر برای دریافت قیمت به پایگاه داده اصلی کاهش یابد و سیستم با سرعت بیشتری به درخواست‌ها پاسخ دهد. این روش کمک می‌کند تا داده‌های مربوط به قیمت به‌طور موقت ذخیره شوند و اگر قیمت در طول فرآیند رزرو تغییر کند، Cache به‌روزرسانی شود.

- عملکرد Cache: هنگام جستجوی اولیه توسط کاربر، قیمت فعلی از پایگاه داده دریافت و در Redis یا Memcached ذخیره می‌شود. اگر کاربر قصد نهایی‌سازی رزرو را داشته باشد، ابتدا Cache بررسی می‌شود تا تغییرات احتمالی در قیمت را به کاربر اطلاع دهد.

2. Database Callbacks برای به‌روزرسانی لحظه‌ای

سیستم‌هایی مانند Airbnb از Database Callbacks برای بررسی لحظه‌ای تغییرات در قیمت‌ها استفاده می‌کنند. قبل از تأیید نهایی رزرو، سیستم قیمت را از پایگاه داده بررسی می‌کند و در صورت تغییر، به کاربر اطلاع داده می‌شود که قیمت جدید را تأیید کند.

مثال پیاده‌سازی:

در مثال زیر از PostgreSQL و Redis برای ذخیره‌سازی موقت و مدیریت همزمانی داده‌ها استفاده شده است. این پیاده‌سازی به گونه‌ای طراحی شده که در صورت تغییر قیمت یا وضعیت نسخه (Version) رزرو، سیستم بلافاصله به کاربر اطلاع می‌دهد و از خطاهای احتمالی جلوگیری می‌کند.


const { Client } = require('pg'); // PostgreSQL client
const redis = require('redis');
const client = redis.createClient();
// راه‌اندازی اتصال به PostgreSQL
const pgClient = new Client({
connectionString: process.env.DATABASE_URL,
});
pgClient.connect();
// مرحله اول: بررسی وضعیت قیمت از Cache
async function checkPrice(bookingId, userPrice) {
const cachedPrice = await client.get(`price:${bookingId}`);
if (cachedPrice !== null) {
return parseFloat(cachedPrice);
}
// اگر در Cache نبود، از پایگاه داده بررسی شود
const { rows } = await pgClient.query('SELECT price, version FROM bookings WHERE id = $1', [bookingId]);
const { price, version } = rows[0];
// ذخیره قیمت در Cache
await client.set(`price:${bookingId}`, price, 'EX', 60); // زمان انقضاء 60 ثانیه
return { price, version };
}
// مرحله دوم: رزرو با استفاده از OCC (Optimistic Concurrency Control)
async function bookRoom(bookingId, userPrice, userVersion) {
const { price, version } = await checkPrice(bookingId);
// بررسی تغییر قیمت یا نسخه
if (price !== userPrice || version !== userVersion) {
throw new Error('The price or version has changed. Please confirm the new price.');
}
// شروع تراکنش برای رزرو
try {
await pgClient.query('BEGIN');
// بروزرسانی نسخه و قیمت نهایی
const newVersion = version + 1;
await pgClient.query(
'UPDATE bookings SET version = $1, status = $2 WHERE id = $3 AND version = $4',
[newVersion, 'BOOKED', bookingId, version]
);
await pgClient.query('COMMIT');
console.log('Booking successful!');
} catch (error) {
await pgClient.query('ROLLBACK');
throw new Error('Booking failed. Please try again.');
}
}
// اجرای نهایی فرآیند رزرو
async function processBooking(bookingId, userPrice, userVersion) {
try {
await bookRoom(bookingId, userPrice, userVersion);
} catch (error) {
console.error('Error:', error.message);
// اطلاع رسانی به کاربر درباره تغییرات
}
}


جزئیات فنی:


1. Cache:

- سیستم از Redis برای ذخیره‌سازی موقت قیمت‌ها استفاده می‌کند تا در صورت تغییرات لحظه‌ای، اطلاعات سریع‌تر در دسترس باشند و بار روی پایگاه داده اصلی کاهش یابد.

2. Optimistic Concurrency Control (OCC):

- این روش با بررسی نسخه‌های مختلف داده‌ها، از همزمانی و تناقض در اطلاعات جلوگیری می‌کند. اگر نسخه‌ای از داده‌ها قبل از تکمیل رزرو تغییر کند، سیستم خطا را گزارش می‌کند و کاربر باید دوباره قیمت جدید را تأیید کند.

3. Atomic Transactions:

- تمامی فرآیندهای رزرو در قالب تراکنش‌های اتمی انجام می‌شوند. یعنی یا رزرو به طور کامل انجام می‌شود یا هیچ تغییر نامعتبری در سیستم رخ نمی‌دهد، که این امر تضمین می‌کند که داده‌های سیستم همواره معتبر باقی بمانند.

مزایا و نتیجه نهایی:

- کارایی بالا: استفاده از Cache باعث افزایش کارایی و سرعت در دسترسی به قیمت‌ها می‌شود.

-مدیریت همزمانی: با کمک OCC و تراکنش‌ها، از مشکلات مرتبط با همزمانی و تغییرات لحظه‌ای قیمت جلوگیری می‌شود.

-بهبود تجربه کاربری: کاربر همواره از قیمت به‌روز مطلع است و فرآیند رزرو به صورت شفاف و بدون مشکل پیش می‌رود.


این رویکرد به طور خاص در سیستم‌هایی مانند Airbnb مورد استفاده قرار می‌گیرد تا تجربه رزرو برای کاربران بهینه و بدون خطا باقی بماند.

قیمتتجربه کاربری
برنامه نویس علاقه مند به طراحی الگوریتم
شاید از این پست‌ها خوشتان بیاید