Tùy chọn SessionStore
Trên trang này
Không gian tên: Nalix.Runtime.Options
Assembly: Nalix.Runtime
SessionStoreOptions kiểm soát thời gian các phiên đã ngắt kết nối được giữ lại để tiếp tục (SessionTtl) và ngưỡng số thuộc tính tối thiểu (MinAttributesForPersistence) mà DefaultSessionPersistencePolicy yêu cầu trước khi trạng thái của một kết nối đang đóng được lưu lại.
Ánh xạ mã nguồn
src/Nalix.Runtime/Options/SessionStoreOptions.cssrc/Nalix.Runtime/Sessions/SessionService.cssrc/Nalix.Runtime/Sessions/InMemorySessionStore.cssrc/Nalix.Runtime/Sessions/SessionFactory.cssrc/Nalix.Runtime/Sessions/DefaultSessionPersistencePolicy.cssrc/Nalix.Runtime/Sessions/SessionPersistenceObserver.cs
Giá trị mặc định và kiểm tra hợp lệ
| Thuộc tính | Kiểu | Mặc định | Kiểm tra hợp lệ | Thành phần sử dụng khi chạy |
|---|---|---|---|---|
SessionTtl | TimeSpan | 00:05:00 (5 phút) | [Required], > TimeSpan.Zero | SessionFactory.CreateSession(IConnection) đặt ExpiresAtUnixMilliseconds. |
MinAttributesForPersistence | int | 10 | [ValueRange(0, int.MaxValue)] | DefaultSessionPersistencePolicy.ShouldPersist(IConnection) dùng làm giá trị dự phòng khi Secret.IsZero. |
Validate() chạy kiểm tra DataAnnotations (ValidationException) và xác minh SessionTtl > TimeSpan.Zero (ValidationException).
Luồng lưu trữ phiên
flowchart TD
A["ConnectionHub raises ConnectionUnregistered"] --> B["SessionPersistenceObserver.OnConnectionClosed"]
B --> C["SessionService.SaveSessionAsync(snapshot)"]
C --> D{"connection.GetRuntimeState().HandshakeEstablished?"}
D -->|No| Z["Skip persistence"]
D -->|Yes| S{"!connection.Secret.IsZero?"}
S -->|Yes| F["SessionFactory.CreateSession(connection)"]
S -->|No| E{"connection.Attributes.Count > MinAttributesForPersistence?"}
E -->|No| Z
E -->|Yes| F
F --> G["ISessionStore.StoreAsync(session)"]Khi SessionFactory.CreateSession(IConnection connection) chụp nhanh một kết nối đang đóng thành một SessionEntry lấy từ pool:
SessionTokenđược đặt bằngconnection.ConnectionId.CreatedAtUnixMillisecondsvàExpiresAtUnixMilliseconds(now + (long)_options.SessionTtl.TotalMilliseconds) được ghi lại bằngClock.UnixMillisecondsNow().Secret,Algorithm,Levelvà bộ đếm sequence TCP/UDP được sao chép từ kết nối.connection.Attributesđược sao chép vào mộtObjectMap<AttributeKey, object>lấy từ pool.
Chính sách lưu trữ tự động (DefaultSessionPersistencePolicy)
SessionPersistenceObserver đăng ký nhận sự kiện IConnectionHub.ConnectionUnregistered và gọi SessionService.SaveSessionAsync(snapshot) bất đồng bộ. DefaultSessionPersistencePolicy.ShouldPersist(IConnection) đánh giá ba quy tắc theo thứ tự:
- Chính sách 1 (Cổng bắt tay): Nếu
!connection.GetRuntimeState().HandshakeEstablished, trả vềfalse. - Chính sách 2 (Phiên mật mã đang hoạt động): Nếu
!connection.Secret.IsZero(đã thiết lập khóa mã hóa 32 byte đang hoạt động), trả vềtruengay lập tức. - Chính sách 3 (Dự phòng theo số lượng thuộc tính): Ngược lại, trả về
connection.Attributes.Count > _options.MinAttributesForPersistence(mặc định10).
Cơ chế của InMemorySessionStore
Khi không có ISessionStore tùy chỉnh nào được inject vào SessionService, hệ thống tạo một InMemorySessionStore (dung lượng mặc định MaxSessions = 65_536) và đăng ký nó như một IWorker trên TaskManager:
- Hết hạn theo bucket theo phút: Các phiên được lập chỉ mục trong
ConcurrentDictionary<ulong, SessionEntry>cùng với các bucket hết hạn 1 phút (BucketSpanMilliseconds = 60_000), để worker dọn dẹpIWorkerchạy nền chỉ kiểm tra những bucket có dấu thời gian đã trôi qua. - Tiêu thụ nguyên tử một lần:
ConsumeAsync(ulong sessionToken, Func<SessionEntry, bool>? predicate, CancellationToken)kiểm tra thời gian hết hạn vàpredicatetùy chọn trước khi xóa nguyên tử entry và trả vềValueTask<SessionScope>(new SessionScope(null)vớiscope.IsValid == falsenếu không tìm thấy, đã hết hạn hoặc bịpredicatetừ chối). Khi dispose mộtSessionScopehợp lệ,SessionEntryvàObjectMap<AttributeKey, object>của nó tự động được trả về pool.
Ví dụ cấu hình
Cấu hình bằng code
using System;
using Nalix.Hosting;
using Nalix.Runtime.Options;
INetworkApplicationBuilder builder = NetworkApplication.CreateBuilder();
builder.Configure<SessionStoreOptions>(options =>
{
options.SessionTtl = TimeSpan.FromMinutes(10);
options.MinAttributesForPersistence = 3;
});
Cấu hình INI (default.ini)
[SessionStore]
SessionTtl = 00:05:00
MinAttributesForPersistence = 10