Я новичок в параллельном программировании и понятия не имею, с какими концепциями начать, поэтому, пожалуйста, будьте осторожны.Как организовать параллельный поток запросов-ответов?
Я пишу веб-сервис в качестве интерфейсного сервера TCP. Этот сервер прослушивает порт, который я ему предоставляю, и возвращает ответ на TCP-соединение для каждого запроса.
Вот почему я пишу веб-службу фронт-енд для этого сервера:
- Сервер может обрабатывать один запрос в то время, и я пытаюсь сделать это иметь возможность обрабатывать несколько входов одновременно, путем запуска нескольких процессов и предоставления им другого порта для прослушивания. Например, я хочу запустить 30 экземпляров и сообщить им прослушивать порты 20000-20029.
- Наша команда использует PHP, а PHP не имеет возможности запускать экземпляры сервера и поддерживать их одновременно, поэтому я пытаюсь написать API, на который они могут просто отправлять HTTP-запросы.
Итак, вот структура, о которой я думал.
- У меня будет функция
main()
. Эта функция запускает процессы одновременно, затем запускает HTTP-сервер на порту 80 и слушает. - У меня есть
http.Handler
, который добавляет содержимое запроса на канал. - У меня будут gorutines, по одному на каждый экземпляр сервера, которые находятся в бесконечном цикле.
код для функции, указанной в пункте три будет что-то вроде этого:
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
. Имеет смысл отправлять запросы в канал, потому что многие гориты слушают его. Однако, как эти гортины могут вернуть результат моему http.Handler
?
Один из способов - использовать канал, назовем его responseQueue
, что все эти языки будут писать. Проблема в том, что когда ответ добавляется в канал, я не знаю, к какому запросу он принадлежит. Другими словами, когда несколько запросов отправляют http.Handler
, каждый исполняющий обработчик не будет знать, к какому ответу относится текущее сообщение на канале.
Есть ли лучшая практика или шаблон для отправки данных в горутин из другого гортана и получения данных обратно?
Это имеет смысл. Можете ли вы добавить его в качестве ответа, чтобы я мог принять его? –