Шаблон для обработки HTTP-запросов через каналы - PullRequest
0 голосов
/ 18 ноября 2018

Я пишу веб-приложение, в котором у меня давно запущена программа.Я хочу делегировать все HTTP-запросы в эту программу через каналы.Шаблон, с которым я столкнулся, таков:

// Internal long running goroutine
for{
  select{
  case e := <-event: //web request
    req := e.req
    // do something
    ....
    select {
    case <-ctx.Done():
       //log  
    default: 
      e.replyTo <- result
    }
  }
}

// Web handler
http.HandleFunc("/bar", func(w http.ResponseWriter, r *http.Request) {
  //decode request etc
  ...

  replyTo := make(chan interface{}, 1)
  ctx, cancel := context.WithCancel(context.BackGround())
  event <- Event{req: req, ctx: ctx, replyTo: replyTo}
  select{
  case <-time.After(time.Second):
     cancel()
     //return 500
  case r := <-replyTo:
    // return some response
  }
})

Я вижу, что в конце есть одна одиночная подпрограмма, так что параллелизм потерян, но я в порядке.

Является ли этот шаблон правильным способом сделать это?Какие еще подходы можно предложить?

1 Ответ

0 голосов
/ 18 ноября 2018

Является ли этот шаблон правильным способом сделать это?

Если предположить, что вы пытаетесь управлять состоянием в одной процедуре, я бы сказал нет .Я думаю, что было бы лучше иметь какую-то форму государственного менеджера, который отвечает за безопасность потоков.Поэтому обработчик должен принять что-то, что может управлять состоянием, и просто предоставить обработчику несколько методов.

type State interface{
  Load() (string, error)
  Save(something string) error
}

Отсоединение кода окупится позже.Это также позволит выполнять модульные тесты как для обработчика, так и для состояния, которые можно сфокусировать и прочитать.

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