📃 Задача из практики: подсчет отчетов

Сегодня запускаем новую мини-рубрику 🚀 Суть такая: я буду описывать задачу, которая была на практике, условия, проблематику, предысторию и все такое, а после - как эту задачу по итогу решали (возможно, не самым лучшим решением). Где есть возможность, буду прятать под спойлер или еще как-то прятать, чтобы вы могли сперва подумать и предложить свои решения.

Итак, первая задача, это реализация подсчёта отчетов. Была, значит, одна компания, в которой нужно было считать и генерировать отчеты на основе базы с заказами. Заказы эти лежали в MongoDB и в первой итерации эти отчеты считались нормально, просто мы там пуллили все что надо из базы, материализировали эти заказы в памяти и считали, не было никаких проблем. Потом заказов стало больше, логика генерации стала сложнее, и в момент выгрузки отчетов сервис стал просто ложиться. Сначала боролись всякими костылями, типа там "накинуть память", "накинуть индексы", "какой-то подсчет перенести на базу", "где-то добавить какой-то кэшик", "увеличить таймауты", "заставлять считать отчет отдельно маленькими выгрузками и ручками всё суммировать в итоговый", "ребутнуть сервис перед подсчетом" 🤡, и уже было понятно, что так мы далеко не уедем и нужен фундаментально другой алгоритм.

Более предметно по входным данным:

🔹 База MongoDB, заказы все лежат в одной большой коллекции. Количество заказов исчисляется миллионами, а сама модель заказа огромная и часть данных надо джойнить из других коллекций, ну, короче, даже получить полный заказ в памяти - уже трудоемко.

🔹 Логика подсчета, если быть конкретней, такова, что ее даже и при всём желании нельзя было бы посчитать сильно заранее. Подсчет всего отчета зависит от входных данных и от того, какие в моменте заведены параметры подсчета. Нужно уметь выгружать отчет за произвольные даты, по произвольным городам, по произвольным источникам продаж, считать какие-то проценты и суммы на основе какой-то там коллекции, учитывать таймзоны и бизнес-сутки, учитывать валюты, отдельно считать сервисный сбор и отдельно считать всё это также и по разным составляющим заказа (например, эти все подсчеты надо было применить как ко всей сумме заказа, так и отдельно по категориям, условно: к билету на самолет, к допам, к страховке и так далее).

🔹 Во всём остальном в целом ограничений нет - можно кодить новые сервисы, можно в базу писать что хочешь и сколько хочешь, ну, короче, руки развязаны. Можно даже в теории было бы уговорить там кого-то на то, чтобы завести в контур какой-то необходимый продукт, если он сильно всё упростит, но лучше обойтись без этого.

Как это по итогу решили, чтобы не спойлерить 🤡, читайте в ТГ-канале: https://t.me/seroperson_me/69

На примете еще парочка интересных задач, в ближайшее время опубликуем 👍

А как бы вы решали такую задачу? 🤔

📃 Задача из практики: подсчет отчетов | Сетка — социальная сеть от hh.ru