Фреймворк Fresh ориентирован на работу с Deno и использует концепцию серверных рендеров с минимальной зависимостью от промежуточного программного обеспечения. В контексте кластерных решений и масштабирования приложений важным аспектом становится корректное управление сессиями пользователей. Сессии в Fresh по умолчанию не хранятся на сервере между запросами, поэтому для кластеризации требуется централизованное хранилище.
Куки на стороне клиента
Серверное хранилище
Гибридный подход
Redis идеально подходит для кластерных приложений благодаря высокой скорости и встроенной поддержке TTL (времени жизни ключей). В Fresh для работы с Redis используется стандартный драйвер Deno.
import { connect } from "https://deno.land/x/redis/mod.ts";
const redis = await connect({
hostname: "127.0.0.1",
port: 6379,
});
import { v4 } from "https://deno.land/std/uuid/mod.ts";
async function createSession(userId) {
const sessionId = v4.generate();
const sessionData = {
userId,
createdAt: Date.now(),
};
await redis.set(`session:${sessionId}`, JSON.stringify(sessionData), { ex: 3600 });
return sessionId;
}
v4.generate() используется для
генерации уникального идентификатора сессии.async function getSession(sessionId) {
const data = await redis.get(`session:${sessionId}`);
if (!data) return null;
return JSON.parse(data);
}
async function deleteSession(sessionId) {
await redis.del(`session:${sessionId}`);
}
При работе в кластере каждый узел приложения должен иметь доступ к общему хранилищу сессий. Важно учитывать:
Fresh поддерживает middleware-логики через Handlers.
Сессия обычно инициализируется в обработчике запроса:
export const handler: Handlers = {
async GET(req, ctx) {
const sessionId = req.cookies.get("session_id");
const session = sessionId ? await getSession(sessionId) : null;
if (!session) {
const newSessionId = await createSession("user123");
ctx.response.headers.set(
"Set-Cookie",
`session_id=${newSessionId}; HttpOnly; Path=/; Max-Age=3600`
);
}
return ctx.render({ session });
},
};
HttpOnly защищает куки от доступа через
JavaScript.Max-Age синхронизируется с TTL в Redis.Эффективное управление сессиями в Fresh в кластерной среде требует сочетания централизованного хранилища, корректной работы с TTL и безопасной передачи идентификаторов сессий. Такой подход обеспечивает масштабируемость приложения и защищает пользовательские данные от потерь и подделки.