20240229

귤금·2024년 2월 29일

Node.js 4기 TIL

목록 보기
46/86

Today?

Node.js 4기 챌린지반 메타버스(Part 3)

채널 내 어떤 사람이 떠들어도 모든 사람이 알 수는 없다..! 서버 성능이 부족하기 때문. 때문에 사람이 많아지면 동기화 시야를 최소화할 필요가 있다.

동기화 시야 선정하기

기본적으로 해당 지역에 설정된 값을 사용한다. 예상되는 인구 밀도를 기준으로 한다.

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를 호출해서 테스트하니 잘 온다.
문제는 이걸 해당 가게의 주인이 로그인했을 때만 띄워줘야 한다는 사실이었는데...

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


회고

0개의 댓글