일반적인 엔지니어링 실무에서 복잡하거나 긴 작업은 예약된 작업으로 백그라운드에서 실행합니다. 이런 방식은 게임 서버 컨텍스트에서 데이터 유지 관리를 수행하거나 특정 시간에 전체 플레이어 기반으로 플레이어 일일 보상을 나눠주는 것과 같은 작업을 실행하는 데 주로 사용됩니다. 이러한 작업은 플레이어 기반이 작을 때는 대체로 빠르고 문제가 없습니다. 그러나 플레이어 기반이 증가하기 시작하면 이러한 작업을 수행하는 데 필요한 시간도 늘어납니다. 이로 인해 하루 중 특정 시간에 서버에 높은 CPU 및 데이터베이스 로드가 급증할 수 있으며, 이로 인해 해당 시간 동안 성능과 플레이어 경험이 떨어질 수 있습니다.
이에 대한 해결책은 대신 JIT(Just-In-Time) 접근 방식을 사용하는 것입니다. 해당 날짜에 게임에 로그인했는지 여부에 관계없이 모든 플레이어가 하루에 100금화를 받는 예를 살펴보겠습니다.
letafterAuthenticateDevice : AfterHookFunction<Session,AuthenticateDeviceRequest>=function(ctx: nkruntime.Context,logger: nkruntime.Logger,nk: nkruntime.Nakama,session: nkruntime.Session,request: nkruntime.AuthenticateDeviceRequest){// Define a constant for how many milliseconds are in a day
constmsInADay=1000*60*60*24;// Get previous midnight
constpreviousMidnight=newDate().setHours(0,0,0,0);// Get the user's account so that we can check their metadata for a lastLoginTimestamp
constaccount=nk.accountGetId(ctx.userId);constlastLoginTimestamp : number=account.user.metadata.lastLoginTimestamp;letrewardCoins=0;if(!lastLoginTimestamp){// If the user has never logged in, give them 100 coins
rewardCoins=100;logger.debug("Player has never logged in before, giving them 100 coins.");}elseif(lastLoginTimestamp<previousMidnight){// If the user's last login was before midnight, we're going to give them at least 100 coins
rewardCoins=100;// Calculate how many full days have passed since midnight and the time they last logged in
consttimeBetweenMidnightAndLastLogin=previousMidnight-account.user.metadata.lastLoginTimestamp;consttotalFullDaysSinceLastLogin=Math.floor(timeBetweenMidnightAndLastLogin/msInADay);// Increase the reward by 100 for each full day since last login
rewardCoins+=totalFullDaysSinceLastLogin*100;logger.debug(`Player has logged in for the first time today and it has been a further ${totalFullDaysSinceLastLogin} days; giving them ${rewardCoins} coins.`);}else{logger.debug("Player has already logged in today, no coins are being rewarded.");}// Update the user's lastLoginTimestamp
constmetadata=account.user.metadata;metadata.lastLoginTimestamp=Date.now();nk.accountUpdateId(ctx.userId,null,null,null,null,null,null,metadata);// Give the player their coins
nk.walletUpdate(ctx.userId,{coins: rewardCoins});};
위의 예에서 볼 수 있듯이 사용자가 로그인하면 afterAuthenticateDevice 함수가 후크로 실행됩니다. 이 함수는 사용자가 마지막으로 로그인한 후 얼마나 지났는지 확인하고(한 번이라도 로그인한 적이 있는 경우) 당일의 첫 번째 로그인에 대해 100개의 코인을 보상하고 마지막 로그인 이후 추가 1일당 100개의 추가 코인을 보상합니다.
이 예제에서는 사용자가 인증한 후 실행되는 후크를 사용하지만 다른 것도 가능합니다. 사용자 세션의 다양한 지점에서 원하는 로직을 수행할 수 있습니다. 사용자가 대체 인증 방법을 연결하기 전이나 친구를 추가한 후를 예로 들 수 있습니다. 사용자가 대신 사용자 지정 RPC 함수를 호출하도록 만들 수도 있습니다. 사용 가능한 후크의 전체 목록은 문서의 메시지 이름 섹션을 참조하세요.