MemoryStoreService 는 모든 서버에서 실시간 세션에 액세스할 수 있는 높은 처리량과 낮은 대기 시간 데이터 서비스입니다. Memory Stores 는 빠르게 변경되고 지속되지 않는 데이터를 위한 저장 ��
데이터 구조
메모리 스토리지에는 서버 간에 빠르게 처리할 수 있도록 공유된 세 가지 원시 데이터 구조가 있습니다. 정렬된 맵, 큐, 그리고 해시 맵입니다. 각 데이터 구조는 특정 사용 사례에 적합합니다.
- 스킬 기반 매치메이킹 - 공유 대기열 간의 사용자 정보(예: 스킬 레벨)를 저장하고 로비 서버를 사용하여 매치메이킹 기간을 정기적으로 실행합니다.
- 교환 및 경매 기능을 사용하여 다른 서버 간의 유니버셜 거래 활성화 - 사용자가 실시간으로 가격이 변경되는 아이템에 입찰할 수 있도록 키 값 쌍의 정렬된 맵을 사용하여 다른 서버 간의 유니버셜 거래 활성화.
- 전역 순위표 - 순위표를 캐시하고 순위표 내에 있는 순위표를 업데이트하십시오.
- 공유 인벤토리 - 공유 해시 맵 에서 인벤토리 항목 및 통계를 저장하고, 사용자가 공유 인벤토리 항목을 서로 사용할 수 있습니다.
- 지속 데이터용 캐시 - 데이터 스토어에서 지속 데이터를 복사하고 메모리 스토어에 해시 맵을 저장하여 캐시를 사용하고 경험의 이행향상시킬 수 있습니다.
일반적으로 특정 키에 따라 데이터에 액세스해야 하는 경우 해시 맵을 사용합니다. 데이터를 정렬해야 하는 경우 정렬된 맵을 사용합니다. 데이터를 특정 순서로 처리해야 하는 경우 큐를 사용합니다.
제한 및 쿼터
메모리 크기, API 요청 및 데이터 구조 크기에 대한 메모리 저장소의 데이터 사용 쿼터를 유지하려면 메모리 크기에 대한 메모리 사용 쿼터, 시스템 이행및 확장성을 유지하려면 API 요청 및 데이터 구조 크기에 대한 데이터 사용 쿼터가 있습니다.
메모리 저장소에는 만료 시간에 따른 퇴거 정책이 있습니다, 또한 TTL이라고도 합니다. 항목은 만료되면 퇴거됩니다. 메모리 쿼터가 자유로워지면 새 항목을 위해 메모리 저장소에 새로운 항목을 입력할 수 있습니다. 메모리 한도에 도달하면 모든 후속 쓰기 요청이 실패합니다.
메모리 크기 할당
메모리 할당량은 경험이 소비할 수 있는 총 메모리의 양을 제한합니다. 고정된 값이 아닙니다. 대신, 경험에 사용자 수에 따라 변경됩니다. 수식은 다음과 같습니다: 64KB + 1KB * [사용자 수] . 할당량은 서버 수준이 아닌 경험 레벨
사용자가 경험에 참여할 때 추가 메모리 할당량이 즉시 사용 가능합니다. 사용자가 경험을 떠나면 할당량이 즉시 줄어들지 않습니다. 할당량이 다시 평가될 때까지 트레이스백 기간이 8일입니다.
경험이 메모리 크기 제한을 뛰어넘으면 메모리 크기를 증가하는 모든 API 요청이 항상 실패합니다. 메모리 크기를 줄이거나 변경하지 않는 요청은 여전히 성공합니다.
With the observability dashboard, you can view the memory size quota of your experience in real-time using the Memory Usage chart.
API 요청 제한
API 요청 제한에 대해서는, 모든 Class.MemoryStoreService API 호출에 적용되는 요청 단위 쿼터가 있습니다. 쿼터는 분당 2> Class.MemoryStoreService2> API 호출을 위한 5>1000 + 100 * [number of concurrent users]5> 요청 단위입니다.
대부분의 API 호출은 하나의 요청 단위만 소비하지만, 몇 가지 예외가 있습니다.
MemoryStoreSortedMap:GetRangeAsync()
반환된 항목의 수에 따라 단위를 소비합니다. 예를 들어, 이 메서드가 10개의 항목을 반환하면 호출은 10개의 요청 단위로 계산됩니다. 빈 응답을 반환하면 요청 단위로 하나로 계산됩니다.
반환된 항목의 수에 따라 단위를 소비하지만 MemoryStoreSortedMap:GetRangeAsync() 와 같이 잠깐 읽기 시간을 추가로 소모하지만 읽기 시간을 지정하십시오. waittimeout 매개 변수로 최대 읽기 시간을 지정하십시오.
MemoryStoreHashMap:UpdateAsync()
최소 2개의 단위를 소비합니다.
MemoryStoreHashMap:ListItemsAsync()
[검색된 파티션 수] + [반환된 항목] 단위를 소비합니다.
서버 수준이 아닌 경험 레벨요청 큐도 적용됩니다. 이렇게 하면 총 요청 비율이 큐를 초과하더라도 서버 간에 요청을 할당할 수 있습니다. 요청을 초과하면 서비스에서 요청을 조정하는 경우 오류 응답을 수신합니다.
관측 가능성 기능을 사용하면 경험의 요청 단위 할당을 실시간으로 볼 수 있습니다.
데이터 구조 크기 제한
단일 정렬된 맵이나 큐에 대해 다음의 크기 및 항목 수 제한이 적용됩니다.
- 최대 아이템 수: 1,000,000
- 정렬된 맵에 대한 키가 포함된 최대 전체 크기: 100 MB
각 파티션 제한
See 분할 한도 .
모범 사례
메모리 사용 패턴을 최적화하고 제한을 피하려면 다음 모범 사례를 따르세요.
처리된 항목을 제거합니다. 쿼리 항목을 Class.MemoryStoreQueue:RemoveAsync() 메서드를 사용하여 정렬하고 쿼리 항목을 Class.MemoryStoreSortedMap:RemoveAsync() 메서드를 사용하여 정렬할 수 있습니다. 메모리를 해제하고 데이터 구조를 최신 상태로 유지할 수 있습니다.
데이터를 추가할 때 가능한 가장 작은 시간 프레임으로 만료 시간을 설정합니다. 하지만 기본 만료 시간은 모두 MemoryStoreQueue:AddAsync() 및 MemoryStoreSortedMap:SetAsync() 모두 45일이지만, 짧은 시간을 설정하면 메모리 사
- 긴 만료 시간을 가진 대량의 데이터를 저장하지 마십시오, 이는 메모리 퀵을 초과하고 잠재적으로 모든 경험을 중단할 수 있는 문제를 일으킬 수 있습니다.
- 항상 필요하지 않은 항목을 명시적으로 삭제하거나 짧은 항목 만료를 설정합니다.
- 일반적으로 메모리 및 항목 만료를 보안 메커니즘으로 사용하려면 명시적 삭제를 사용하여 메모리를 해제해야 하며, 사용되지 않은 항목이 메모리를 차지하여 긴 시간 동안 사용되지 않도록 해야 합니다.
필요한 값만 메모리에 저장합니다.
예를 들어, 경매 집에 대한 경매 경험의 경우 가장 높은 가격을 유지해야 합니다. 모든 데이터 구조에 대해 MemoryStoreQueue:UpdateAsync()를 사용하여 가장 높은 가격을 유지하는 대신 모든 가격을 유지할 수 있습니다.
지수 백오프를 사용하여 API 요청 한도를 초과하지 않도록 도와주세요.
예를 들어, DataUpdateConflict 에 대한 요청을 정지하고 두 초 후에 다시 시도하면 올바른 응답을 얻을 수 있습니다.
자를 사용하여 대형 데이터 구조를 여러 개의 작은 데이터 구조로 나뉩니다.
대부분의 데이터는 큰 데이터 구조에 저장하는 것보다 작은 구조에서 관리하는 것이 더 쉽습니다. 이 접근 방식은 사용 제한 및 요금 제한을 피할 수 있도록 도울 수 있습니다. 예를 들어, 키에 접두사를 사용하는 정렬된 맵을 가진 순서 있는 맵을 여
저장된 값을 압축합니다.
예를 들어, LZW 알고리즘을 사용하여 저장된 값 크기를 줄이는 것이 좋습니다.
관측 가능성
메모리 스토어 사용 모니터링 및 문제 해결을 위한 대시보드는 메모리 스토어 사용을 모니터링하고 문제를 해결하는 데 도움이 되는 인사이트 및 분석을 제공합니다. 실시간으로 메모리 사용 및 API 요청에 대한 차트를 업데이트하여 경험의 메모리 사용 상태추적하고
다음 표에서는 API 응답의 모든 상태 코드를 나열하고 설명합니다. 요청 수 상태별 및 요청 기반 상태 차트에 있는 API 응답의 모든 상태 코드를 나열합니다. 특정 오류에 대한 해결 방법은 문제 해결
상태 코드 | 설명 |
---|---|
성공 | 성공. |
데이터 구조 메모리 제한 | 데이터 구조 수준 메모리 크기 제한(100MB)을 초과합니다. |
데이터 업데이트 충돌 | 동시 업데이트로 인한 충돌. |
액세스 거부 | 경험 데이터에 액세스할 권한이 없습니다. 이 요청은 요청 단위를 소비하지 않거나 쿼터를 사용하지 않습니다. |
내부 오류 | 내부 오류. |
유효하지 않은 요청 | 요청에 필요한 정보가 없거나 잘못된 정보가 있습니다. |
데이터 구조 항목 제한 | 데이터 구조 수준 아이템 수 (1M) 초과. |
아이템 없음 | Class.MemoryStoreQueue:ReadAsync() 또는 Class.MemoryStoreSortedMap:UpdateAsync() 에서 아이템을 찾지 못했습니다. Class.MemoryStore 에서 2초마다 조사 투표를 수행하고 이 상태 코드를 찾을 때까지 반환합니다. |
데이터 구조 요청 제한 | 데이터 구조 수준 요청 단위 제한(분당 100,000개의 요청 단위)을 초과합니다. |
파티션 요청 제한 | 파티션 요청 단위 제한을 초과합니다. |
총 요청 제한 | 유니버스 수준 요청 단위 제한을 초과합니다. |
총 메모리 제한 | 세계 수준의 메모리 할당을 초과합니다. |
아이템 크기 너무 큽니다. | 값 크기가 제한(32KB)을 초과합니다. |
다음 표에서는 현재 관측 대시보드에서 사용할 수 없는 클라이언트 측 상태 코드를 나열합니다.
상태 코드 | 설명 |
---|---|
내부 오류 | 내부 오류. |
게시되지 않은 장소 | MemoryStoreService를 사용하려면 이 장소를 게시해야 합니다. |
잘못된 클라이언트 액세스 | MemoryStoreService 는 서버에서 호출해야 합니다. |
잘못된 만료 시간 | 만료 시간은 0과 3,888,000 사이여야 합니다. |
유효하지 않은 요청 | 값을 JSON으로 변환할 수 없습니다. |
유효하지 않은 요청 | sortKey를 유효한 숫자 또는 문자열로 변환할 수 없습니다. |
변환 콜백 실패 | 변환 콜백 함수를 호출하지 못했습니다. |
요청 제한 | 최근 MemoryStores 요청이 한 가지 이상의 제한을 달성했습니다. |
업데이트 충돌 | 최대 재시도 수를 초과했습니다. |
문제 해결
다음 표에서는 각 응답 상태 코드에 대해 권장 솔루션을 나열하고 설명합니다.
오류 | 문제 해결 옵션 |
---|---|
데이터 구조 제한 / 파티션 제한 |
|
총 요청 제한 | |
데이터 구조 항목 제한 |
|
데이터 구조 메모리 제한 | |
총 메모리 제한 | |
데이터 업데이트 충돌 |
0> |
내부 오류 |
문제에 대한 버그 보고서를 파일하십시오. 설명하는 문제의 Roblox 경험 ID입니다. . |
유효하지 않은 요청 |
|
아이템 크기 너무 큽니다. |
|
Studio에서 테스트 및 디버깅
Class.MemoryStoreService의 데이터는 Studio와 프로덕션 사이에서 격리되므로 Studio에서 데이터를 변경하더라도 프로덕션 동작에 영향을 주지 않습니다. 즉, Studio에서 데이터를 변경하더라도 프로덕션 데이터에 액세스하지 않으므로 안전하게 메모리 스토어를 테스트하고 프로덕션에 가기 전에 새 기능을 사용
Studio 테스트는 생산과 동일한 제한 및 할당량 을 가지고 있습니다. 할당량은 사용자 수에 따라 생산과 동일한 크기를 가질 수 있습니다. 할당량은 액세스 및 권한을 검증하기 위해 수행되는 일부 추가 검사 때문에 생산과 비슷한 대기 시간과 오류 발생
라이브 경험에서 메모리 스토어를 디버깅하거나 스튜디오에서 테스트하는 방법에 대한 정보는 개발자 콘솔 을 사용하십시오.