MemoryStoreService là một dịch vụ lưu trữ dữ liệu có tốc độ cao và thời gian trễ thấp cung cấp khả năng lưu trữ dữ liệu trong bộ nhớ nhanh chóng truy cập từ tất cả các máy chủ trong phiên trực tiếp. Kho lưu trữ bộ nhớ thích hợp cho dữ liệu thay đổi thường xuyên và tạm thời mà không cần phải bền vững, bởi vì chúng nhanh hơn để truy cập và biến mất khi đạt đến tuổi thọ tối đa.Đối với dữ liệu cần duy trì qua các phiên, sử dụng cửa hàng dữ liệu.
Cấu trúc dữ liệu
Thay vì truy cập trực tiếp vào dữ liệu thô, các kho nhớ có ba cấu trúc dữ liệu thô sơ được chia sẻ giữa các máy chủ để xử lý nhanh: bản đồ sắp xếp , hàng đợi và bản đồ hash .Mỗi cấu trúc dữ liệu là một phù hợp tốt cho một số trường hợp sử dụng:
- Kết hợp dựa trên kỹ năng - Lưu thông tin người dùng, chẳng hạn như cấp độ kỹ năng, trong một hàng đợi chung giữa các máy chủ, và sử dụng máy chủ sảnh để chạy kết hợp hàng tuần.
- Giao dịch và đấu thầu giữa các máy chủ - Bật giao dịch toàn diện giữa các máy chủ khác nhau, nơi người dùng có thể đấu thầu các mặt hàng có giá thay đổi theo thời gian thực, với một bản đồ chìa khóa-giá trị được sắp xếp.
- Bảng xếp hạng toàn cầu - Lưu và cập nhật xếp hạng người dùng trên một bảng xếp hạng chung bên trong một bản đồ được sắp xếp theo thứ tự .
- Túi đồ chung - Lưu các mục tồn kho và thống kê trong một bản đồ hash chung , nơi người dùng có thể sử dụng các mục tồn kho cùng lúc với nhau.
- Lưu trữ bộ nhớ cho dữ liệu vĩnh viễn - Sao lưu và sao chép dữ liệu vĩnh viễn của bạn vào kho lưu trữ dữ liệu thành một bản đồ bộ nhớ có thể hoạt động như một bộ nhớ và cải thiện hiệu lựcsuất trải nghiệm của bạn.
Nói phổ quát, nếu bạn cần truy cập dữ liệu dựa trên một chìa khóa cụ thể, hãy sử dụng bản đồ hash.Nếu bạn cần dữ liệu được đặt hàng, hãy sử dụng bản đồ được sắp xếp.Nếu bạn cần xử lý dữ liệu theo một trật tự cụ thể, hãy sử dụng hàng đợi.
Giới hạn và quota
Để duy trì khả năng mở rộng và hiệu hiệu lựchệ thống, các kho lưu trữ bộ nhớ có quota sử dụng dữ liệu cho kích thước bộ nhớ, yêu cầu API và kích thước cấu trúc dữ liệu.
Kho lưu trữ bộ nhớ có chính sách thu hồi dựa trên thời gian hết hạn, cũng được gọi là thời gian sống (TTL).Các mục bị trục xuất sau khi hết hạn và quota bộ nhớ được giải phóng cho các lượt truy cập mới.Khi bạn đạt đến giới hạn bộ nhớ, tất cả các yêu cầu ghi tiếp theo sẽ thất bại cho đến khi các mục hết hạn hoặc bạn thủ công xóa chúng.
Giới hạn kích thước bộ nhớ
Giới hạn quota bộ nhớ giới hạn tổng số bộ nhớ mà một trải nghiệm có thể tiêu thụ.Nó không phải là một giá trị cố định.Thay vào đó, nó thay đổi theo thời gian tùy thuộc vào số lượng người dùng trong trải nghiệm theo công thức sau: 64KB + 1KB * [số lượng người dùng] .Quota áp dụng trên cấp độ trải nghiệm thay vì cấp độ máy chủ.
Khi người dùng tham gia trải nghiệm, quota bộ nhớ bổ sung sẵn ngay lập tức.Khi người dùng rời khỏi trải nghiệm, quota không giảm ngay lập tức.Có một khoảng thời gian truy xuất lại trong vòng tám ngày trước khi quota đánh giá lại với giá trị thấp hơn.
Sau khi trải nghiệm của bạn đạt đến giới hạn kích thước bộ nhớ, bất kỳ yêu cầu API nào tăng kích thước bộ nhớ luôn thất bại.Yêu cầu giảm hoặc không thay đổi kích thước bộ nhớ vẫn thành công.
Với bảng điều khiển quan sát thời gian thực, bạn có thể xem quota kích thước bộ nhớ của trải nghiệm của bạn trong thời gian thực bằng biểu đồ Sử dụng bộ nhớ .
Giới hạn yêu cầu API
Đối với giới hạn yêu cầu API, có một quota yêu cầu đơn vị áp dụng cho tất cả các cuộc gọi API MemoryStoreService.Quota là 1000 + 100* [number of concurrent users] đơn vị yêu cầu mỗi phút.
Hầu hết các cuộc gọi API chỉ tiêu thụ một đơn vị yêu cầu, với một vài ngoại lệ:
MemoryStoreSortedMap:GetRangeAsync()
Tiêu thụ các đơn vị dựa trên số lượng vật phẩm trả về.Ví dụ, nếu phương pháp này trả về 10 vật phẩm, cuộc gọi được tính là 10 đơn vị yêu cầu.Nếu nó trả lại một phản hồi trống, nó được tính là một đơn vị yêu cầu.
Tiêu thụ các đơn vị dựa trên số lượng vật phẩm được trả về, giống như MemoryStoreSortedMap:GetRangeAsync() , nhưng tiêu thụ thêm một đơn vị mỗi hai giây trong lúc đọc.Xác định thời gian đọc tối đa với tham số waitTimeout.
MemoryStoreHashMap:UpdateAsync()
Tiêu thụ tối thiểu hai đơn vị.
MemoryStoreHashMap:ListItemsAsync()
Tiêu thụ [number of partitions scanned] + [items returned] đơn vị.
Tiêu chuẩn yêu cầu cũng được áp dụng trên cấp trải nghiệm thay vì cấp máy chủ.Điều này cung cấp sự linh hoạt để phân bổ các yêu cầu giữa các máy chủ miễn là tỷ lệ yêu cầu tổng không vượt quá giới hạn.Nếu bạn vượt quá giới hạn, bạn nhận được một phản hồi lỗi khi dịch vụ giới hạn các yêu cầu của bạn.
Với tính năng quan sát có sẵn, bạn có thể xem quota yêu cầu của trải nghiệm của bạn trong thời gian thực.
Giới hạn kích thước cấu trúc dữ liệu
Đối với một bản đồ hoặc hàng đợi duy nhất được sắp xếp, các giới hạn kích thước và số lượng vật phẩm sau đây áp dụng:
- Số lượng tối đa của các mục: 1,000,000
- Kích cỡ tổng lớn nhất (bao gồm cả chìa khóa cho bản đồ được sắp xếp): 100 MB
Giới hạn cho mỗi phân vùng
Xem giới hạn mỗi phân vùng .
Tốt nhất các thực hành
Để giữ cho mẫu sử dụng bộ nhớ của bạn tối ưu và tránh việc đạt tới giới hạn , hãy làm theo các tốt nhất sau đây:
Loại bỏ các mục đã xử lý.: Luôn luôn xóa các mục đã đọc bằng cách sử dụng phương pháp MemoryStoreQueue:RemoveAsync() cho hàng đợi và MemoryStoreSortedMap:RemoveAsync() cho bản đồ được sắp xếp có thể giải phóng bộ nhớ và giữ cho cấu trúc dữ liệu được cập nhật.
Đặt thời gian hết hạn về thời gian ngắn nhất có thể khi thêm dữ liệu.: Mặc dù thời gian hết hạn mặc định là 45 ngày cho cả MemoryStoreQueue:AddAsync() và MemoryStoreSortedMap:SetAsync(), nhưng việc đặt thời gian ngắn nhất có thể sẽ tự động xóa dữ liệu cũ để ngăn chặn chúng không làm đầy quota sử dụng bộ nhớ của bạn.
- Không lưu trữ một lượng lớn dữ liệu với thời hạn hết hạn dài, vì nó có nguy cơ vượt quá quota bộ nhớ của bạn và có thể gây ra các vấn đề có thể làm hỏng toàn bộ trải nghiệm của bạn.
- Luôn luôn xóa các vật phẩm không cần thiết hoặc đặt thời hạn ngắn cho vật phẩm.
- Nói chung, bạn nên sử dụng xóa rõ ràng để giải phóng bộ nhớ và hết hạn của vật phẩm như một cơ chế an toàn để ngăn chặn các vật phẩm chưa sử dụng chiếm bộ nhớ trong một thời gian dài.
Chỉ giữ các giá trị cần thiết trong bộ nhớ.
Ví dụ, đối với trải nghiệm nhà đấu giá, bạn chỉ cần duy trì lời đề nghị cao nhất.Bạn có thể sử dụng MemoryStoreSortedMap:UpdateAsync() trên một phím để giữ mức giá cao nhất thay vì giữ tất cả các lời đề nghị trong cấu trúc dữ liệu của bạn.
Sử dụng quay lại exponential để giúp giữ dưới giới hạn yêu cầu API.
Ví dụ, nếu bạn nhận được một DataUpdateConflict, bạn có thể thử lại sau hai giây, sau đó là bốn, tám, v.v.thay vì liên tục gửi yêu cầu đến MemoryStoreService để có được phản hồi chính xác.
Chia cấu trúc dữ liệu khổng lồ thành nhiều cấu trúc nhỏ hơn bằng cách phân mảnh.
Thường dễ dàng quản lý dữ liệu trong cấu trúc nhỏ hơn là lưu trữ tất cả mọi thứ trong một cấu trúc dữ liệu lớn.Cách tiếp cận này cũng có thể giúp tránh sử dụng và giới hạn tỷ lệ.Ví dụ, nếu bạn có bản đồ được sắp xếp sử dụng chữ đầu cho các chìa khóa của nó, hãy xem xét tách mỗi chữ đầu thành bản đồ được sắp xếp riêng của nó.Đối với một trải nghiệm đặc biệt phổ biến, bạn thậm chí có thể chia người dùng thành nhiều bản đồ dựa trên những chữ số cuối cùng của ID người dùng của họ.
Nén các giá trị lưu trữ.
Ví dụ, hãy xem xét sử dụng算法 LZW để giảm kích thước giá trị lưu trữ.
Khả năng quan sát
Bảng điều khiển Quan sát năng lực cung cấp cái nhìn sâu sắc và phân tích cho việc theo dõi và giải quyết các vấn đề sử dụng kho lưu trữ bộ nhớ của bạn.Với biểu đồ cập nhật thời gian thực về các khía cạnh khác nhau của sử dụng bộ nhớ và yêu cầu API, bạn có thể theo dõi mô hình sử dụng bộ nhớ của trải nghiệm của bạn, xem quota hiện tại được gán, theo dõi tình trạng tháiAPI và xác định các vấn đề tiềm ẩn để tối ưu hóa hiệu suất.
Bảng sau đây liệt kê và mô tả tất cả các mã trạng thái của API phản hồi có sẵn trên bảng Yêu cầu theo trạng thái và Yêu cầu bởi API x Tình trạng của Bảng Quan sát.Để biết thêm thông tin về cách giải quyết các lỗi này, xem Giải quyết sự cố .Đối với quota hoặc giới hạn cụ thể mà lỗi liên quan, xem Giới hạn và quota .
Mã trạng mã | Mô tả |
---|---|
Thành công | Thành công. |
DataStructureMemoryOverLimit của Thời gian giới hạn | Vượt giới hạn kích thước bộ nhớ cấu trúc dữ liệu (100MB). |
Xung đột cập nhật dữ liệu | Xung đột do cập nhật cùng lúc. |
Truy cập bị từ chối | Không được phép truy cập dữ liệu kinh nghiệm. Yêu cầu này không tiêu thụ đơn vị yêu cầu hoặc sử dụng quota. |
Lỗi nội bộ | Lỗi nội bộ. |
Yêu cầu không hợp lệ | Yêu cầu không có thông tin cần thiết hoặc có thông tin bị sai hình thức. |
Vật phẩm cấu trúc dữ liệu vượt giới hạn | Vượt giới hạn số lượng mục cấu trúc dữ liệu (1M). |
Không tìm thấy mục | Không có mục nào được tìm thấy trong MemoryStoreQueue:ReadAsync() hoặc MemoryStoreSortedMap:UpdateAsync() . ReadAsync() khảo sát mỗi 2 giây và trả lại mã trạng thái này cho đến khi tìm thấy các mục trong hàng đợi. |
Yêu cầu cấu trúc dữ liệu quá giới hạn | Vượt giới hạn yêu cầu cấp cấu trúc dữ liệu (100,000 yêu cầu mỗi phút). |
Yêu cầu phân chia vượt giới hạn | Vượt giới hạn yêu cầu phân vùng. |
Tổng yêu cầu vượt giới hạn | Vượt giới hạn đơn vị yêu cầu cấp vũ trụ. |
Tổng lượng bộ nhớ vượt giới hạn | Vượt quá giới hạn bộ nhớ cấp vũ trụ. |
Giá trị của vật phẩm quá lớn | Kích thước giá trị vượt quá giới hạn (32KB). |
Bảng sau đây liệt kê mã trạng thái từ phía khách hàng, hiện không có sẵn trên Bảng điều khiển Quan sát khả năng.
Mã trạng mã | Mô tả |
---|---|
Lỗi nội bộ | Lỗi nội bộ. |
Vị trí chưa xuất bản | Bạn phải xuất bản nơi này để sử dụng MemoryStoreService. |
Truy cập khách hàng không hợp lệ | Dịch vụ MemoryStore phải được gọi từ máy chủ. |
Thời gian hết hạn không hợp lệ | Thời gian 'expiration' phải nằm giữa 0 và 3,888,000. |
Yêu cầu không hợp lệ | Không thể chuyển đổi giá trị thành json. |
Yêu cầu không hợp lệ | Không thể chuyển đổi sortKey thành số hoặc chuỗi hợp lệ. |
Biến thể cuộc gọi thất bạiTransformCallbackFailed | Không thể kích hoạt chức năng gọi lại biến đổi. |
Yêu cầu bị giới hạn | Các yêu cầu gần đây của MemoryStores bị giới hạn một hoặc nhiều giới hạn. |
Xung đột cập nhật | Vượt quá số lần thử lại tối đa. |
Gỡ rào chắn
Bảng sau đây liệt kê và mô tả giải pháp được đề xuất cho mỗi mã trạng thái phản hồi:
Lỗi | Cách giải quyết vấn đề |
---|---|
Yêu cầu cấu trúc dữ liệu vượt giới hạn / Yêu cầu phân chia vượt giới hạn |
|
Tổng yêu cầu vượt giới hạn | |
Vật phẩm cấu trúc dữ liệu vượt giới hạn |
|
DataStructureMemoryOverLimit của Thời gian giới hạn | |
Tổng lượng bộ nhớ vượt giới hạn | |
Xung đột cập nhật dữ liệu |
Thử xem bạn có gọi MemoryStoreService hiệu quả không để tránh xung đột.Tốt nhất, bạn không nên gửi quá nhiều yêu cầu.: Loại bỏ các mục một cách nhất quán một khi chúng được đọc bằng cách sử dụng phương pháp MemoryStoreQueue:RemoveAsync() cho hàng đợi và MemoryStoreSortedMap:RemoveAsync() cho bản đồ được sắp xếp. |
Lỗi nội bộ |
|
Yêu cầu không hợp lệ |
|
Giá trị của vật phẩm quá lớn |
|
Thử nghiệm và gỡ lỗi trong Studio
Dữ liệu trong MemoryStoreService được cách ly giữa Studio và sản xuất, vì vậy việc thay đổi dữ liệu trong Studio không ảnh hưởng đến hành vi sản xuất.Điều này có nghĩa là các cuộc gọi API từ Studio không truy cập dữ liệu sản xuất, cho phép bạn thử nghiệm an toàn kho lưu trữ bộ nhớ và các tính năng mới trước khi chuyển sang sản xuất.
Thử nghiệm studio có cùng giới hạn và quota như sản xuất.Đối với quota được tính dựa trên số lượng người dùng, quota kết quả có thể rất nhỏ bởi vì bạn là người dùng duy nhất để thử nghiệm Studio.Khi kiểm tra từ Studio, bạn cũng có thể nhận thấy độ trễ và tỷ lệ lỗi nhẹ hơn so với việc sử dụng trong sản xuất do một số kiểm tra bổ sung được thực hiện để xác minh quyền truy cập và quyền hạn.
Đối với thông tin về cách gỡ lỗi kho lưu trữ bộ nhớ trên các trải nghiệm trực tiếp hoặc khi thử nghiệm trong studio, hãy sử dụng Bảng điều khiển nhà phát triển.