У нас есть параллельные проблемы в Python. Эти серверы WSGI просто не работают так замечательно. Я смотрю вокруг, ничего не понимаю как Golang, написанный WSGI-сервер с его goroutines.
Любые причины?
У нас есть параллельные проблемы в Python. Эти серверы WSGI просто не работают так замечательно. Я смотрю вокруг, ничего не понимаю как Golang, написанный WSGI-сервер с его goroutines.
Любые причины?
WSGI
протокол специфичен для Python. С Go у вас есть три варианта (на самом деле, четыре, но обычный CGI
, предположительно, не следует рассматривать для установок с умеренной и высокой нагрузкой):
Встроенная служба обслуживания HTTP
стандартной библиотеки Go.
В этом случае ваше приложение является автономным сервером. Это может быть самая простая настройка, но у нее могут быть следующие проблемы:
goagain
).То же, что и выше, но за обратным прокси-сервером HTTP
в виде веб-сервера.
В основном устраняет проблемы автономного варианта, но все еще имеет накладные расходы на передачу полного трафика HTTP
вперед и назад.
FastCGI
через подходящий веб-сервер. Nginx
и Apache
(и многие другие) в порядке. FCGI
реализация клиента доступна в стандартной библиотеке Go.
В дополнение к отсутствию проблем с автономной настройкой, реализуется более эффективный протокол обмена данными. Еще один бонус заключается в том, что ваш сервер Go может взаимодействовать с интерфейсным веб-сервером, используя Unix-каналы, которые имеют меньшую стоимость передачи, чем TCP-сокеты, задействованные в обратном варианте HTTP
.
Итак, если ваша установка в настоящее время использует WSGI
, я бы сказал, перейдите с FCGI
.
Хотя Go может не поддерживать протокол WSGI
сам по себе, uWSGI, который является довольно популярным сервером WSGI
имеет поддержку Go. В настоящее время похоже, что поддержка ограничена и не обновляется часто, но это может быть что-то, что нужно изучить.
По умолчанию плагин uWSGI Go поддерживает обработчик
http.DefaultServeMux
, поэтому, если ваше приложение уже основано на нем, запуск его в uWSGI должен быть предельно простым.
Следующий пример адаптирован из документов uWSGI:
package main
import (
"uwsgi"
"net/http"
"fmt"
)
func helloHandler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "<h1>Hello, World!</h1>")
}
func main() {
http.HandleFunc("/hello/", helloHandler)
uwsgi.Run()
}
Здесь есть сервер Go WSGI:
http://bitbucket.org/classroomsystems/wsgi
Однако его намерение заключается не в том, чтобы быстрее запускать серверы Python - он запускает один интерпретатор CPython с GIL. Я написал это, чтобы облегчить переход для моих клиентов, пока наш продукт перемещается с Python на Go.