首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用protobuf-net.grpc在gRPC上发布/订阅通知服务

使用protobuf-net.grpc在gRPC上发布/订阅通知服务
EN

Stack Overflow用户
提问于 2022-11-10 10:39:57
回答 1查看 53关注 0票数 1

我试图使用protobuf-net.grpc ( gRPC Framework4.8)中的gRPC服务器流在服务器和多个客户机之间编写一个通知系统。

我的服务是以这个例子为基础的。但是,如果我正确理解这个示例,它只能处理单个订阅服务器(因为_subscriberStockTickerService类的成员变量)。

我的测试服务如下所示:

代码语言:javascript
复制
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时通知所有客户端
  • 然后在客户端断开连接时登录?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-11-10 15:38:05

对于1,您需要一个发布者/订阅者API的实现;每次对SubscribeAsync的调用总是表示gRPC端点之间的单个会话,因此您需要自己的机制来向多个消费者广播。也许RX是值得研究的

对于2,context.CancellationToken应由客户端断开连接触发。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74387625

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档