Какую пропускную способность может выдерживать витой реактор с помощью паутины?
Я проектирую сервис, который бы открывал ~30-50 подключений через веб-сокет, получая данные финансовых тиков и записывая их в MongoDB; возможно, что сотни сообщений будут приниматься каждую секунду. Я использую для этого Python Twisted Websocket от Autobahn, но мне было интересно, масштабируется ли он при запуске одного асинхронного потока. Мой инстинкт заключается в том, что как однопоточная Twisted, так и MongoDB могут справиться с этой пропускной способностью, но я хочу подтвердить эту гипотезу.
Я вижу 3 возможных варианта:
- Используя 1 поток, подключитесь ко всем конечным точкам websocket и вызовите реактор.run().
- Каждое подключение к веб-сокету принадлежит своему потоку, который имеет свой собственный реактор.run(). Запустите его как один основной демон Unix, который порождает все потоки.
- Каждое подключение к веб-сокету принадлежит своему потоку, запущенному в различных сценариях как демоны Unix.
Какой будет самый надежный вариант? Большое спасибо!
1 ответ
Насколько вы описываете свою проблему, ваше приложение привязано к IO, а не к CPU. Если вы собираетесь использовать асинхронное решение, вам следует избегать потоков. Дело не в том, что Twisted не поддерживает потоки, а поддерживает потоки, когда вы программируете асинхронно. Twisted и Autobahn могут обрабатывать много операций ввода-вывода, прежде чем они начнут использовать процессор. Так что, пока код вашего приложения не слишком высок, вы тоже будете в порядке.