Skip to content

Commit

Permalink
Merge pull request #270 from boostcampwm-2024/feat/#269-sse-heart-beat
Browse files Browse the repository at this point in the history
SSE 연결에서 하트비트 메시지 송신
  • Loading branch information
kyu4583 authored Dec 3, 2024
2 parents bf055d0 + e5e1305 commit 07c4ef8
Show file tree
Hide file tree
Showing 3 changed files with 24 additions and 7 deletions.
1 change: 1 addition & 0 deletions back/src/domains/booking/const/sseMaximumInterval.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export const SSE_MAXIMUM_INTERVAL = 30000;
27 changes: 21 additions & 6 deletions back/src/domains/booking/service/booking-seats.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import { UserService } from '../../user/service/user.service';
import { SEATS_BROADCAST_INTERVAL } from '../const/seatsBroadcastInterval.const';
import { SEATS_SSE_RETRY_TIME } from '../const/seatsSseRetryTime.const';
import { SeatStatus } from '../const/seatStatus.enum';
import { SSE_MAXIMUM_INTERVAL } from '../const/sseMaximumInterval';
import { SeatsSseDto } from '../dto/seatsSse.dto';
import { runGetSeatsLua } from '../luaScripts/getSeatsLua';
import { runInitSectionSeatLua } from '../luaScripts/initSectionSeatLua';
Expand Down Expand Up @@ -183,12 +184,26 @@ export class BookingSeatsService {

private async createSeatSubscription(eventId: number, initialSeats: boolean[][]) {
const subscription = new BehaviorSubject<SeatStatusObject>({ seatStatus: initialSeats });
setInterval(async () => {
if (this.isBroadcastActivated(eventId)) {
subscription.next(new SeatsSseDto(await this.getSeats(eventId)));
this.unActivateNextBroadcast(eventId);
}
}, SEATS_BROADCAST_INTERVAL);
let lastBroadcastTime = Date.now();

setInterval(
async () => {
const now = Date.now();
const timeSinceLastBroadcast = now - lastBroadcastTime;

if (timeSinceLastBroadcast >= SSE_MAXIMUM_INTERVAL || this.isBroadcastActivated(eventId)) {
const seats = await this.getSeats(eventId);
subscription.next(new SeatsSseDto(seats));
lastBroadcastTime = Date.now();

if (this.isBroadcastActivated(eventId)) {
this.unActivateNextBroadcast(eventId);
}
}
},
Math.min(SEATS_BROADCAST_INTERVAL, SSE_MAXIMUM_INTERVAL),
);

return subscription;
}
}
3 changes: 2 additions & 1 deletion back/src/domains/booking/service/waiting-queue.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import { map } from 'rxjs/operators';

import { AuthService } from '../../../auth/service/auth.service';
import { UserService } from '../../user/service/user.service';
import { SSE_MAXIMUM_INTERVAL } from '../const/sseMaximumInterval';
import { WAITING_BROADCAST_INTERVAL } from '../const/waitingBroadcastInterval.const';
import { DEFAULT_WAITING_THROUGHPUT_RATE } from '../const/watingThroughputRate.const';
import { WaitingSseDto } from '../dto/waitingSse.dto';
Expand Down Expand Up @@ -80,7 +81,7 @@ export class WaitingQueueService {
DEFAULT_WAITING_THROUGHPUT_RATE,
),
),
WAITING_BROADCAST_INTERVAL,
Math.min(WAITING_BROADCAST_INTERVAL, SSE_MAXIMUM_INTERVAL),
);

this.queueSubscriptionMap.set(eventId, subscription);
Expand Down

0 comments on commit 07c4ef8

Please sign in to comment.