@Вурдалак, это разные понятия и разные проблемы.
Какие именно понятия разные? Я привёл пример проблемы с несоблюдением идемпотентности. Обобщил её тут:
Если обобщить, то у нас есть некая команда и список событий, которые снова не возникнут (нельзя убить убитого человека), но хочется видеть в ответе.
Если вернуться к «Post already published», то вместо этой ошибки я бы хотел видеть те же события, что были при публикации. Например, PostWasPublished { ... }, PostWasSentForPreModeration { ... }.
Если пост может по какой-то внутренней логике то отправляться на премодерацию, то нет (т.е. событие `PostWasSentForPreModeration` опционально), то возникнет вопрос как ты собираешься ответить в API, что пост отправился на модерацию: лезть в query service?
А также как ты собираешься сообщить клиенту id поста, который был создан в предыдущем запросе?
Ну, то есть, чтобы было яснее:
1. Клиент делает запрос POST /publishPost {"body": "blah-blah"}. Пост создаётся и в API уходит ответ {"post-id": 42, "moderation": true}, но ответ получить не успеет.
2. Клиент (программа) делает повторный запрос POST /publishPost {"body": "blah-blah"}. Она должна получить ровно то же самое: {"post-id": 42, "moderation": true}.
А откуда мы возьмём этот 42 во втором пункте? Нужен какой-то одинаковый ключ идемпотентности от клиента в обоих запросах:
Код:
POST /publishPost {"command-id": "1071fab0-b9e3-11e8-96f8-529269fb1459", "body": "blah-blah"}
Я понимаю, что тебе нравится тема банков, тонких/толстых клиентов и CAP, а мне вот нравится говорить про идемпотентность. Но проблема того банка и публикации поста имеет много схожего, просто присмотрись.