小编Esp*_*pen的帖子

如何在内存使用量不持续增长的情况下使用 Event Store DB 客户端?

我正在使用.Net 的事件存储客户端,并且正在努力寻找使用该客户端的正确方法。当我在 .Net 依赖注入中将客户端注册为单例并在较长时间内运行我的应用程序时,内存使用量会随着每次订阅而不断增长。

我通过以下方式创建并注册客户端。可以在此处找到遇到该问题的完整最小应用程序

var esdbConnectionString = configuration.GetValue("ESDB_CONNECTION_STRING", "esdb://admin:changeit@localhost:2113?tls=false");
var eventStoreClientSettings = EventStoreClientSettings.Create(esdbConnectionString);
var eventStoreClient = new EventStoreClient(eventStoreClientSettings);
services.AddSingleton(eventStoreClient);
Run Code Online (Sandbox Code Playgroud)

我的应用程序在很长一段时间内有大量短流

重现

重现该行为的步骤:

  1. 按照文档中的建议将 EventStoreClient 注册为单例。
  2. 在较长时间内订阅大量流。
  3. 取消发送到流订阅中的 CancellationToken 并让它被垃圾收集。
  4. 观察服务的内存使用量增长。

我如何创建和订阅流:

var streamName = CreateStreamName();
var payload = new PingEvent { StreamNr = _currentStreamNumber };
var eventData = new EventData(Uuid.NewUuid(), typeof(PingEvent).Name, EventSerialization.SerializeEventData(payload));
await _client.AppendToStreamAsync(streamName, StreamState.Any, new[] { eventData });

var streamCancellationTokenSource = new CancellationTokenSource(TimeSpan.FromMinutes(30));

await _client.SubscribeToStreamAsync(streamName, FromStream.Start, async (sub, evnt, token) =>
{
    if (evnt.Event.EventType …
Run Code Online (Sandbox Code Playgroud)

dependency-injection grpc eventstoredb grpc-c# .net-6.0

5
推荐指数
1
解决办法
436
查看次数