Как масштабируется Unix сигналов? - PullRequest
0 голосов
/ 07 апреля 2020

Я работаю над приложением, в котором данные постоянно проходят через конвейер и анализируются. Для каждого поступающего фрагмента данных параллельно выполняется обработка нескольких аналитических данных Python, а затем результаты объединяются вместе, таким образом исходные данные и все их результаты являются встроенными. В настоящее время существует проблема, вызванная тем, что некоторым аналитикам требуется много времени для запуска, и они задерживают результаты данных, которые объединяются и пересылаются по всей остальной части конвейера. Мое предлагаемое решение для этого состоит в том, чтобы использовать сигналы SIGALRM для прерывания анализа после заданного периода времени ожидания. Например, использование библиотеки Python signals для прерывания аналитики следующим образом (для краткости код сжат):

def handler(*_args):
    raise TimeoutError
signal.signal(signal.SIGALRM, handler)

...

signal.alarm(TIMEOUT)
try:
    results = analyze(data)
except TimeoutError:
    logging.warning("Analytic timed out!")
    results = []
finally:
    signal.alarm(0)

cleanup(results)

Мы используем Docker и Docker Swarm, чтобы позволить аналитике работать параллельно и оркестровать масштабирование пропускной способности. Каждый аналитик c работает в своем собственном контейнере Docker. По мере роста количества работающих аналитиков растет и количество SIGALRM. В настоящее время у нас нет ограничений на количество аналитик, которые могут запускаться одновременно, учитывая, что доступные ресурсы поддерживают количество контейнеров.

Учитывая эту информацию, моя основная проблема заключается в следующем:

  • Есть ли какие-либо проблемы с использованием сигналов таким образом?
  • Должен ли я быть обеспокоен тем, как такая реализация будет масштабироваться и потенциал "потери" сигналов?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...