如何协调并发请求 - 响应流?

时间:2016-01-11 09:52:15

标签: go concurrency

我是并发编程的新手,并且不知道从哪个概念开始,所以请保持温和。

我正在编写一个Web服务作为TCP服务器的前端。此服务器侦听我提供的端口,并为每个请求返回TCP连接的响应。

这就是我为此服务器编写Web服务前端的原因:

  • 服务器可以一次处理一个请求,我试图让它能够同时处理多个输入,方法是启动多个进程并为它们提供一个不同的端口来监听。例如,我想启动30个实例并告诉他们监听端口20000-20029。
  • 我们的团队使用PHP,而PHP没有能力同时启动服务器实例并维护它们,因此我尝试编写一个API,他们只能发送HTTP请求。

所以,这是我想到的结构。

  1. 我将拥有main()功能。此函数同时启动进程,然后在端口80上启动HTTP服务器并侦听。
  2. 我有一个http.Handler,它将请求的内容添加到频道中。
  3. 我将拥有每个服务器实例的gorutines,它们处于无限循环中。
  4. 第三项中提到的功能代码如下:

    func handleRequest(queue chan string) {
        for {
            request := <-queue
            conn, err := connectToServer()
            err = sendRequestToServer(conn)
            response, err := readResponseFromServer(conn)
        }
    }
    

    因此,我的http.Handler可以简单地执行类似queue<- request的操作,将请求添加到队列中,handleRequest已阻止,等待频道获取内容,将简单地得到请求并继续。完成后,循环结束,执行返回request := <-queue,同样的事情继续。

    我的问题始于http.Handler。将请求放入通道是完全合理的,因为多个gorutine都在监听它。但是,这些gorutines如何将结果返回到我的http.Handler

    一种方法是使用频道,让我们称之为responseQueue,然后所有这些gorutine都会写入。问题是当响应被添加到频道时,我不知道它属于哪个请求。换句话说,当多个http.Handler发送请求时,每个执行处理程序将不知道通道中当前消息属于哪个响应。

    是否有最佳做法或模式将数据从另一个gorutine发送到gorutine并接收数据?

1 个答案:

答案 0 :(得分:1)

创建每个请求响应通道,并将其包含在发送给worker的值中。处理程序从通道接收。工作人员将结果发送到频道。