источник событий - обработка пакетных транзакций - PullRequest
0 голосов
/ 15 сентября 2018

Я хотел бы внедрить источник событий в имеющееся у меня веб-приложение. Моя реализация - .NET Core WEB API, но это не должно иметь значения. Веб-приложение импортирует файл CSV, содержащий транзакции с банковского счета (аналогично экспорту с вашего банковского счета) в API.

API получает все транзакции, проверяет их и удаляет все ранее импортированные, а затем сохраняет их в таблице транзакций. Затем на основе этих данных создаются отчеты, такие как общее количество газа, приобретенного в прошлом месяце, общее количество, потраченное на обеды в 2017 году и т. Д.

Мне кажется, что этот тип приложения идеально подходит для поиска событий (или наоборот), но мне трудно понять, как его реализовать. Я пытаюсь реализовать что-то вроде в этом простом примере . У него есть совокупность учетных записей, в которой есть события транзакций, аналогичные тому, что я хотел бы сделать.

Мой первый вопрос: как мне обрабатывать пакетные транзакции, где не все они сохранены, поскольку некоторые могут быть дубликатами? Этот вопрос касается этой темы, но это отличается тем, что в некоторых случаях никакие транзакции не могут быть сохранены после повторной проверки, так как файл может быть тем же самым, или просто не было новых транзакций с момента последнего импорта ,

Во-вторых, как мне проверить, является ли транзакция дубликатом? В настоящее время мой дубликат проверки выглядит так:

        var all = await _transactionRepository.GetAll(-1);
        var lookup = all.ToLookup(x => Tuple.Create(x.PostingDate, x.Description, x.Amount, x.Balance));

        foreach (var o in original)
        {
            o.Created = DateTime.Now;

            if (!lookup.Contains(Tuple.Create(o.PostingDate, o.Description, o.Amount, o.Balance)))
            {
                // does not currently exist in the db so add to clean list
                final.Add(o);
            }
        }

Буду ли я создавать проекцию в поисках этого конкретного события? У меня проблемы с пониманием того, как проверить существующие данные.

Заранее спасибо за любую помощь в понимании этого.

1 Ответ

0 голосов
/ 20 сентября 2018

Где ваши общие границы в этом случае?Я думаю, что у вас есть отдельный агрегат транзакций, а не просто пакетный агрегат, но это не ясно из вашего случая.Если у вас есть агрегат транзакции, как вы получаете идентификацию (т. Е. Aggregate Key) агрегата транзакции?Вы просто генерируете Guid?

У вас есть кортеж, представляющий уникальный идентификатор транзакции.Из этих значений вы сможете создать уникальный и воспроизводимый идентификатор, возможно, хеш.Когда вы вводите команду «Создать» для этого идентификатора транзакции, и если транзакция уже существует, операция должна быть идемпотентной и, следовательно, ничего не делать.Чтобы защититься от возможных повторяющихся идентификаторов, вы также можете проверить в своей совокупности, совпадают ли детали (например, PostingDate, Description, Amount ...) с данными в команде Create.Если они это сделают, то игнорируйте команду.Если они не генерируют событие CreateFailed, это указывает на то, что сгенерирован повторяющийся идентификатор.Вы можете прослушать это событие в Saga, а затем сгенерировать новый, но все еще воспроизводимый идентификатор и выполнить для него команду Create.

Таким образом, вы не зависите от прогнозов, которые в конечном итоге непротиворечивы, подвержены изменениям и, следовательно, ненадежны.

...