Почему бы не реализовать WSGI golang

У нас есть параллельные проблемы в Python. Эти серверы WSGI просто не работают так замечательно. Я смотрю вокруг, ничего не понимаю как Golang, написанный WSGI-сервер с его goroutines.

Любые причины?

Ответ 1

WSGI протокол специфичен для Python. С Go у вас есть три варианта (на самом деле, четыре, но обычный CGI, предположительно, не следует рассматривать для установок с умеренной и высокой нагрузкой):

  • Встроенная служба обслуживания HTTP стандартной библиотеки Go.

    В этом случае ваше приложение является автономным сервером. Это может быть самая простая настройка, но у нее могут быть следующие проблемы:

    • Чтобы запустить приложение с пониженными привилегиями (вы должны это сделать) на номер привилегированного порта (ниже 1024 и 80 в этом диапазоне), вам нужно использовать специализированную оболочку или возможности POSIX.
    • Чтобы обеспечить изящные перераспределения без потери соединений, вам понадобится другая оболочка (например, goagain).
  • То же, что и выше, но за обратным прокси-сервером HTTP в виде веб-сервера.

    В основном устраняет проблемы автономного варианта, но все еще имеет накладные расходы на передачу полного трафика HTTP вперед и назад.

  • FastCGI через подходящий веб-сервер. Nginx и Apache (и многие другие) в порядке. FCGI реализация клиента доступна в стандартной библиотеке Go.

    В дополнение к отсутствию проблем с автономной настройкой, реализуется более эффективный протокол обмена данными. Еще один бонус заключается в том, что ваш сервер Go может взаимодействовать с интерфейсным веб-сервером, используя Unix-каналы, которые имеют меньшую стоимость передачи, чем TCP-сокеты, задействованные в обратном варианте HTTP.

Итак, если ваша установка в настоящее время использует WSGI, я бы сказал, перейдите с FCGI.

Ответ 2

Хотя 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()
}

Ответ 3

Здесь есть сервер Go WSGI:

http://bitbucket.org/classroomsystems/wsgi

Однако его намерение заключается не в том, чтобы быстрее запускать серверы Python - он запускает один интерпретатор CPython с GIL. Я написал это, чтобы облегчить переход для моих клиентов, пока наш продукт перемещается с Python на Go.