【问题标题】:How can I orchestrate concurrent request-response flow?如何编排并发请求-响应流?
【发布时间】:2016-01-11 09:52:15
【问题描述】:

我是并发编程的新手,不知道从什么概念入手,所以请温柔一点。

我正在编写一个 Web 服务作为 TCP 服务器的前端。该服务器监听我给它的端口,并为每个请求返回对 TCP 连接的响应。

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

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

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

  1. 我将有一个main() 函数。此函数同时启动进程,然后在端口 80 上启动 HTTP 服务器并进行侦听。
  2. 我有一个http.Handler,可以将请求的内容添加到频道中。
  3. 我将有 gorutines,每个服务器实例一个,它处于无限循环中。

第三项中提到的函数的代码是这样的:

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

所以,我的http.Handler 可以简单地执行类似queue&lt;- request 之类的操作来将请求添加到队列中,而 handleRequest 已阻塞,正在等待通道获取某些内容,它将简单地获取请求并继续。完成后,循环结束,执行回到request := &lt;-queue,同样的事情继续进行。

我的问题始于http.Handler。将请求放入通道是非常有意义的,因为多个 gorutine 都在监听它。但是,这些 gorutines 如何将结果返回给我的http.Handler

一种方法是使用一个通道,我们称之为responseQueue,然后所有这些 gorutines 都会写入该通道。问题是当一个响应被添加到通道时,我不知道它属于哪个请求。也就是说,当多个http.Handlers发送请求时,每个执行的handler都不知道当前channel中的消息属于哪个响应。

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

【问题讨论】:

  • 这很有意义。您可以将其添加为答案以便我接受吗?

标签: go concurrency


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-13
    • 2011-03-03
    • 2011-12-21
    • 2011-06-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多