Я разрабатываю backend для платформы, где пользователи могут запускать мини-игры. Для отслеживания игровых сессий создаю сущность GameSession.
Базовый флоу:
- Одна игра → несколько сессий на одного пользователя (например, с разных устройств).
- У каждой сессии есть expiresAt и status (OPEN, CLOSED, EXPIRED).
- Есть cron-задача, которая регулярно помечает истёкшие сессии как EXPIRED.
- Когда игра начинается я полагаю клиент должен стучаться на /start-game, когда заканчивается - на /end-game
Модель:
@Entity('game_sessions')
export class GameSession {
@PrimaryGeneratedColumn('uuid')
id: string;
@ManyToOne(() => User)
user: User;
@ManyToOne(() => Game)
game: Game;
@Column()
sessionToken: string; // UUID, уникальный
@Column({ type: 'enum', enum: GameSessionStatus })
status: GameSessionStatus;
@Column({ nullable: true })
expiresAt: Date;
@Column({ nullable: true })
endedAt: Date;
@CreateDateColumn()
startedAt: Date;
}
Вопросы:
1. Нормальным ли считается подход когда допускается несколько активных сессий с одинаковым game_id + user_id? Или же при повторном запросе /start-game лучше закрывать предыдущую открытую сессию и создавать новую? Или же возвращать токен открытой если она есть?
2. Стоит ли использовать sessionToken вместо id в публичном API?
3. Какие поля впринципе обязательны для модели GameSession для корректного управления состоянием сессии?
4. Нужна ли блокировка (pessimistic_write или optimistic) при завершении/создании сессии? Например, если пользователь дважды подряд вызывает POST /games/end?
5. Как определить оптимальное время expiresAt?
Также буду благодарен за best practices или ссылки на примеры архитектуры игровых платформ.