Публикация в google pub sub асинхронно через goroutine

Я пытаюсь отправить сообщение в google pub-sub асинхронно через горутину, но я сталкиваюсь с ошибкой ниже panic: not an App Engine context Я использую мультиплексор и имею обработчик API

п = 1 миллион

    func apihandler(w http.ResponseWriter, r *http.Request) {
       go createuniquecodes(n)
       return "request running in background"
    }

    func createuniquecodes(n) {
       c := make(chan string)
       go createuniquecodes(c, n)  
       for val := range c {        
           publishtopubsub(val)
       } 
   }
   func createuniquecodes(n) {
        for i := 0; i < n; i++ {
           uniquecode := some random string
           // publish to channel and pubsub
           c <- uniquecode
        }
        close(c)
   } 

func publishuq(msg string) error {
   ctx := context.Background()
   client, err := pubsub.NewClient(ctx, projectId)
   if err != nil {
     log.Fatalf("Could not create pubsub Client: %v", err)
   }
   t := client.Topic(topicName)
   result := t.Publish(ctx, &pubsub.Message{
   Data: []byte(msg),
 })
 id, err := result.Get(ctx)
 if err != nil {
    return err
}
fmt.Printf("Published a message; msg ID: %v\n", id)
return nil

}

Обратите внимание, что мне нужно сгенерировать 5 миллионов уникальных кодов. Как я буду определять контекст в процедуре go, поскольку я делаю все асинхронно?


person Gaurav Sharma    schedule 03.05.2019    source источник


Ответы (1)


Я предполагаю, что вы используете стандартную (не гибкую) среду App Engine. Обратите внимание, что «обработчик запросов (в вашем случае apihandler) имеет ограниченное количество времени для создания и возврата ответа на запрос, обычно около 60 секунд. По истечении крайнего срока обработчик запроса прерывается".

Вы пытаетесь «вырваться» из запроса при вызове go createuniquecodes(n), а затем ctx := context.Background() по линии, вот что паникует с not an App Engine context. Технически вы можете использовать https://cloud.google.com/appengine/docs/standard/go/reference#NewContext. чтобы получить действительный контекст из исходного контекста, но опять же, у вас будет только 60 секунд до истечения времени ожидания вашего запроса.

Ознакомьтесь с TaskQueues, так как они позволяют приложениям выполнять работать, называемые задачами, асинхронно вне запроса пользователя».

person mattes    schedule 03.05.2019
comment
Я делаю эту операцию асинхронно через горутину, поэтому не понимаю, почему произойдет тайм-аут? да, я могу использовать очередь задач и делегировать задачу в новый контекст через worker и опубликовать в pubsub - person Gaurav Sharma; 03.05.2019
comment
Стандартная среда App Engine имеет некоторые ограничения, одно из которых заключается в том, что горутина ограничена временем жизни запроса. Я сталкивался с той же проблемой раньше, возможно, эта ссылка будет полезна и для вас: stackoverflow.com/questions/27185405/ - person mattes; 04.05.2019