Код Middle Celery и очереди спрашивают часто обновлено

Идемпотентный обработчик сообщений

Условие

Обработчик получает сообщения о платежах {"id": ключ_идемпотентности, "user": ..., "amount": ...}; брокер доставляет их «как минимум один раз», возможны дубли. Напишите process(messages): примените каждое сообщение один раз (повтор с тем же id игнорируется, даже если сумма другая), отрицательные и нулевые суммы отклоняются (и тоже запоминаются как обработанные). Верните [балансы пользователей, число применённых, число дублей, число отклонённых].

Примеры

process([{"id":"a","user":"u1","amount":100}, {"id":"a","user":"u1","amount":100}]) // [{"u1":100}, 1, 1, 0]
process([]) // [{}, 0, 0, 0]
process([{"id":"x","user":"u","amount":-5}, {"id":"x","user":"u","amount":5}]) // [{}, 0, 1, 1]

Как подойти

Подсказки: 2
  1. Множество обработанных id.
  2. Отклонённые тоже помечайте обработанными.

Решите в тренажёре

Редактор с автотестами прямо в браузере. Можно решить спокойно, вслух или под таймером, как на собесе.