На работе мы используем 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.