Stackoverflow имеет отличную систему значков. Одна вещь, которую я заметил, это то, что значки не сразу присуждаются, но иногда, похоже, есть какая-то задержка после того, как я отвечаю критериям. Я заметил это на некоторых других сайтах, у которых есть значки.Почему сайты, такие как stackoverflow с значками, используют какой-то тип отложенной работы, чтобы определить, когда нужно назначить новый значок?
Предположительно это связано с тем, что они используют задержанную работу, которая периодически проверяет, должны ли быть отмечены новые значки. Я вижу этот подход также консультировал здесь:
How to implement badges?
Однако, я действительно не понимаю, почему это должно быть необходимым, и я в пользу моей реализации, чтобы просто иметь систему, где после того, как выполняется соответствующее действие, например, выдается новый комментарий, вызывается функция checkAwardBadge, которая проверяет, соответствует ли пользователь критериям для нового значка комментария.
Speedwise, я думал, что вся соответствующая статистика пользователя будет просто спрятана в подмодели пользователя, например UserStats, так что вместо того, чтобы каждый раз подсчитывать количество комментариев, это просто простой запрос.
Мне кажется, что система, которую я предпочитаю, должна быть быстрой и простой в понимании. Есть ли недостатки, которые мне здесь не хватает, почему необходимо усложнять работу с задержкой?
уточнить: Я планирую иметь абстрактный класс Достижения, с каждым фактическим достижением реализации достижений. Каждое достижение будет иметь функцию checkAwardBadge, которая может вызываться из контроллера или даже отложенное задание, если я должен выбрать этот маршрут или в любое время, чтобы проверить, получил ли пользователь определенный значок. Таким образом, код успеха будет централизован.
(1) и (2) штраф за исполнение был бы очень незначительным. Только простой запрос из одной строки в базу данных, за которой следует простая логика вроде (X> 30) (3) Не могли бы вы объяснить, почему это не будет масштабироваться (4) На самом деле это было бы. Я планирую создать класс Achivements, каждый из которых - подкласс. Тогда мне нужно было бы добавить только одну строку кода контроллера в большинстве случаев, чтобы сделать вызов checkAwardBadge на соответствующем значке. –
(3) Просто пример: предположим, что у вас есть одно действие, подобное удалению комментария, которое не срабатывает над любым значком, но позже вам нужно присвоить значок, когда пользователь удалит комментарий, вам нужно вернуться, чтобы найти весь код которые удаляют комментарий и добавляют вызов checkAwardBadge. Представьте это в более сложных сценариях. –
Он не масштабируется, потому что, когда у вас есть 100 000 + пользователей и 10 000 000 действий, вы должны колотить базу данных после каждого действия каждого пользователя для запроса. Если вместо этого вы выгружаете работу в рабочий поток (дожидаться ее), то эта вещь может работать в фоновом режиме и периодически обновлять значки каждого пользователя. Это может быть умным, скажем, сканированием только тех действий, которые были созданы с момента последнего прогона потока и т. Д. – BryanH