[英]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.