Какую пропускную способность может выдерживать витой реактор с помощью паутины?

Я проектирую сервис, который бы открывал ~30-50 подключений через веб-сокет, получая данные финансовых тиков и записывая их в MongoDB; возможно, что сотни сообщений будут приниматься каждую секунду. Я использую для этого Python Twisted Websocket от Autobahn, но мне было интересно, масштабируется ли он при запуске одного асинхронного потока. Мой инстинкт заключается в том, что как однопоточная Twisted, так и MongoDB могут справиться с этой пропускной способностью, но я хочу подтвердить эту гипотезу.

Я вижу 3 возможных варианта:

  1. Используя 1 поток, подключитесь ко всем конечным точкам websocket и вызовите реактор.run().
  2. Каждое подключение к веб-сокету принадлежит своему потоку, который имеет свой собственный реактор.run(). Запустите его как один основной демон Unix, который порождает все потоки.
  3. Каждое подключение к веб-сокету принадлежит своему потоку, запущенному в различных сценариях как демоны Unix.

Какой будет самый надежный вариант? Большое спасибо!

1 ответ

Насколько вы описываете свою проблему, ваше приложение привязано к IO, а не к CPU. Если вы собираетесь использовать асинхронное решение, вам следует избегать потоков. Дело не в том, что Twisted не поддерживает потоки, а поддерживает потоки, когда вы программируете асинхронно. Twisted и Autobahn могут обрабатывать много операций ввода-вывода, прежде чем они начнут использовать процессор. Так что, пока код вашего приложения не слишком высок, вы тоже будете в порядке.

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