Хотя это лишь в некоторой степени соответствует сценарию, который вы описываете, я чувствую, что обсуждение того, что мы делаем на моей работе, может помочь осветить часть причин такого подхода.
Я работаю в алгоритмической торговой компании в реальном времени. Частью того, что делает наше программное обеспечение, является обработка рыночных данных от поставщика.
Теперь есть вещи, которые должны происходить в ответ на каждый тик рынка. Мы запускаем аналитику, имеем триггеры безопасности, которые вступают в силу в определенных случаях и т. Д. Но чего мы избегаем любой ценой, так это раздутого кода, который реагирует на рыночные события со всей этой «вторичной» логикой.
Причина в том, что наши данные поступают по сети от поставщика данных, и нам нужно, чтобы этот поток данных передавался свободно без каких-либо резервных копий. Наше программное обеспечение может обрабатывать около 10000 тиков рынка в секунду. Если обработка этих рыночных событий занимает слишком много времени, канал начинает засоряться, и наша способность как можно быстрее реагировать на рынок оказывается под угрозой.
Следствием этого является то, что наш код, который обрабатывает новые рыночные события, чрезвычайно скуден. Событие обновляет цену и все. Что касается всей другой логики, которая должна выполняться для каждого события: это происходит на периодической основе, через очередь всех событий, которые еще не проверены этой логикой.
Это позволяет нам иметь один поток, который чрезвычайно отзывчив и не получает резервных копий данных, в то время как другой обрабатывает входящие события и выполняет с ними более существенные вычисления. Таким образом, разделение работы на две части обеспечивает бесперебойную работу.
Я признаю, что это только косвенно связано с вашим вопросом, но мне кажется, что причина, по которой не проверять логику, связанную со значками, при каждом действии пользователя вполне может быть одинаковой. Вы не хотите замедлять каждую операцию на сервере, выполняя некритическую логику в тот момент, когда происходит операция. Общая стратегия состоит в том, чтобы обеспечить быстрое выполнение быстрых операций (т. Е. В основном всех пользовательских действий) и делегировать более трудоемкую работу вторичным процессам, которые могут быть запущены, может быть часто , но не для каждой такой операции.