Это кажется такой тривиальной проблемой, но я не могу понять, как я хочу это сделать. По сути, я хочу иметь возможность получить цифру от сервера сокетов, которая в любой момент может дать количество пакетов, полученных за последнюю минуту. Как бы я это сделал?
Я думал, возможно, суммировать словарь, который использует текущую секунду в качестве ключа, и при получении пакета он увеличивает это значение на единицу, а также устанавливает второй ключ + 1 над ним на 0, но это просто кажется неряшливым. Любые идеи?






Обычный шаблон для решения этой проблемы в других языках - позволить объекту измерения просто увеличивать целое число. Затем вы предоставляете слушающему клиенту определять интервалы и частоты.
Таким образом, вы в основном выполняете нет, позволяя серверу сокетов знать о таких вещах, как «минуты», потому что это функция, которую вычисляет наблюдатель. Затем вы также можете поддерживать несколько слушателей с разным интервалом разрешения.
Я полагаю, вам нужна какая-то структура кольцевого буфера для непрерывного журналирования.
Как бы то ни было, ваша реализация выше не будет работать, если вы не будете получать пакет каждую секунду, поскольку следующая вторая запись не обязательно будет сброшена на 0.
В любом случае, «правильный» способ сделать это, а также анализ журналов, - это вести ограниченный учет всех получаемых вами запросов. Так что просто поместите запрос, полученное время и т. д. В базу данных, и тогда простые запросы к базе данных дадут вам возможность использовать ее в течение минуты или любой минуты в прошлом. Не уверен, что это слишком тяжело для вас.
Когда вы говорите последняя минута, вы имеете в виду точные последние секунды или последнюю полную минуту с x: 00 до x: 59? Последнее будет легче реализовать и, вероятно, даст точные результаты. У вас есть одна переменная prev, содержащая значение обращений за предыдущую минуту. Тогда у вас есть текущее значение, которое увеличивается каждый раз, когда появляется новое попадание. Вы возвращаете значение prev пользователям. При изменении минуты вы меняете предыдущую на текущую и сбрасываете текущую.
Если вам нужен более высокий анализ, вы можете разделить минуту на 2-6 частей. Вам нужна переменная или запись в списке для каждого фрагмента. Допустим, у вас есть 6 фрагментов по 10 секунд. У вас также есть индексная переменная, указывающая на текущий фрагмент (0..5). Для каждого удара вы увеличиваете временную переменную. Когда срез закончен, вы заменяете значение индексированной переменной значением temp, сбрасываете temp и перемещаете индекс вперед. Вы возвращаете пользователям сумму переменных среза.
Вот как Linux обрабатывает отчетный трафик, мне это кажется вполне разумным.