Отслеживайте просмотры изображений экономичным способом

Я ищу решение для реализации спонсируемых изображений в одном из моих приложений GAE.

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

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

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


person Jan Vladimir Mostert    schedule 27.05.2013    source источник
comment
Почему бы не воспользоваться предложенным вам распределенным счетчиком? Вы можете распределить его по 20-строчному счетчику, что означает, что вам придется достигать 20 обращений в секунду (много), чтобы сделать его крайне ненадежным.   -  person MeLight    schedule 11.03.2014
comment
Скажем, у нас значительно меньше 20 обращений в секунду ради аргумента. Если запущен только один экземпляр, он должен работать, но как только запущены два экземпляра, у вас есть шанс 1/20, что два экземпляра будут пытаться записать в одну и ту же запись (таким образом, эта дорожка будет пропущена из-за того, что оба инкрементируют одно и то же значение). запись одновременно.) и тем более с большим количеством экземпляров. Есть ли какая-то блокировка на уровне строк, которую я могу использовать, чтобы получить проход, жертвуя точностью? distributed-counter + блокировка сущностей были бы идеальным решением.   -  person Jan Vladimir Mostert    schedule 11.03.2014
comment
Я не эксперт по вероятности, но я считаю, что два случая, пытающихся попасть в одну и ту же строку счетчика из 20, в сумме дают шанс 1/400. Что касается вашего вопроса о блокировке, я не знаю о таком механизме (хотя было бы очень приятно).   -  person MeLight    schedule 11.03.2014
comment
Просто подумал об этом - вы можете использовать очередь с пропускной способностью (не помню точного термина) одной задачи за раз. Таким образом, вы будете знать, что каждый раз будете выполнять одну операцию.   -  person MeLight    schedule 11.03.2014
comment
Это довольно крутая идея, пусть каждое представление помещается в очередь, ограничивает количество задач, обрабатываемых в секунду, до скорости, которая меньше скорости записи, и связывает каждую очередь с одним из распределенных счетчиков, таким образом вы получите точные подсчеты. Я рад принять это как ответ.   -  person Jan Vladimir Mostert    schedule 12.03.2014


Ответы (1)


Публикую это как ответ :)

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

person MeLight    schedule 12.03.2014