我是并發(fā)編程的新手,不知道從什么概念開始,所以請保持溫和。我正在編寫一個(gè) web 服務(wù)作為 TCP 服務(wù)器的前端。該服務(wù)器偵聽我給它的端口,并將響應(yīng)返回給每個(gè)請求的 TCP 連接。這就是我為此服務(wù)器編寫 Web 服務(wù)前端的原因:服務(wù)器一次可以處理一個(gè)請求,我試圖通過啟動多個(gè)進(jìn)程并為它們提供不同的端口來偵聽,從而使其能夠同時(shí)處理多個(gè)輸入。例如,我想啟動 30 個(gè)實(shí)例并告訴它們偵聽端口 20000-20029。我們的團(tuán)隊(duì)使用 PHP,而 PHP 沒有能力啟動服務(wù)器實(shí)例并同時(shí)維護(hù)它們,所以我正在嘗試編寫一個(gè) API,它們只能向其發(fā)送 HTTP 請求。所以,這是我想到的結(jié)構(gòu)。我會有一個(gè)main()功能。此函數(shù)同時(shí)啟動進(jìn)程,然后在端口 80 上啟動 HTTP 服務(wù)器并進(jìn)行偵聽。我有一個(gè)http.Handler將請求的內(nèi)容添加到頻道的。我將有 gorutines,每個(gè)服務(wù)器實(shí)例一個(gè),處于無限循環(huán)中。第 3 項(xiàng)中提到的函數(shù)的代碼將是這樣的:func handleRequest(queue chan string) { for { request := <-queue conn, err := connectToServer() err = sendRequestToServer(conn) response, err := readResponseFromServer(conn) }}所以,我http.Handler可以簡單地做一些事情,比如queue<- request將請求添加到隊(duì)列中,并且handleRequest已經(jīng)阻塞,等待通道有東西可以獲取,將簡單地獲取請求并繼續(xù)。完成后,循環(huán)結(jié)束,執(zhí)行返回到request := <-queue,并繼續(xù)相同的事情。我的問題始于http.Handler. 將請求放入一個(gè)通道是非常有意義的,因?yàn)槎鄠€(gè) gorutine 都在監(jiān)聽它。但是,這些 gorutines 如何將結(jié)果返回給 my http.Handler?一種方法是使用一個(gè)通道,我們稱之為responseQueue,然后所有這些 gorutines 將寫入。問題是,當(dāng)一個(gè)響應(yīng)添加到通道時(shí),我不知道它屬于哪個(gè)請求。換句話說,當(dāng)多個(gè)http.Handlers 發(fā)送請求時(shí),每個(gè)正在執(zhí)行的處理程序?qū)⒉恢劳ǖ乐械漠?dāng)前消息屬于哪個(gè)響應(yīng)。是否有最佳實(shí)踐或模式將數(shù)據(jù)從另一個(gè) gorutine 發(fā)送到 gorutine 并接收回?cái)?shù)據(jù)?
如何編排并發(fā)請求-響應(yīng)流?
慕桂英3389331
2021-12-07 10:03:20