Воспроизведение проекций CQRS / ES с EF Core - PullRequest
0 голосов
/ 20 мая 2019

Я использую ядро ​​EF в качестве ORM, на котором мои события ES воспроизводятся для стороны чтения моего приложения CQRS.

Я создал новую функцию, которая требует некоторой модификации проекций, и какони представлены.Я хочу отбросить текущую модель чтения и перепроектировать поток, чтобы перестроить модель.

Производительность была низкой, так как каждый раз, когда я создаю новый контекст, и сохраняю его, повторяя события;

foreach (var event in events)
{
    using (var scope = _container.BeginScope('projection-scope'))
    using (var dbContext = scope.Resolve<MyDbContext>())
    {
        await scope.Resolve<IMediator>().Publish(event);
        await context.SaveChangesAsync();
    }
}

Я использую DI-контейнеры для предотвращения вызова персистентности из обработчика в попытке пакетирования проекций и повышения производительности, но я сталкиваюсь с растущими трудностями, связанными сущностями, связями и другимиПроблемы с SQL.

Является ли это разумной стратегией для объединения нескольких операций в контексте EF или лучше отказаться от ORM и перейти к подходу прямого SQL (возможно, с использованием dapper)?

1 Ответ

0 голосов
/ 20 мая 2019

При работе с большим количеством событий вам следует рассмотреть возможность разделения потока событий для параллельного создания ваших прогнозов. Вы можете разделить ваш поток на основе AggregateId, чтобы ваши обновления обрабатывались последовательно в Aggregate. Исходя из текущей пропускной способности и желаемой пропускной способности, вы сможете разделить поток в соответствии с вашими требованиями.

Кроме того, поскольку вы используете источник событий, я бы сказал, что EF является избыточным с логической точки зрения и, безусловно, затягивает вас с точки зрения производительности. Вам действительно нужен способ обновить базу данных на основе события. В этом случае будет достаточно простого ADO.NET, предположительно вызывающего хранимые процедуры. Чтобы избежать рукописного ввода всего этого кода, вы можете сгенерировать его, используя шаблоны t4 или другой генератор по вашему выбору.

...