我试图使用protobuf-net.grpc ( gRPC Framework4.8)中的gRPC服务器流在服务器和多个客户机之间编写一个通知系统。
我的服务是以这个例子为基础的。但是,如果我正确理解这个示例,它只能处理单个订阅服务器(因为_subscriber是StockTickerService类的成员变量)。
我的测试服务如下所示:
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时通知所有客户端发布于 2022-11-10 15:38:05
对于1,您需要一个发布者/订阅者API的实现;每次对SubscribeAsync的调用总是表示gRPC端点之间的单个会话,因此您需要自己的机制来向多个消费者广播。也许RX是值得研究的
对于2,context.CancellationToken应由客户端断开连接触发。
https://stackoverflow.com/questions/74387625
复制相似问题