首页 > 解决方案 > .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 的调用:没有它们,我可以看到内存使用量越来越大,直到整个应用程序耗尽内存并重新启动。

现在我的问题:

谢谢!

标签: c#asp.net-coregoogle-cloud-platformgoogle-cloud-pubsub

解决方案


推荐阅读