c# - .NET Core GCP PublisherClient 内存泄漏
问题描述
我认为我在 .NET Core 中使用 GCP PubSub PublisherClient 实现可能存在内存泄漏。我写了“我认为”,因为公平地说,我什至不确定我是否正确使用它(这就是我在这里发布这个问题的原因)。
该应用程序是一个 .NET Core Web API。这是我所拥有的实现的摘录:
public class GoogleTopicPublisher : IAsyncDisposable
{
private readonly TopicName _topic;
private readonly string _apiToken;
private readonly ILogger<GoogleTopicPublisher> _logger;
private readonly Lazy<Task<PublisherClient>> _lazyPublisher;
public GoogleTopicPublisher(string projectId, string topicId, string apiToken,
ILogger<GoogleTopicPublisher> logger)
{
_apiToken = apiToken;
_topic = new TopicName(projectId, topicId);
_logger = logger;
_lazyPublisher = new Lazy<Task<PublisherClient>>(() => PublisherClient.CreateAsync(_topic));
}
public async Task PublishAsync(PubSubEnvelope envelope)
{
var messageData = Newtonsoft.Json.JsonConvert.SerializeObject(envelope);
var message = new PubsubMessage()
{
Data = ByteString.CopyFromUtf8(messageData),
Attributes =
{
{"token", _apiToken }
}
};
var publisher = await _lazyPublisher.Value;
await publisher.PublishAsync(message);
GC.Collect();
GC.WaitForPendingFinalizers();
}
public async ValueTask DisposeAsync()
{
if (!_lazyPublisher.IsValueCreated)
return;
var publisher = _lazyPublisher.Value.Result;
await publisher.ShutdownAsync(TimeSpan.FromSeconds(15));
}
}
整个GoogleTopicPublisher
班级注册为单身人士。如您所见,我正在使用异步延迟实例化 Publisher,以避免每次必须发布消息时都创建新实例。
痛点是对 GC 的调用:没有它们,我可以看到内存使用量越来越大,直到整个应用程序耗尽内存并重新启动。
现在我的问题:
- 以这种方式实例化 PublisherClient 是一种好习惯吗?如果没有,有没有更好的方法?
- 我可以以任何方式避免对 GC 的调用吗?
谢谢!
解决方案
推荐阅读
- session - Codeigniter 4如何取消设置会话
- angular - “字符串”类型不存在属性“replaceAll”
- php - 卷曲信息返回 Instagram API 的 HTTP 代码 404
- javascript - 当表单字段获得焦点时(通过鼠标单击或通过 Tab 键),我可以调用 DOM API 中的哪些事件回调
- nim-lang - 在 Nim 中使用与 Iterator 同名的 Proc 是否安全?
- android - 颤振中的302响应
- javascript - 设置为全局的变量不设置元素样式
- c# - 如何创建类似于呼吸泡芙的Unity3d高斯羽流
- json - 如何使用 Vuejs 从 json 对象访问父元素
- docker - k3s 上的默认 Traefik 入口控制器提供“网关超时”