Распространение данных от очередей

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

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

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

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

РЕДАКТИРОВАТЬ:

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

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

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

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

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

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

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

2 ответа

Решение

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

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

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

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

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

Другие вопросы по тегам