簡體   English   中英

grpc WriteAsync 鎖定服務器

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM