C# 如何通过异步GRPC调用高效地管理内存
当使用GRPC“触发并忘记”消息时,我们遇到了内存问题 我们有一个管理数据库请求的服务a和一个将事件数据发布到外部数据源的服务B 这两个服务都实现GRPC服务以与它们通信。例如,服务B的定义如下: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中,我们可能会进行数千次调用来“触发并忘记”
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支持的流媒体选项之一,该选项允许发送方发送尽可能多的消息(只要流控制支持),而无需等待接收方的响应?