Лучшие практики для шаблона производитель-потребитель в .NetC#

Место общения программистов C#
Ответить
Anonymous
 Лучшие практики для шаблона производитель-потребитель в .Net

Сообщение Anonymous »

Я работаю над реализацией шаблона производитель-потребитель в приложении на основе .NET, используя драйвер Npgsql для подключения к CockroachDB, и мне нужна помощь.
Сценарий:
При использовании асинхронной задачи для выполнения запросов приложение успешно устанавливает около 300 соединений с CockroachDB и достигает ожидаемой пропускной способности. Однако это приводит к значительному использованию памяти приложением.

Код: Выделить всё

Task.Run(() => ReturnImpactedRecordsFromQuery(procedureName, DatabaseType, querytype, parameters));
С другой стороны, при использовании TaskRunner с System.Threading.Channel (для реализации шаблона производитель-потребитель) для предотвращения утечек памяти число количество одновременных подключений к базе данных ограничено 10–15, а пропускная способность падает примерно до 10 % от ожидаемой производительности.

Код: Выделить всё

await TaskController.QueueTask(async () =>
{
cnt = await ReturnImpactedRecordsFromQuery(procedureName, databaseType, queryType, parameters);
});

Код: Выделить всё

using System;
using System.Collections.Generic;
using System.Threading.Channels;
using System.Threading.Tasks;

namespace Procedures
{
public static class TaskController
{
private static Channel channel = Channel.CreateBounded(new BoundedChannelOptions(Math.Max(1, Environment.ProcessorCount * 1000))
{
FullMode = BoundedChannelFullMode.Wait // Wait when the channel is full
});

static TaskController()
{
Task.Run(ProcessChannelAsync);
}

public static void QueueTask(Func task)
{
// Enqueue the work to the channel
channel.Writer.TryWrite(task);
}

private static async Task ProcessChannelAsync()
{
while (await channel.Reader.WaitToReadAsync())
{
while (channel.Reader.TryRead(out var workItem))
{
await workItem();
}
}
}
}
}

Как лучше всего сбалансировать количество одновременных подключений и достичь желаемой пропускной способности, одновременно управляя использованием памяти в настройке производитель-потребитель для операций с базой данных с помощью Npgsql и CockroachDB?
Мы будем очень признательны за любые предложения, рекомендации или примеры кода!

Подробнее здесь: https://stackoverflow.com/questions/792 ... ern-in-net
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»