You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何追踪HotChocolate内存订阅的订阅者?是否有连接事件可挂钩?

HotChocolate内存订阅:订阅者追踪与连接事件机制

一、追踪特定订阅的订阅者

默认内存订阅提供器没有直接暴露订阅者查询接口,但可以通过自定义扩展实现追踪:

  • 实现ISubscriptionInterceptor接口,重写OnSubscribeAsync方法,在订阅创建时记录连接ID、订阅字段/主题、用户标识等关联信息,存入自定义内存缓存或数据库。
  • 重写OnUnsubscribeAsync方法,在订阅取消时移除对应记录。

示例代码片段:

public class CustomSubscriptionInterceptor : DefaultSubscriptionInterceptor
{
    private readonly ISubscriberTracker _tracker;

    public CustomSubscriptionInterceptor(ISubscriberTracker tracker)
    {
        _tracker = tracker;
    }

    public override ValueTask OnSubscribeAsync(ISubscription subscription, CancellationToken ct)
    {
        var connectionId = subscription.Context.ConnectionId;
        var userId = subscription.Context.GetUser().Id;
        var subscriptionField = subscription.Field.Name;

        _tracker.TrackSubscriber(connectionId, userId, subscriptionField);
        
        return base.OnSubscribeAsync(subscription, ct);
    }

    public override ValueTask OnUnsubscribeAsync(ISubscription subscription, CancellationToken ct)
    {
        var connectionId = subscription.Context.ConnectionId;
        _tracker.UntrackSubscriber(connectionId);
        
        return base.OnUnsubscribeAsync(subscription, ct);
    }
}

二、可挂钩的连接与订阅事件

HotChocolate提供多类生命周期钩子,用于捕获关键事件:

  1. 连接生命周期钩子:实现IConnectionInterceptor接口,捕获连接建立、断开事件:

    • OnConnectAsync:客户端建立WebSocket连接时触发,可记录连接基础信息。
    • OnDisconnectAsync:客户端断开连接时触发,可清理该连接的所有订阅记录。

    示例代码:

    public class CustomConnectionInterceptor : DefaultConnectionInterceptor
    {
        private readonly ISubscriberTracker _tracker;
    
        public CustomConnectionInterceptor(ISubscriberTracker tracker)
        {
            _tracker = tracker;
        }
    
        public override ValueTask OnConnectAsync(IConnection connection, CancellationToken ct)
        {
            _tracker.RecordConnection(connection.Id, connection.Context.GetUser().Id);
            return base.OnConnectAsync(connection, ct);
        }
    
        public override ValueTask OnDisconnectAsync(IConnection connection, CancellationToken ct)
        {
            _tracker.CleanupConnectionSubscriptions(connection.Id);
            return base.OnDisconnectAsync(connection, ct);
        }
    }
    
  2. 订阅生命周期钩子:通过ISubscriptionInterceptor直接拦截订阅的创建、取消动作,是追踪订阅者最直接的方式。

三、注册自定义拦截器

在DI容器中注册自定义拦截器,覆盖默认实现:

services.AddGraphQLServer()
    .AddSubscriptionType<SubscriptionType>()
    .AddInMemorySubscriptions()
    .AddConnectionInterceptor<CustomConnectionInterceptor>()
    .AddSubscriptionInterceptor<CustomSubscriptionInterceptor>();

内容的提问来源于stack exchange,提问作者Jack

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 13:10:00