Проект GitHub CQRS.NET має декілька конкретних прикладів того, як можна зробити EventStores за кількома різними технологіями. На момент написання є реалізація в SQL за допомогою Linq2SQL і схема SQL, щоб перейти з ним, є одна для MongoDB , одна для DocumentDB (CosmosDB, якщо ви в Azure) і одна з використанням EventStore (як згадувалося вище). У Azure є більше, як Storage Storage та Blob storage, що дуже схоже на плоське зберігання файлів.
Я думаю, головний момент тут полягає в тому, що всі вони відповідають одній і тій же довіреності / договору. Всі вони зберігають інформацію в одному місці / контейнері / таблиці, вони використовують метадані для ідентифікації однієї події від іншої та "просто" зберігають всю подію такою, якою вона була - в деяких випадках серіалізованою, підтримуючи технології, як це було. Отже, залежно від того, вибираєте базу даних документів, реляційну базу даних або навіть плоский файл, існує кілька різних способів досягти однакового наміру магазину подій (корисно, якщо ви передумаєте в будь-який момент і виявите, що вам потрібно мігрувати або підтримувати більше однієї технології зберігання).
Як розробник проекту, я можу поділитися своєю інформацією щодо деяких варіантів, які ми зробили.
По-перше, ми виявили (навіть із унікальними UUID / GUIDs замість цілих чисел) з багатьох причин послідовні ідентифікатори трапляються з стратегічних причин, таким чином, просто ідентифікатор був недостатньо унікальним для ключа, тому ми об'єднали наш основний стовпець ключа ID з даними / тип об'єкта, щоб створити те, що має бути справді (у сенсі вашої програми) унікальним ключем. Я знаю, що деякі люди кажуть, що вам не потрібно зберігати його, але це буде залежати від того, чи є ви «greenfield» або вам доведеться співіснувати з існуючими системами.
Ми трималися з одним контейнером / таблицею / колекцією з міркувань збереження, але ми розігрувались з окремою таблицею за сутністю / об'єктом. Ми виявили на практиці, що або програма потребує дозволу "СТВОРИТИ" (що, як правило, не є гарною ідеєю ... загалом, завжди є винятки / виключення), або кожен раз, коли новий суб'єкт / об'єкт виник або був розгорнутий, новий контейнери / столи / колекції для зберігання, які потрібно зробити. Ми виявили, що це було дуже повільно для місцевого розвитку та проблематичним для виробництва. Ви можете, ні, але це був наш досвід у реальному світі.
Ще слід пам’ятати, що прохання дії X відбутися може призвести до багатьох різних подій, таким чином, знаючи всі події, породжені командою / подією / тим, що коли-небудь корисно. Вони також можуть бути різними типами об'єктів, наприклад, натискання "купити" в кошику для покупок може призвести до запуску облікових записів та зберігання подій. Захоплююча програма може захотіти знати все це, тому ми додали CorrelationId. Це означало, що споживач може запитати про всі події, викликані в результаті їх запиту. Ви побачите це на схемі .
Зокрема, за допомогою SQL ми виявили, що продуктивність справді стала вузьким місцем, якщо індекси та розділи не були використані належним чином. Пам'ятайте, що події потрібно буде передавати в зворотному порядку, якщо ви використовуєте знімки. Ми спробували кілька різних індексів і виявили, що на практиці потрібні деякі додаткові індекси для налагодження програм у реальному світі у виробництві. Знову ви побачите це на схемі .
Інші метадані у виробництві були корисними під час виробничих досліджень, часові позначки давали нам зрозуміти, в якому порядку тривали події проти подій. Це надавало нам деяку допомогу в особливо важких системах подій, які піднімали величезну кількість подій, даючи нам інформацію про продуктивність таких речей, як мережі та розподіл систем по всій мережі.