[英]grpc WriteAsync locking up server
Grpc.Core 2.38.0
我有一组使用 grpc 流参与进程间通信的应用程序。 我们不时注意到服务器进程中的锁定和内存耗尽(由于锁定)无法完成对IAsyncStreamWriter.WriteAsync(...)
的调用
最近对 grpc (.net) 的更改WriteAsync
API 更改为接受CancellationToken
,但这在Grpc.Core
包中不可用。
接受流的配置错误的 grpc 客户端可能会导致死锁。 如果客户端在错误处理过程中没有处理AsyncServerStreamingCall
,那么服务端就会发生死锁。
例子:
async Task ClientStreamingThread()
{
while (...)
{
var theStream = grpcService.SomeStream(new());
try
{
while (await theStream.ResponseStream.MoveNext(shutdownToken.Token))
{
var theData = theStream.ResponseStream.Current;
}
}
catch (RpcException)
{
// if an exception occurs, start over, reopen the stream
}
}
}
上面的示例包含行为不端的客户端。 如果发生RpcException
,我们将返回到 while 循环的开头并打开另一个流而不清理前一个流。 这会导致死锁。
通过处置前一个流来“修复”客户端代码,如下所示:
async Task ClientStreamingThread()
{
while (...)
{
// important. dispose of theStream if it goes out of scope
using var theStream = grpcService.SomeStream(new());
try
{
while (await theStream.ResponseStream.MoveNext(shutdownToken.Token))
{
var theData = theStream.ResponseStream.Current;
}
}
catch (RpcException)
{
// if an exception occurs, start over, reopen the stream
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.