我们在Python中有并发问题.这些WSGI服务器工作起来并不那么出色.我四处看看,找不到任何像Golang编写的WSGI服务器及其Goroutines一样的东西.

有什么原因吗?

推荐答案

WSGI协议特定于Python?对于GO,您有三个选项(实际上是四个,但对于中到高负载设置,应该不考虑纯CGI):

  • 围棋标准库的Built-in HTTP serving facilities.

    在这种情况下,你的应用是一个独立的服务器.这可能是最简单的设置,但可能存在以下问题:

    • 要在特权端口号(低于1024,80在此范围内)上使用降级权限(have to执行此操作)运行您的应用程序,您将需要使用专门的包装器或POSIX功能.
    • 为了在不丢失连接的情况下进行优雅的重新部署,您需要另一个包装器(比如goagain).
  • 与上面相同,但在Web服务器形式的反向HTTP代理之后.

    在很大程度上消除了独立变体的问题,但仍有来回传递全部HTTP个流量的开销.

  • FastCGI通过合适的网络服务器.NginxApache(以及许多其他的)可以接受这一点.FCGI客户端实现是available in the Go standard library.

    除了不存在独立设置的问题外,还实施了更高效的数据交换协议.另一个好处是,您的Go服务器可以使用Unix管道与前端Web服务器通信,Unix管道比反向HTTP代理变体中涉及的TCP套接字具有更低的传输成本.

所以,如果你的设置目前使用WSGI,我会说使用FCGI.

¹ As several commenters pointed out, strictly speaking, this is not quite correct: WSGI allows decoupling a web-serving application written in any language from a web server or an application server (connected, in turn, to a web server).
In order for this to happen, both parties must speak the same protocol, WSGI, which is language-agnostic. Still, it appears that most software not written in Python would either use HTTP or FastCGI to communicate with the front-end server.


Updated in 2020-11-19

正如Andrea Citrolo在他们的 comments 中正确地指出的那样,使用当前无处不在的容器化,当您部署了同一服务的多个副本,并且需要在它们之上进行负载平衡时,使用纯HTTP通常是唯一的方法.

我还想补充一点,如果您打算公开您在Go to the Internet中编写的程序(这很好),您应该阅读this.

Go相关问答推荐

减少在围棋中映射DTO时的重复代码量

CURL和Postman HTTP POST工作,但Golang请求失败,状态为400

如何使用中间件更改http请求的响应代码?

从MySQL/GO表获取行数据

文件路径.Abs()未在结果中提供子目录

关于如何使用 Service Weaver 设置多个不同侦听器的问题

如何修复 Go 中协议缓冲区定义中重新定义的字段?

如何使用 html/template 在 golang 中运行一个范围内的范围

有没有办法让sqlc生成可以使用pgxpool的代码

在多个 struct 体中重用 Go 中的函数

启动套接字服务器会干扰 gRPC/http 客户端服务器通信 Golang

Go test "-run -" 标志执行测试更快

如何使用 go 包设置标头键和值:shurcooL/graphql 或 hasura/go-graphql-client?

如何将 base64 编码的公钥转换为 crypto.PublicKey 或 ecdsa.PublicKey

使用 unsafe.Pointer 将 struct point直接转换为另一个 struct 是否安全?

Wire google Inject with multi return from provider 函数

如何在时间范围内规范化数组的元素?

使用 GO 在侧 tar 文件中提取 tar 文件的最快方法

try 运行 docker-compose up -d 时出现错误

有没有办法在 golang 中定义可索引类型?