Re[2]: Алгоритмы потоковой обработки
От: watchmaker  
Дата: 23.12.20 20:47
Оценка: 7 (1)
Здравствуйте, Буравчик, Вы писали:

Б>На лету (без таймера) так:

Б>- для каждого пользователя храним время для 100 последних запросов этого пользователя (например, в виде queue)
Б>- при поступлении запроса добавляем его в конец очереди и удаляем самый старый запрос (самый первый)
Б>- вычисляем разницу по времени между этими запросами и сравниваем ее с одной минутой — определили робот, или нет
Б>- обновляем количество текущих роботов


Способ хороший и практичный для похожих задач, но к конкретно на вопрос "каково текущее число пользователей, которые за последнюю минуту сделали более 100 запросов" он не позволит ответить.
Так как декремент общего счётчика завязан на внешние действия. И он не будет происходить, если внешних действий не будет.

Например, пусть есть полностью пустая система. В момент X приходит 1000 пользователей и задаёт за 1 секунду по 1000 запросов каждый. Мы их радостно записываем в роботы и увеличиваем счётчик до 1000. Потом пользователи перестают задавать запросы. Через минуту счётчик должен опустится, так как больше запросов нет вообще ни от кого. Но он этого не произойдёт, так как без таймера не будет сгенерировано событие, которое приведёт к пересчёту статуса пользователя.

То есть через такой алгоритм хорошо реализуется счётчик числа пользователей, которые хотя бы раз были записаны в роботы. Но не счётчик, который позволяет пользователю терять атрибут "робот".
Впрочем, если это практическая задача, то последнее свойство обычно не доставляет неудобств — можно и не разбанивать забанненного робота в тот же момент, когда он перестал спамить запросами
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.