繁体   English   中英

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

[英]How can I orchestrate concurrent request-response flow?

我是并发编程的新手,也不知道从什么概念开始,所以请保持谨慎。

我正在编写一个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<- request http.Handler类的操作来将queue<- request添加到队列中, handleRequest阻塞,等待通道有东西获取的handleRequest ,将简单地获取请求并继续。 完成后,循环结束,执行返回到request := <-queue ,并且同一件事继续进行。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM