Middleware Pipeline
Trên trang này
Không gian tên: Nalix.Runtime.Middleware
Assembly: Nalix.Runtime
MiddlewarePipeline<TPacket> (internal sealed class MiddlewarePipeline<TPacket> where TPacket : IPacket) điều phối việc thực thi IPacketMiddleware<TPacket> theo chiều inbound và outbound quanh các terminal handler của gói tin. Nó dùng các mảng PipelineSnapshot bất biến, một pool runner cục bộ PooledPipelineContext 32 slot theo bitmask, và gọi terminal có kiểu trực tiếp, nên không cấp phát closure cho mỗi gói tin.
Ánh xạ mã nguồn
src/Nalix.Runtime/Middleware/MiddlewarePipeline.cssrc/Nalix.Runtime/Middleware/MiddlewarePipeline.Types.cssrc/Nalix.Abstractions/Middleware/IPacketMiddleware.cssrc/Nalix.Abstractions/Middleware/MiddlewareOrderAttribute.cssrc/Nalix.Abstractions/Middleware/MiddlewareStageAttribute.cs
Contract middleware (IPacketMiddleware<TPacket>)
namespace Nalix.Abstractions.Middleware;
public interface IPacketMiddleware<TPacket> where TPacket : IPacket
{
ValueTask InvokeAsync(
IPacketContext<TPacket> context,
Func<CancellationToken, ValueTask> next);
}
- Gọi
await next(token)để chuyển sang middleware tiếp theo hoặc sang terminal handler. - Trả về mà không gọi
nextsẽ short-circuit pipeline (handler và các giai đoạn outbound không chạy).
Đăng ký và thứ tự (Use)
Được cấu hình qua PacketDispatchOptions<TPacket>.WithMiddleware(middleware):
- Ném
ArgumentNullExceptionnếumiddlewarelànull. - Ném
InternalErrorExceptionnếu cùng một instance middleware được đăng ký hai lần. - Đọc
[MiddlewareOrder(int)](mặc định0) và[MiddlewareStage(MiddlewareStage, AlwaysExecute = bool)](mặc địnhMiddlewareStage.Inbound,AlwaysExecute = false), cache metadata theoType. - Sắp xếp các danh sách theo giai đoạn và xuất một
PipelineSnapshotbất biến mới:- Inbound: sắp xếp theo
Ordertăng dần (a.Order.CompareTo(b.Order)). - OutboundAlways: sắp xếp theo
Ordergiảm dần (b.Order.CompareTo(a.Order)). - Outbound: sắp xếp theo
Ordergiảm dần (b.Order.CompareTo(a.Order)).
- Inbound: sắp xếp theo
| Middleware tích hợp sẵn | Giai đoạn | Order | Mục đích |
|---|---|---|---|
PermissionMiddleware | Inbound | -50 | Kiểm tra cấp quyền [PacketPermission] theo kiểu fail-closed. |
RateLimitMiddleware | Inbound | 50 | Kiểm tra [PacketRateLimit] (PolicyRateLimiter) hoặc TokenBucketLimiter theo endpoint. |
TimeoutMiddleware | Inbound | 75 | Lớp bọc hủy theo [PacketTimeout] cho từng handler. |
Vòng đời thực thi và runner lấy từ pool
flowchart TD
A["ExecuteAsync(context, dispatch, descriptor, ct)"] --> B{"snapshot.IsEmpty?"}
B -->|Yes| C["dispatch.ExecuteTerminalHandler(descriptor, context, ct)"]
B -->|No| D["Acquire PooledPipelineContext (32-slot local bitmask pool or ObjectPoolManager)"]
D --> E["Stage 1: Inbound (ascending Order)"]
E -->|Calls next(inboundCt)| F["CREATE_EXECUTION_TOKEN(inboundCt, rootCt) + ExecuteTerminalHandler"]
E -->|Short-circuits| K["Return PooledPipelineContext"]
F --> G["Stage 2: OutboundAlways (descending Order, runs even if handler threw OperationCanceledException)"]
G --> H{"!context.SkipOutbound && !token.IsCancellationRequested?"}
H -->|Yes| I["Stage 3: Outbound (descending Order)"]
H -->|No| J["Re-throw OperationCanceledException if handler cancelled"]
I --> J
J --> KTruyền hủy giữa handler và OutboundAlways
Khi terminal handler ném OperationCanceledException (ví dụ khi TimeoutMiddleware hủy inboundCt):
EXECUTE_HANDLER_FULL_ASYNCbắt tạm thờiOperationCanceledException.- Chạy toàn bộ middleware
OutboundAlwaysđể logic audit và dọn dẹp vẫn được thực thi. - Ném lại
OperationCanceledExceptionsau khiOutboundAlwayshoàn tất, đểTimeoutMiddlewarephía trên có thể nhận biết timeout và gửiDirective(TIMEOUT).
Xử lý lỗi (ConfigureErrorHandling)
Được cấu hình qua PacketDispatchOptions<TPacket>.WithErrorHandlingMiddleware(bool continueOnError, Action<Exception, Type>? errorHandler = null):
continueOnError = false(mặc định): Các ngoại lệ không nghiêm trọng của middleware làm tăngTotalErrorsvà được truyền lên người gọi, kết thúc pipeline.continueOnError = true: GọierrorHandler(ex, middlewareType)rồi gọinext(token)để tiếp tục thực thi pipeline.
Cấu trúc telemetry (PipelineMetrics và PerMiddlewareMetrics)
Được cung cấp qua PacketDispatchOptions<TPacket>.Metrics và PacketDispatchOptions<TPacket>.MiddlewareMetrics:
PipelineMetrics:ActiveExecutions(long),TotalExecutions(long),TotalExecutionTicks(long),MaxExecutionTicks(long),TotalErrors(long),AverageExecutionTime(TimeSpan).PerMiddlewareMetrics:MiddlewareType(Type),TotalExecutions(long),TotalExecutionTicks(long),MaxExecutionTicks(long),TotalErrors(long).