Pin Golang Goroutine или канал для запроса / ответа - PullRequest
0 голосов
/ 26 октября 2018

Из того, что я знаю, http-маршрутизатор по умолчанию, а также маршрутизатор gorilla / mux помещают каждую точку входа входящего HTTP-запроса в свою собственную программу.Подобно доменам Node.js, где мы можем прикрепить запрос к домену, можем ли мы прикрепить запрос в Golang к программе, и если в программе есть какая-либо паника, мы отвечаем с ошибкой вместо того, чтобы выключать сервер?

В файле node.js это может выглядеть так:

const domain = require('domain');
const http = require('http');

const server = http.createServer((req,res) => {

  const d = domain.create();

  d.once('error', e =>{
     res.json({error:e}); // check res.headersSent to see if already sent
  });

  res.once('finish', () => {
     d.removeAllListeners(); // prevent memory leak
  });

  d.run(() => {
     handleRequest(req,res);
  });


});

Есть ли способ сделать что-то подобное с goroutines в Golang?

Ответы [ 2 ]

0 голосов
/ 26 октября 2018

Сервер net / http запускает процедуру для каждого соединения и вызывает корневой обработчик для этой процедуры.Все известные мне маршрутизаторы обращаются к зарегистрированным обработчикам на goroutine, на котором был вызван маршрутизатор.Так или иначе обработчики обычно вызываются в программе, запущенной на сервере net / http.Все выполнение запроса выполняется в этой процедуре, если обработчик запроса прямо или косвенно не запускает другую процедуру для выполнения работы от имени обработчика запроса.Поскольку обработчик запросов контролирует используемые подпрограммы, нет необходимости «прикреплять» подпрограмму к запросу.

Сервер net / http восстанавливает панику при каждой подпрограмме соединения.Вот что документация говорит об этом :

Если ServeHTTP паникует, сервер (вызывающий ServeHTTP) предполагает, что эффект паники был изолирован для активного запроса.Он восстанавливает панику, записывает трассировку стека в журнал ошибок сервера и либо закрывает сетевое соединение, либо отправляет HTTP / 2 RST_STREAM, в зависимости от протокола HTTP.Чтобы прервать обработчик, чтобы клиент увидел прерванный ответ, но сервер не зарегистрировал ошибку, запаникуйте со значением ErrAbortHandler.

Обработчики запросов можно обернуть промежуточным программным обеспечением для восстановления паники с помощью предоставленной приложением логики,Пакет обработчиков Gorilla является одним из примеров того, как это сделать.

Если обработчик запроса запускает программу, выполняющую работу от имени запроса, то обработчик запроса обязан установитьвыздороветь в этом горутине.

0 голосов
/ 26 октября 2018

Да, вы можете прийти в себя от паники горутин.Это связующее ПО от гориллы делает это, но это также легко сделать самостоятельно.По сути, это просто завершение вашего обработчика в функцию, которая откладывает вызов recover() и обрабатывает оттуда панику.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...