Tài liệu

Tùy chọn Timing Wheel

Thời gian đọc 2 phút Gói: Nalix.Network
Trên trang này

Không gian tên: Nalix.Network.Options
Assembly: Nalix.Network

TimingWheelOptions (public sealed partial class TimingWheelOptions : ConfigurationLoader, IValidatableConfiguration) cấu hình bộ hẹn giờ hashed wheel (TimingWheel) mà Nalix.Network dùng để phát hiện và đóng các kết nối nhàn rỗi.

Ánh xạ mã nguồn

  • src/Nalix.Network/Options/TimingWheelOptions.cs
  • src/Nalix.Network/Internal/Time/TimingWheel.cs
  • src/Nalix.Network/Connections/Connection.cs

Giá trị mặc định và kiểm tra hợp lệ

Được tải từ mục [TimingWheel] trong default.ini:

Thuộc tínhKiểuMặc địnhKiểm tra hợp lệTác động khi chạy
BucketCountint512[ValueRange(1, int.MaxValue)]Số lượng slot TimingWheelBucket trong wheel (giá trị lũy thừa của 2 cho phép đánh chỉ mục bằng bitmask).
TickDurationint1000[ValueRange(1, int.MaxValue)]Khoảng tick tính bằng mili giây cho vòng lặp worker PeriodicTimer chạy nền.
IdleTimeoutMsint60_000 (60s)[ValueRange(1, int.MaxValue)]Ngưỡng nhàn rỗi mặc định của kết nối tính bằng mili giây trước khi Disconnect() được gọi.
WheelDrainTimeoutMsint5000 (5s)[ValueRange(0, 60000)]Thời gian chờ tối đa tính bằng mili giây để worker timing wheel xả hết công việc một cách êm thuận trong Deactivate.

Validate() chạy this.ValidateDataAnnotations() và ném ValidationException khi vi phạm ràng buộc.

Luồng bucket và tác vụ khi chạy

Architecture Diagram
flowchart LR
    A["TimingWheel Constructed"] --> B["Load & Validate TimingWheelOptions"]
    B --> C["Allocate TimingWheelBucket[BucketCount] + Lock[]"]
    C --> D["Activate() -> ScheduleWorker"]
    D --> E["PeriodicTimer Tick (TickDuration ms)"]
    E --> F["Process Current TimingWheelBucket"]
    F --> G{"idleMs >= conn.IdleTimeoutMs?"}
    G -->|Yes| H["conn.Disconnect()"]
    G -->|No| I["Reschedule TimeoutTask into Future Bucket"]
  • Mỗi TimingWheelBucket dùng danh sách liên kết đôi gồm các instance TimeoutTask lấy từ pool, được bảo vệ bằng khóa monitor riêng của bucket (lock (bucket)) để chèn và xóa với độ phức tạp $O(1)$.
  • Connection, WebSocketConnection và PassthroughConnection khởi tạo IdleTimeoutMs riêng cho từng kết nối từ TimingWheelOptions.IdleTimeoutMs, và có thể ghi đè động qua connection.UpdateIdleTimeout(newTimeoutMs).

API liên quan