Где на сайте администратора EventStore я могу просмотреть свои события сохранения? - PullRequest
0 голосов
/ 25 августа 2018

Кстати, как вы создаете поток?

Я использую AppendToStreamAsync напрямую, это право или я должен создать сначала поток, затем добавить в этот поток?

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

И наиболее важный вопрос импорта заключается в том, как просмотреть мои события сохранения на сайте администратора EventStore?

Вот код:

    public async Task AppendEventAsync(IEvent @event)
    {
        try
        {
            var eventData = new EventData(@event.EventId, 
                @event.GetType().AssemblyQualifiedName, 
                true, 
                Serializer.Serialize(@event), 
                Encoding.UTF8.GetBytes("{}"));

            var writeResult = await connection.AppendToStreamAsync(
                   @event.SourceId.ToString(),
                   @event.AggregateVersion,
                   eventData);

            Console.WriteLine(writeResult);
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex);
        }
    }


    public async Task<IEnumerable<IEvent>> ReadEventsAsync(Guid aggregateId)
    {
        var ret = new List<IEvent>();
        StreamEventsSlice currentSlice;
        long nextSliceStart = StreamPosition.Start;

        do
        {
            currentSlice = await connection.ReadStreamEventsForwardAsync(aggregateId.ToString(), nextSliceStart, 200, false);
            if (currentSlice.Status != SliceReadStatus.Success)
            {
                throw new Exception($"Aggregate {aggregateId} not found");
            }
            nextSliceStart = currentSlice.NextEventNumber;
            foreach (var resolvedEvent in currentSlice.Events)
            {
                ret.Add(Serializer.Deserialize(resolvedEvent.Event.EventType, resolvedEvent.Event.Data));
            }
        } while (!currentSlice.IsEndOfStream);

        return ret;
    }

admin

1 Ответ

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

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

await Connection.AppendToStreamAsync("CustomerAggregate-b2c28cc1-2880-4924-b68f-d85cf24389ba", expectedVersion, creds, eventData);

Рекомендуется называть ваши потоки «идентификатором категории» (где категория в нашем случае - это совокупное имя), поскольку мы используем шаблон DDD + CQRS

CustomerAggregate-b2c28cc1-2880-4924-b68f-d85cf24389ba

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

В нашем случае первый идентификатор события становится «aggregateID», а затем каждый новый EventID после этого является уникальным. Единственный способ воссоздать нашу совокупность чтобы воспроизвести события в последовательности. Если последовательность завершается ошибкой, генерируется исключение

Причиной использования этого соглашения об именах является то, что Event Store для вашего удобства выполняет несколько внутренних проекций по умолчанию. Вот очень запутанная документация об этом

  • $ by_category
  • $ by_event_type
  • $ stream_by_category
  • $ потоки

По категориям

Под категорией в основном подразумевается, что существует поток, созданный с использованием внутренней проекции, для которого для наших CustomerAggregate мы подписываемся на $ce-CustomerAggregate события - и мы будем видеть только эти "категории" независимо от их идентификаторов - Данные событий содержат все, что нам нужно после.

Мы используем постоянных подписчиков (небольшие консольные приложения C #), которые настроены для работы с $ce-CustomerAggregate. Постоянные подписчики - это здорово, потому что они помнят последнее событие, которое узнал ваш клиент. Таким образом, если происходит сбой приложения, вы запускаете его, и оно начинается с последнего места, где приложение завершило работу.

Здесь хранилище событий начинает сиять и выделяться среди других "реализаций хранилища событий"

Просмотр ваших событий

Пример с постоянными подписчиками - один из способов настройки с использованием кода.

Вы действительно не можете просматривать «все» ваши данные на сайте администратора. Цель сайта администратора - управлять проекциями, управлять пользователями, просматривать некоторую статистику, создавать некоторые прогнозы, а также просматривать только недавние потоки и события. (Если вы знаете идентификаторы, вы можете создавать URL-адреса по мере необходимости, но вы не можете их искать)

Если вы хотите просмотреть ВСЕ данные, тогда вы используете RESTfull API , используя что-то вроде Postman. Может быть, есть стороннее программное обеспечение, которое может создать сетку, например, средство просмотра источников данных, но я не знаю об этом. Это, вероятно, также просто подключит REST API, и вы сможете довольно быстро создать свой собственный визуализатор.

Снова вернемся к коду, вы также всегда можете прочитать все события от 0, используя одну из библиотек - что, кстати, используя DDD + CQRS, вы всегда читаете поток агрегатов из 0, чтобы восстановить его состояние. Но вы можете сделать то же самое для других требований.

В некоторых случаях рассмотрение использования моментальных снимков ускоряет повторное воспроизведение событий, если вы имеете дело с очень большим потоком.

Смена парадигмы

Event Store имеет довольно сложную кривую обучения и представляет собой смещение парадигмы от традиционных транзакционных баз данных. Лучший друг хранилищ событий - CQRS - мы используем слегка модифицированную версию CQRS Lite с открытым исходным кодом

Чтобы по-настоящему оценить Event Store, вам нужно понять концепции DDD, а затем углубиться в CQRS / ES. Есть несколько хороших видео и примеров на YouTube.

...