【问题标题】:Publish/Subcribe Notification Service Over gRPC Using protobuf-net.grpc使用 protobuf-net.grpc 通过 gRPC 发布/订阅通知服务
【发布时间】:2022-11-10 23:38:05
【问题描述】:

我正在尝试使用 protobuf-net.grpc (.NET Framework 4.8) 中的 gRPC 服务器流在服务器和多个客户端之间编写通知系统。

我的服务基于this example。但是,如果我正确理解了这个例子,它只能处理一个订阅者(因为_subscriberStockTickerService 类的成员变量)。

我的测试服务如下所示:

private readonly INotificationService _notificationService;
private readonly Channel<Notification> _channel;

public ClientNotificationService(INotificationService notificationService)
{
    _notificationService = notificationService;
    _notificationService.OnNotification += OnNotification;
    _channel = Channel.CreateUnbounded<Notification>();
}

private async void OnNotification(object sender, Notification notification)
{
    await _channel.Writer.WriteAsync(notification);
}

public IAsyncEnumerable<Notification> SubscribeAsync(CallContext context = default)
{
    return _channel.AsAsyncEnumerable(context.CancellationToken);
}

INotificationService 只是有一个事件OnNotification,它在调用它的Notify 方法时被触发。

然后我意识到 System.Threading.Channels 实现了生产者/消费者模式,但我需要发布者/订阅者模式。尝试时,确实只有一个客户收到通知,而不是所有客户。 如果服务器知道客户端何时断开连接也会很好,这在返回_channel.AsAsyncEnumerable 时似乎是不可能的。

那么我该如何修改它以便

  • 服务多个客户,当OnNotification 被调用时,所有客户都会收到通知
  • 并在客户端断开连接时记录?

【问题讨论】:

    标签: c# .net publish-subscribe protobuf-net protobuf-net.grpc


    【解决方案1】:

    对于 1,您需要一个发布者/订阅者 API 的实现;对SubscribeAsync 的每次调用将始终代表 gRPC 端点之间的单个对话,因此您需要自己的机制将其广播给多个消费者。也许RX值得在那里研究

    对于 2,context.CancellationToken 应该由 client-disconnect 触发

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-01
      相关资源
      最近更新 更多