C# 如何通过异步GRPC调用高效地管理内存

C# 如何通过异步GRPC调用高效地管理内存,c#,multithreading,memory-management,concurrency,grpc,C#,Multithreading,Memory Management,Concurrency,Grpc,当使用GRPC“触发并忘记”消息时,我们遇到了内存问题 我们有一个管理数据库请求的服务a和一个将事件数据发布到外部数据源的服务B 这两个服务都实现GRPC服务以与它们通信。例如,服务B的定义如下: service MessageBusService { rpc PublishRevision (RevisionRequest) returns (EmptyResponse) {} } message EmptyResponse{ } 在服务A中,我们可能会进行数千次调用来“触发并忘记”

当使用GRPC“触发并忘记”消息时,我们遇到了内存问题

我们有一个管理数据库请求的服务a和一个将事件数据发布到外部数据源的服务B

这两个服务都实现GRPC服务以与它们通信。例如,服务B的定义如下:

service MessageBusService {
    rpc PublishRevision (RevisionRequest) returns (EmptyResponse) {}
}
message EmptyResponse{
}
在服务A中,我们可能会进行数千次调用来“触发并忘记”异步服务调用

_ = grpcClient.PublishRevisionAsync(revision);
其中“修订”对象的大小可以是~1MB。在执行内存分析时,我们注意到该服务的内存消耗可能达到600MB以上。这似乎是由于这样一个事实,即我们派生的任务将保留在内存中的对象上,直到GRPC服务用“EmptyResponse”对象响应为止

有人知道GRPC是否支持真正“启动并忘记”服务的方法,或者是否有方法托管一个明确不发送响应的服务

有没有更好的方法来执行此任务


任何帮助都将不胜感激。

以防其他人遇到此问题并需要解决方案。好的,经过一些研究,我想出了一种简单的方法来做我想做的事

service MessageBusService {
    rpc PublishRevision (stream RevisionRequest) returns (EmptyResponse) {}
}
message EmptyResponse{
}

您可以通过将每个元素写入流来“触发并忘记”GRPC端点,因为您不希望每次写入流都得到响应


microsofts页面上有一些过时的示例

您是否尝试过gRPC支持的流媒体选项之一,该选项允许发送方发送尽可能多的消息(只要流控制支持),而无需等待接收方的响应?