2010-07-29 6 views
13

Stackoverflow имеет отличную систему значков. Одна вещь, которую я заметил, это то, что значки не сразу присуждаются, но иногда, похоже, есть какая-то задержка после того, как я отвечаю критериям. Я заметил это на некоторых других сайтах, у которых есть значки.Почему сайты, такие как stackoverflow с значками, используют какой-то тип отложенной работы, чтобы определить, когда нужно назначить новый значок?

Предположительно это связано с тем, что они используют задержанную работу, которая периодически проверяет, должны ли быть отмечены новые значки. Я вижу этот подход также консультировал здесь:
How to implement badges?

Однако, я действительно не понимаю, почему это должно быть необходимым, и я в пользу моей реализации, чтобы просто иметь систему, где после того, как выполняется соответствующее действие, например, выдается новый комментарий, вызывается функция checkAwardBadge, которая проверяет, соответствует ли пользователь критериям для нового значка комментария.

Speedwise, я думал, что вся соответствующая статистика пользователя будет просто спрятана в подмодели пользователя, например UserStats, так что вместо того, чтобы каждый раз подсчитывать количество комментариев, это просто простой запрос.

Мне кажется, что система, которую я предпочитаю, должна быть быстрой и простой в понимании. Есть ли недостатки, которые мне здесь не хватает, почему необходимо усложнять работу с задержкой?

уточнить: Я планирую иметь абстрактный класс Достижения, с каждым фактическим достижением реализации достижений. Каждое достижение будет иметь функцию checkAwardBadge, которая может вызываться из контроллера или даже отложенное задание, если я должен выбрать этот маршрут или в любое время, чтобы проверить, получил ли пользователь определенный значок. Таким образом, код успеха будет централизован.

ответ

15

Ваша реализация может работать на простых сценариях (например, тот, который вы описываете), но если что-то становится более сложным у вас есть решение, которое:

  1. Makes ненужных проверки в каждом действии
  2. Добавляет производительность штрафной к каждому действию
  3. Не масштабируется
  4. Не имеет центрального места для всех правил.
+0

(1) и (2) штраф за исполнение был бы очень незначительным. Только простой запрос из одной строки в базу данных, за которой следует простая логика вроде (X> 30) (3) Не могли бы вы объяснить, почему это не будет масштабироваться (4) На самом деле это было бы. Я планирую создать класс Achivements, каждый из которых - подкласс. Тогда мне нужно было бы добавить только одну строку кода контроллера в большинстве случаев, чтобы сделать вызов checkAwardBadge на соответствующем значке. –

+2

(3) Просто пример: предположим, что у вас есть одно действие, подобное удалению комментария, которое не срабатывает над любым значком, но позже вам нужно присвоить значок, когда пользователь удалит комментарий, вам нужно вернуться, чтобы найти весь код которые удаляют комментарий и добавляют вызов checkAwardBadge. Представьте это в более сложных сценариях. –

+2

Он не масштабируется, потому что, когда у вас есть 100 000 + пользователей и 10 000 000 действий, вы должны колотить базу данных после каждого действия каждого пользователя для запроса. Если вместо этого вы выгружаете работу в рабочий поток (дожидаться ее), то эта вещь может работать в фоновом режиме и периодически обновлять значки каждого пользователя. Это может быть умным, скажем, сканированием только тех действий, которые были созданы с момента последнего прогона потока и т. Д. – BryanH

4

Это может быть так, что если действие будет выполнено и немедленно отменено, это не приведет к присвоению значка.

2

Я всегда предполагал, что задержка была вызвана тем, что она быстрее обслуживает статический контент. Я думаю, что это распространено на сайтах с высоким трафиком, периодически обновляет статический контент, а не генерирует его для каждого веб-запроса.

Периодическое задание будет генерировать новый статический контент и будет работать очень часто, но реже, чем каждый запрос на одну страницу.

+0

На самом деле, если содержимое (или компоненты страницы/виджеты) обновляется, необходимо обновлять статический контент. – BryanH

15

Хотя это только слегка параллелирует описанный вами сценарий, я чувствую, что обсуждение того, что мы делаем на моей работе, может помочь осветить часть рассуждений для этого подхода.

Я работаю для алгоритмической торговой компании в режиме реального времени. Часть того, что делает наше программное обеспечение, - это данные рыночного процесса от поставщика.

Теперь есть вещи, которые должны произойти в ответ на каждый отдельный рыночный тик. Мы запускаем аналитику, включаем триггеры безопасности, которые вступают в силу в определенных случаях и т. Д.Но то, чего мы избегаем делать любой ценой, - это раздувание кода, реагирующего на рыночные события со всей этой «вторичной» логикой.

Причина в том, что наши данные поступают по сети от поставщика данных, и нам нужна эта лента для передачи данных без каких-либо резервных копий. Наше программное обеспечение может обрабатывать около 10 000 рыночных тиков в секунду. Если для обработки этих рыночных событий слишком много времени, корм начинает забиваться, и наша способность реагировать на рынок как можно быстрее становится скомпрометированной.

Следствием этого является то, что наш код, который обрабатывает новые рыночные события, чрезвычайно суровый. Событие обновляет цену и все. Что касается всей другой логики, которая должна выполняться для каждого события: это происходит периодически, через очередь всех событий, которые еще предстоит изучить по этой логике.

Это позволяет нам иметь один поток, который очень чувствителен и не получает резервные копии данных, а другой обрабатывает входящие события и выполняет с ними более значительные вычисления. Разделение работы на две части таким образом обеспечивает бесперебойную работу.

Я признаю, что это касается только касательно вашего вопроса, но мне кажется, что аргументация не проверять логику, связанную с значком, на каждом пользовательском действии может быть одинаковой. Вы не хотите замедлять каждую операцию на сервере, выполняя менее критическую логику в тот момент, когда происходит операция. Общая стратегия заключается в том, чтобы быстро выполнять быстрые операции (т. Е. В основном все действия пользователя) и делегировать более трудоемкую работу на выполняемые вторичные процессы, возможно, часто, но не для каждой такой операции.

+0

+1 абсолютно согласен и очень хороший способ объяснить обоснование, я думаю. – Gian