Интеграция с не event-driven системами

Приветствую!

Есть какой-то сторонний API, пусть это будет Salesforce. У Salesforce можно попросить состояние каких-то структур, к примеру, “Клиент”. Пока разберём случай, когда мы клиентов pull’им, push модель игнорируем.

В нашей event-sourced системе тоже есть клиенты, и их структура даже совпадает с той, что есть в Salesforce.

Предположим, наша система знает о клиенте:

{
    "name": "Василий", 
    "income": 300000,
    "income_period": "nanosecond"
}

А на очередной pull клиентов, Salesforce возвращает нам следующую картину:

{
"clients": [
    {
        "name": "Василий", 
        "income": 300000,
        "income_period": "second"
    }, 
    {
        "name": "Андрей", 
        "income": 20, 
        "income_period": "month"
    }]
}

Оказалось, что Василий теперь зарабатывает не 300к в наносек, а 300к в сек, а ещё появился Андрей.

Я вижу два варината: один большой SalesforceUpdateReceived со всем этим ответом, который потом пытаются накатить все сущности, или какая-то штука, которая это переведёт в UserSignedUp (у нас появился Андрей), и IncomePeriodUpdated (если есть имя получше - поправьте).

Есть ли что-то, что я упустил? Есть ли какой-нибудь принцип? Есть ли какие-нибудь советы?

Благодарю!

Добрый день, возможный вариант интеграции со сторонними системами, которые не используют событийную модель, описан в этой статье.

Я считаю, что в Вашем случае есть и то, и другое. SalesforceUpdateReceived генерируется при получении сырых данных. Потом из них генерируются события в доменном языке. UserSignedUp, судя во всему, может иметь первоначальные данные о доходе. А IncomePeriodUpdated возникает, когда значение поменялось по сравнению с первоначальным.

Александра ранее дала ссылку на статью, описывающую как мы представляем взаимодействие с внешними системами в сочетании с событийной моделью. Если ещё есть вопросы — пишите. Обсудим.