Я работаю над приложением, в котором данные постоянно проходят через конвейер и анализируются. Для каждого поступающего фрагмента данных параллельно выполняется обработка нескольких аналитических данных 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. В настоящее время у нас нет ограничений на количество аналитик, которые могут запускаться одновременно, учитывая, что доступные ресурсы поддерживают количество контейнеров.
Учитывая эту информацию, моя основная проблема заключается в следующем:
- Есть ли какие-либо проблемы с использованием сигналов таким образом?
- Должен ли я быть обеспокоен тем, как такая реализация будет масштабироваться и потенциал "потери" сигналов?