Skip to content

KoleMax/async-architecture

Repository files navigation

async-architecture

ДЗ 0 до курса (мега-тупое решение)

dumb-scheme

Что тут в целом

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

Общение между ними будет происходить асинхронно через кафку, но для одной операции сервиса Accounting (отправка уведомлений на почту) придется выполнить синхронный запрос в Tasks, чтобы получить имейлы. Можно их на стороне Accounting сохранять в кэш или писать имейл в таблицу с логом.

На стороне Tasks будет процесс, производящий запись в кафку, на стороне Accounting будут консьюмеры, процесс для агрегации лога операций с задачами в лог выплат, процесс для произведения выплат и процесс для уведомления по емейлу.

На стороне сервиса Tasks реализуем 5 ручек для отрисовки и функионирования дашборда таск трекера + 1 ручка для аналитики (самая дорогая задача).

На стороне сервиса Accounting реализуем 4 ручки для шаборда аккаунтинга, одну из них заюзаем для аналитики (сколько бизнес заработал по дням) + 1 ручка чисто для аналитики (количество попугов в минусе).

Узкие места

  • Их нет
  • Упадет сервис задач - отвалится часть админки и весь таск трекер, для каких то попугов не будут уходить письма о выплатах, как сервис поднимется - придут. Упадет сервис аккаунтинга - отвалится другая часть админки и весь аккаунтинг.
  • Отрубится кафка - таск трекер продолжит работать, но попуги могут не получить плату за всю проделанную работу, потому что аккаунтинг не будет знать об изменениях по задачам. Как кафка поднимется - сервис задач докинет в аккаунтинг данные и оставшиеся выплаты должны пройти.
  • Если упадет база данных, то будем пятисотить на ручках. В случае Tasks не будут двигаться задачи в принципе и добавляться списания, в случае Accounting не будет производится запись из кафки и списания. Наверно Accounting стоит чинить быстрее, чтобы партиции в кафке не росли.
  • Отвалится кэш - будем ддосить Tasks из Accounting во время отправки писем.
  • Возможно прилетят дубли из кафки - через uuid можно защититься кажется.

Что улучшить

  • Не понял как авторизация работает и откуда берутся пользователи в принципе.
  • Ручки аккаунтинг возможно можно как-то упростить/ускорить, добавив таблицу с балансом для каждого попуга, но думаю сильно сложнее станет подсчет и запись денег - станет проще ошибиться.
  • Может быть сделать отдельный сервис для пользователей.

ДЗ 1

Разбиение требований

Авторизация

  • Пользователь входит в систему:

    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

Модель данных, доменов, их связей

smart-scheme

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

Бизнес-события системы

  • account.logged_in

    Producer: auth Consumers: -
  • task.assigned

    Producer: tasks Consumer: accounting
  • task.completed

    Producer: tasks Consumers: accounting
  • task.estimated

    Producer: accounting Consumers: accounting
  • payment_log_record.created

    Producer: accounting Consumers: accounting
  • audit_log_record.created

    Producer: accounting Consumers: -
  • email.sent

    Producer: accounting Consumers: -

CUD-события системы

  • account.created, account.updated:

    Producer: auth Consumers: tasks, accounting
  • task.created, task.updated

    Producer: tasks Consumers: accounting

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages