Выделил два сервиса - Tasks, в котором будут храниться текущее состояние наших задач и пользователи, и Accounting, в котором будут храниться лог операций с задачами и лог выплат.
Общение между ними будет происходить асинхронно через кафку, но для одной операции сервиса Accounting (отправка уведомлений на почту) придется выполнить синхронный запрос в Tasks, чтобы получить имейлы. Можно их на стороне Accounting сохранять в кэш или писать имейл в таблицу с логом.
На стороне Tasks будет процесс, производящий запись в кафку, на стороне Accounting будут консьюмеры, процесс для агрегации лога операций с задачами в лог выплат, процесс для произведения выплат и процесс для уведомления по емейлу.
На стороне сервиса Tasks реализуем 5 ручек для отрисовки и функионирования дашборда таск трекера + 1 ручка для аналитики (самая дорогая задача).
На стороне сервиса Accounting реализуем 4 ручки для шаборда аккаунтинга, одну из них заюзаем для аналитики (сколько бизнес заработал по дням) + 1 ручка чисто для аналитики (количество попугов в минусе).
Их нет- Упадет сервис задач - отвалится часть админки и весь таск трекер, для каких то попугов не будут уходить письма о выплатах, как сервис поднимется - придут. Упадет сервис аккаунтинга - отвалится другая часть админки и весь аккаунтинг.
- Отрубится кафка - таск трекер продолжит работать, но попуги могут не получить плату за всю проделанную работу, потому что аккаунтинг не будет знать об изменениях по задачам. Как кафка поднимется - сервис задач докинет в аккаунтинг данные и оставшиеся выплаты должны пройти.
- Если упадет база данных, то будем пятисотить на ручках. В случае Tasks не будут двигаться задачи в принципе и добавляться списания, в случае Accounting не будет производится запись из кафки и списания. Наверно Accounting стоит чинить быстрее, чтобы партиции в кафке не росли.
- Отвалится кэш - будем ддосить Tasks из Accounting во время отправки писем.
- Возможно прилетят дубли из кафки - через uuid можно защититься кажется.
- Не понял как авторизация работает и откуда берутся пользователи в принципе.
- Ручки аккаунтинг возможно можно как-то упростить/ускорить, добавив таблицу с балансом для каждого попуга, но думаю сильно сложнее станет подсчет и запись денег - станет проще ошибиться.
- Может быть сделать отдельный сервис для пользователей.
-
Actor: unlogged account Command: log in Data: credentials Event: account.logged_in
-
Actor: account / admin account Command: change account data / create account Data: account_data(email, ...) Event: account.updated / account.created
- Actor: account Command: create task Data: task_description Event: task.created
- Actor: task.created Command: assigne task Data: task_id Event: task.assigned
- Actor: admin / manager account Command: reassign tasks Data: - Event: task.assigned
- Query: get account tasks Actor: account Command: complete task Data: task_id Event: task.completed
- Query: get account tasks Actor: account
- Query: get user audit log Actor: account
- Query: get all users audit log Actor: admin / accountant account
- Actor: task.assigned / task.completed Command: create audit log Data: task_id, user_id, ammount Event: audir_log_record.created
- Actor: task.created Command: estimate task Data: task_id Event: task.estimated
- Actor: end_of_day_event Command: create payment log Data: user_id Event: payment_log_record.created
- Actor: payment_log_record.created Command: send email Data: user_email, other_meta Event: email.sent
- Query: get all users audit log Actor: admin account
- Query: get users negative payment log Actor: admin account
- Query: get most expensive task in period Actor: admin account
- Producer: auth Consumers: -
- Producer: tasks Consumer: accounting
- Producer: tasks Consumers: accounting
- Producer: accounting Consumers: accounting
- Producer: accounting Consumers: accounting
- Producer: accounting Consumers: -
- Producer: accounting Consumers: -
- Producer: auth Consumers: tasks, accounting
- Producer: tasks Consumers: accounting