Распространение данных от всплесков - PullRequest
1 голос
/ 12 августа 2011

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

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

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

Я не уверен, смог ли я действительно объяснить проблему, которая у меня сейчас есть. Если вам нужны какие-либо разъяснения, просто дайте мне знать.

EDIT

Я попытаюсь прояснить проблему еще и объяснить, почему простой ограничитель скорости не работает.

Проблема заключается в прерывистом характере трафика и том факте, что пакеты имеют разные размеры в разное время. То, что в основном является постоянным, - это задержка между каждым всплеском. Таким образом, мы получаем кучу записей данных для обработки, и нам нужно распределить их как можно более равномерно, прежде чем поступит следующая пачка. Однако мы не уверены на 100%, когда появится следующая пачка, просто приблизительно, поэтому просто divide time by number of records не работает должным образом.

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

Я приведу пример, чтобы прояснить эту проблему:

Допустим, мы ограничиваем наш трафик до 10 запросов в секунду, а новые данные поступают примерно каждые 10 секунд.

Когда мы получим 100 записей в начале периода времени, мы будем запрашивать 10 записей каждую секунду, и у нас будет идеальный равномерный спред. Однако если мы получим только 15 записей, у нас будет одна секунда, когда мы запрашиваем 10 записей, одна секунда, когда мы запрашиваем 5 записей, и 8 секунд, когда мы запрашиваем 0 записей, поэтому у нас очень неравные уровни трафика с течением времени. Вместо этого было бы лучше, если бы мы просто запрашивали 1,5 записи каждую секунду. Однако установка этой скорости также создаст проблемы, поскольку новые данные могут поступать раньше, поэтому у нас нет полных 10 секунд и 1,5 запросов будет недостаточно. Если мы используем блок токенов, проблема на самом деле становится еще хуже, потому что блоки маркеров позволяют пакетам проходить в начале таймфрейма.

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

Ответы [ 2 ]

1 голос
/ 15 августа 2011

Это звучит как проблема в области теории управления . В частности, я думаю, что ПИД-регулятор может работать.

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

Я не уверен, что вам даже нужен производный термин, если изменение размера пакета является случайным. Поэтому попробуйте использовать цикл PI - вы можете создать некоторое отставание между пакетами, но оно будет обрабатываться термином I.

Если отставание недопустимо, решение может быть более сложным ...

1 голос
/ 12 августа 2011

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

...