پرش به مطلب اصلی

توزیع بار براساس مسیر درخواست

تصور کنید در یک اپلیکیشن، چند سرور Backend وجود دارد که باید یکی از آن‌ها برای ارسال پاسخ، بر اساس مسیر درخواست، انتخاب شود. در این حالت نیاز داریم درخواست‌هایی که برای یک مسیر مشابه هستند، به سرور یکسان ارسال شوند. هم‌چنین توزیع بار میان سرورها باید به‌طور متوازن انجام شود.

برای این کار می‌توان از روش Consistent Hash استفاده کرد. در این شیوه، Hash مسیر درخواست ورودی محاسبه‌ شده و سرور بک‌اند بر اساس مقدار آن انتخاب می‌شود.

addEventListener('fetch', event => {
event.respondWith(handleRequest(event.request))
})

const BACKEND_SERVERS = [
'https://backend-server-1.example.com',
'https://backend-server-2.example.com',
'https://backend-server-3.example.com',
'https://backend-server-4.example.com',
'https://backend-server-5.example.com',
];

async function handleRequest(request) {
try {
const serverIndex = getDeterministicServerIndex(request.url);
const targetServer = BACKEND_SERVERS[serverIndex];

return new Response(JSON.stringify({ targetServer , serverIndex}), {
headers: { 'content-type': 'text/plain' },
})
}
catch (error) {
return new Response(error.message, { status: 500 });
}
}

function getDeterministicServerIndex(url) {
// Use a hash function to get a consistent server index
const hash = getUrlHash(url);
return hash % BACKEND_SERVERS.length;
}

// Simple hash function for strings
function getUrlHash(str) {
let hash = 0;
if (str.length === 0) return hash;
for (let i = 0; i < str.length; i++) {
const chr = str.charCodeAt(i);
hash = (hash << 5) - hash + chr;
hash |= 0; // Convert to 32-bit integer
}
return Math.abs(hash);
}