Tài liệu

Tùy chọn Packet Dispatch

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

Không gian tên: Nalix.Runtime.Routing, Nalix.Runtime.Options
Assembly: Nalix.Runtime

PacketDispatchOptions<TPacket> (public sealed partial class PacketDispatchOptions<TPacket> : IPacketHandlerBuilder<TPacket> where TPacket : IPacket) cấu hình bảng tra cứu handler $O(1)$ gồm 65,536 slot, MiddlewarePipeline<TPacket>, các hook xử lý lỗi và PacketDrainOptions cho PacketDispatchChannel.

Ánh xạ mã nguồn

  • src/Nalix.Runtime/Dispatching/Options/PacketDispatchOptions.cs
  • src/Nalix.Runtime/Dispatching/Options/PacketDispatchOptions.PublicMethods.cs
  • src/Nalix.Runtime/Dispatching/Options/PacketDispatchOptions.Execution.cs
  • src/Nalix.Runtime/Options/PacketDrainOptions.cs

Thuộc tính công khai của PacketDispatchOptions<TPacket>

Thuộc tínhKiểuMô tả
DrainPacketDrainOptionsSố vòng lặp worker, ghim lõi CPU và ngân sách xả gói tin cho mỗi lần đánh thức.
MetricsPipelineMetricsSố liệu thực thi tổng hợp (ActiveExecutions, TotalExecutions, TotalExecutionTicks, MaxExecutionTicks, TotalErrors, AverageExecutionTime).
MiddlewareMetricsReadOnlySpan<PerMiddlewareMetrics>Bộ đếm thực thi và lỗi cho từng middleware.

PacketDrainOptions (Nalix.Runtime.Options)

Được tải từ [PacketDrain] trong default.ini hoặc cấu hình qua options.Drain:

Thuộc tínhKiểuMặc địnhKiểm tra hợp lệMô tả
Countint0 (tự động)[ValueRange(0, 1024)]Số vòng lặp worker dispatch tường minh (0 dùng Math.Clamp(Environment.ProcessorCount, MinDispatchLoops, MaxDispatchLoops)).
MaxDrainPerWakeMultiplierint5[ValueRange(1, 10000)]Hệ số nhân áp dụng cho Environment.ProcessorCount để tính ngân sách xả gói tin cho mỗi lần đánh thức.
MinDrainPerWakeint64[ValueRange(1, 1000000)], <= MaxDrainPerWakeSố gói tin tối thiểu được xả từ một phiên kết nối đã chiếm giữ trong mỗi lần đánh thức.
MaxDrainPerWakeint2048[ValueRange(1, 1000000)], >= MinDrainPerWakeSố gói tin tối đa được xả từ một phiên kết nối đã chiếm giữ trong mỗi lần đánh thức.
MinDispatchLoopsint1[ValueRange(1, 1024)], <= MaxDispatchLoopsSố vòng lặp worker tối thiểu khi Count == 0.
MaxDispatchLoopsint64[ValueRange(1, 1024)], >= MinDispatchLoopsSố vòng lặp worker tối đa khi Count == 0.
DispatchProcessorAffinitiesstring""Các chỉ số lõi CPU phân tách bằng dấu phẩyChỉ số lõi CPU tùy chọn (ví dụ "0,2,4,6"). Khi không rỗng, tạo một luồng OS riêng cho mỗi lõi được liệt kê, ghim qua ProcessorAffinity.
VirtualOpCodeOffsetushort0x1000 (4096)[ValueRange(0, 65535)]Độ lệch cộng thêm bởi bộ phân loại giao thức bên ngoài khi ánh xạ ID gói tin lạ sang opcode của Nalix.

Phương thức cấu hình fluent (PacketDispatchOptions<TPacket>)

Phương thứcChữ kýHành vi
WithHandler<TController>()public PacketDispatchOptions<TPacket> WithHandler<TController>() where TController : classTạo TController qua InstanceManager.Instance.CreateInstanceWithInjection<TController>() (phân giải các phụ thuộc của constructor từ InstanceManager) và đăng ký các handler [PacketOpcode] do source generator sinh ra.
WithHandler<TController>(instance)public PacketDispatchOptions<TPacket> WithHandler<TController>(TController instance) where TController : classĐăng ký handler bằng một instance singleton TController có sẵn.
WithHandler<TController>(factory)public PacketDispatchOptions<TPacket> WithHandler<TController>(Func<TController> factory) where TController : classĐăng ký handler bằng một delegate factory tùy chỉnh. Ném InternalErrorException nếu TController thiếu [PacketHandler] hoặc có opcode bị đăng ký trùng.
WithHandler(Type) / WithHandler(Type, Func<object>)public PacketDispatchOptions<TPacket> WithHandler(Type controllerType, ...)Các overload đăng ký controller không generic (hữu ích cho các lớp handler static).
WithMiddlewarepublic PacketDispatchOptions<TPacket> WithMiddleware(IPacketMiddleware<TPacket> middleware)Đăng ký một instance IPacketMiddleware<TPacket> vào pipeline.
WithDispatchLoopCountpublic PacketDispatchOptions<TPacket> WithDispatchLoopCount(int? loopCount)Đặt Drain.Count (1..64, hoặc null để tự động tính theo CPU; ném ArgumentOutOfRangeException nếu nằm ngoài 1..64).
WithErrorHandlingpublic PacketDispatchOptions<TPacket> WithErrorHandling(Action<Exception, ushort> errorHandler)Đăng ký callback được gọi với (exception, opCode) khi handler ném ngoại lệ không phải teardown, trước khi gửi phản hồi Directive(FAIL) tự động.
WithErrorHandlingMiddlewarepublic PacketDispatchOptions<TPacket> WithErrorHandlingMiddleware(bool continueOnError, Action<Exception, Type>? errorHandler = null)Cấu hình việc MiddlewarePipeline<TPacket> tiếp tục hay hủy khi một middleware ném lỗi.

Ví dụ sử dụng

using Nalix.Runtime.Dispatching;
using Nalix.Runtime.Middleware.Standard;

PacketDispatchChannel channel = new(options =>
{
    options.WithDispatchLoopCount(null)
           .WithErrorHandling((ex, opCode) =>
           {
               // Ghi lại telemetry ngoại lệ của handler
           })
           .WithMiddleware(new PermissionMiddleware())
           .WithMiddleware(new RateLimitMiddleware())
           .WithMiddleware(new TimeoutMiddleware())
           .WithHandler<AuthController>()
           .WithHandler<ChatController>();
});

API liên quan