채널 내 어떤 사람이 떠들어도 모든 사람이 알 수는 없다..! 서버 성능이 부족하기 때문. 때문에 사람이 많아지면 동기화 시야를 최소화할 필요가 있다.
기본적으로 해당 지역에 설정된 값을 사용한다. 예상되는 인구 밀도를 기준으로 한다.
const NUM_OF_AREA = 30; // 30격자의 맵
const areas = New Map();
특정 좌표가 어느 해시 공간에 들어가야 하는지 판단->동기화 대상을 정하기
선형 보간은 두 지점 사이의 값을 추정하기 위해 직선을 사용하는 방법.
이 기법은 동기화 주기를 동적으로 조절하여, 인구 밀도가 높은 지역에서는 더 자주 동기화를 하고, 인구 밀도가 낮은 지역에서는 동기화 주기를 늘려서 자원을 효율적으로 사용할 수 있도록 할 수 있다.
게임에서 인구 밀도나 플레이어 밀집도를 기준으로 특정 좌표가 어떤 해시 공간에 속해야 하는지 판단하고, 이에 따라 동기화 대상을 정하는 방식과 선형 보간 기법을 사용하여 동기화 주기를 결정하는 방법
const highDensity = 100; // 높은 인구 밀도 지역의 예상 인구 밀도
const lowDensity = 10; // 낮은 인구 밀도 지역의 예상 인구 밀도
const highFrequency = 1; // 높은 인구 밀도 지역의 동기화 주기 (초)
const lowFrequency = 10; // 낮은 인구 밀도 지역의 동기화 주기 (초)
// 인구 밀도에 따른 동기화 주기를 계산하는 함수
function calculateSyncFrequency(density) {
// 선형 보간 계산
const frequency = highFrequency + (lowFrequency - highFrequency) * ((density - highDensity) / (lowDensity - highDensity));
return Math.max(highFrequency, Math.min(frequency, lowFrequency)); // 결과값을 최소/최대 주기 범위 내로 제한
}
// 특정 지역의 인구 밀도를 기준으로 동기화 주기 계산
const exampleDensity = 55; // 예시 인구 밀도
const syncFrequency = calculateSyncFrequency(exampleDensity);
console.log(`인구 밀도 ${exampleDensity}에 대한 동기화 주기: ${syncFrequency}초`);

웹 소켓을 사용한 알림 기능을 구현하기 위해 wsServer.js 파일과 wsClient.js 파일을 생성했다.
export const sendNotificationToOwner = (storeId, order) => {
wss.clients.forEach((client) => {
const ownerConnection = findOwnerConnection(storeId);
if (client.readyState === WebSocket.OPEN && +client.storeId === +storeId) {
client.send(JSON.stringify({
action: 'notification',
message: '새로운 주문이 도착했습니다',
order: order
}));
}
});
};
이런 함수를 통해서 createOrder 후 (service 계층) 알림을 보내는 로직을 실행시키려고 했는데... 클라이언트 문서에서 {action : order, storeId : 1}로 설정하고 실제 api를 호출해서 테스트하니 잘 온다.
문제는 이걸 해당 가게의 주인이 로그인했을 때만 띄워줘야 한다는 사실이었는데...

토큰 인증 여부를 읽어서 해당 알림의 주인인지 확인하려고 하는 로직을 만들어보려고 했지만 실패했다..ㅠㅠ 다음 프로젝트에선 알림 기능도 적용해보고 싶다..