2016-10-25 7 views
-1

На работе мы используем Python 2.7 для всех наших микросервисов. Большинство наших услуг имеют очень небольшую бизнес-логику, но достаточно, чтобы не использовать все готовые приложения plug n play. Так что в основном это REST/CRUD для нашей передней панели. Поэтому мы используем:Python async webservers

Python 2,7

  • ха прокси круговике вызовов между серверами и службами.
  • nginx на каждом сервере для разбора и вызова uwsgi
  • uwsgi для обработки нескольких процессов (конечно, наш код не является потокобезопасным) - 2 процесса на процессор, 1 поток на процесс.
  • пирамида для маршрутизации вызовов внутри SQL-алхимии для подключения к серверу MySQL.
  • эластичный поиск
  • couchbase
  • весной Python для инъекции зависимостей
  • кучу домашней обертку, чтобы связать все это и сделать его пригодным для использования.
  • везде JSON

У нас также есть рабочие и RPC закупорены RabbitMQ.

Как я уже говорил, большая часть работы для сервера заключается в следующем: запрос синтаксического анализа/json, сделать запрос на sql или эластичный поиск, формат для фронта и ответить. Так много медленного ввода-вывода при выполнении запроса. Теперь у нас все больше и больше вызовов между службами, и мы используем либо http-вызовы, либо rmq-rpc с rabbitmq. Мы разработали оболочку для вызова наших маршрутов, чтобы их можно было вызвать в http или rmq-rpc без каких-либо различий.

Имея фон C#/go, я привык иметь эффективные веб-серверы, которые могут обрабатывать async без особых проблем, и которые могут масштабироваться, даже если мы выполняем много запросов ввода-вывода во время HTTP-вызова. Но использование uwsgi делает это практически невозможным, и поскольку каждый раз, когда мы вызываем MySQL через sql-alchemy, он блокирует весь поток/процесс, мы не можем масштабировать это, мы просто добавляем больше серверов. Мы могли бы добавить больше процессов на процессор, но это кажется неправильным и просто задерживает pb, и мы можем столкнуться с проблемами памяти (у нас есть локальные кеши, чтобы ускорить работу.)

Итак, я прочитал об асинхронных материалах на python, gevent, торнадо, скрученный и т. д., и это выглядело великолепно, но, похоже, не работало с sql alchemy. Вещи о колбе, Джанго. Но нам не нужны фантастические сложные веб-фреймворки, просто простая маршрутизация http.

Стек составляет 3 года, и мы не можем изменить все. Новости товаров, у нас очень слабое соединение с uwsgi и пирамидой, но весна Python и SQL alchemy очень сильно связаны. Мы можем найти способ сделать наши маршруты потоковыми сейфами.

Итак, мой вопрос, учитывая все, что я сказал, какой стек вы бы порекомендовали, с этими трудными ограничениями?

  • http-rpc следует обрабатывать одинаково.
  • rpc не должен проходить через rabbitmq.
  • json (мы не можем, например, перейти к протобуфу). Большинство наших маршрутов - это всего лишь обертки вокруг звонков в «базу данных» (sql или эластичный или couchbase), поэтому мы в основном связаны с IO.
  • у нас нет много унаследованного кода, поэтому не начинать с нуля

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

БОНУС: Если вам нужно было начать с нуля, что бы вы использовали? (все еще используют python 2.7 и sql alchemy)

Thx для вашей помощи.

ОТКАЗ: Я знаю, что это какой-то открытый вопрос, но the last questions о the subject на стеке в least 3 years old.

ответ

0

Я думаю, вам действительно нужно использовать драйвер db, который будет поддерживать async, psycopg2 для postgres может это сделать, я думаю.

Это не прямая проблема sqlalchemy или пирамиды (тем более, что вы можете настроить вещи в пирамиде, чтобы не использовать глобальные переменные).

Я пишу сервер websocket с пирамидой и gevent, и он отлично работает. Он не использует sqlalchemy, но трюк заключается в том, что вы не должны использовать сессию с ограниченным доступом для кода sqlalchemy, который является асинхронным.