Вы правы, агрегация в памяти может привести к потере данных в случае сбоя приложения или внезапной смерти узла, на котором оно работает. Это также увеличивает сложность вашего кода.
В вашем конкретном примере вы привели пример системы торгов. Если вы агрегируете ставки, как узнать, у кого самая высокая или самая низкая цена? Эта система только для аналитических целей или сама система заявок?
У вас есть пара вариантов.
Вы можете хранить агрегаты в базе данных, например MySQL или Postgres. Вы должны убедиться, что это настройка HA (например, ведущий-ведомый), чтобы обеспечить работоспособность во время сбоя узла. Недостатком этого подхода является то, что ваша таблица начнет снижать производительность, как только она попадет в диапазон 5М-10М. При 5 000 за 5 минут вы накопите около 1,4 млн. В день. Это может быстро столкнуться с проблемами масштабирования в будущем. Я видел системы, которые go обходили это с помощью ручных разделов и шардинга, что добавляет немало накладных расходов. Вам также придется обрабатывать данные, чтобы сэкономить место.
Другой вариант - попробовать базу данных временных рядов, разработанную для таких рабочих нагрузок, как, например, Hyprcubd . Отказ от ответственности: я основатель. Я бы не советовал, если он не подходит для вашего случая использования. Если вам нужны транзакции, это не очень подходит, поскольку Hyprcubd не поддерживает транзакции. Если вы отслеживаете только (time, label, bid)
, это может сработать. Вы даже можете хранить каждую необработанную ставку без агрегирования (time, label, bid, user)
, что значительно упростит ваш код. Ваш код станет без гражданства.