async-architecture

module
v0.0.0-...-05df700 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: May 13, 2022 License: MIT

README

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

Directories

Path Synopsis
cmd
api
Package docs GENERATED BY THE COMMAND ABOVE; DO NOT EDIT This file was generated by swaggo/swag
Package docs GENERATED BY THE COMMAND ABOVE; DO NOT EDIT This file was generated by swaggo/swag
internal
pkg
logging/syslog
Copy-paste from standard syslog to set correct format for our log parser
Copy-paste from standard syslog to set correct format for our log parser
super-app/logging
Adapter for gin context
Adapter for gin context

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL