При попытке подписаться на службу Podio Push возникли непредвиденные ошибки. Я использую шаблон параллелизма golang, определенный здесь , а вот клиентская библиотека bayeux , используемая для подписки.
Обычно поток пытается сначала извлечь элемент, а затем подписаться на push-объект, предоставленный с объектом item. Существует объект канала, в котором я храню каждую задачу (taskLoad: ~ каждый item_id с учетными данными, необходимыми для поиска)
item := new(podio.Item)
item, err = podio.GetItem(itemId)
if err != nil {
log.Errorf("PODIO", "Could not get item %d -> %s", itemId, err)
return
}
, а затем внутри другого функа
messages := make(chan *bayeux.Message)
server := GetBayeux()
defer server.Close()
if err = push.Subscribe(server, messages); err != nil {
// log err, with item details
log.Errorf("PODIO", "%s", err, push)
// re-enqueue the task in taskLoad channel
go enqueueTask(true, messages, sigrepeat, timer)
// release sigwait channel on subscription error
<-sigwait
return
}
здесь GetBayeux
func - это просто синглтон, который оборачивает клиента
func GetBayeux() *bayeux.Client {
bayeuxOnce.Do(func() {
Bayeux = bayeux.NewClient("https://push.podio.com/faye", nil)
})
return Bayeux
}
есть около 15000 записей для прослушивания, и я должен подписаться на каждый из них, но, к сожалению иногда Я получаю одну из этих ошибок при обработке подписок
401:k9jx3v4qq276k9q84gokpqirhjrfbyd:Unknown client [{"channel":"/item/9164xxxxx","signature":"46bd8ab3ef2a31297d8f4f5ddxxxx","timestamp":"2018-01-02T14:34:02Z","expires_in":21600}]
OR
HTTP Status 400 [{"channel":"/item/9158xxxxx","signature":"31bf8b4697ca2fda69bd7fd532d08xxxxxx","timestamp":"2018-01-02T14:37:02Z","expires_in":21600}]
OR
[WRN] Bayeux connect failed: HTTP Status 400
OR
Bayeux connect failed: Post https://push.podio.com/faye: http2: server sent GOAWAY and closed the connection; LastStreamID=1999, ErrCode=NO_ERROR, debug=""
Итак, я хотел бы знать, почему у меня появились эти ошибки, и, прежде всего, как я могу их исправить, чтобы прослушивать все элементы в области действия.
Если кто-нибудь знает, есть ли какие-либо ограничения в отношении одновременного доступа в службу podio push?
Спасибо
ОБНОВЛЕНИЕ 2019-01-07
это был синглтон, который испортил процесс. как это было в контексте обычной программы, были некоторые подписки, которые не были разрешены, потому что сервер был закрыт другой программой. Исправление заключалось в том, чтобы раскрыть метод Unsubscribe
и использовать его вместо метода Close, который отключает клиента от сервера.
defer server.Close()
стал
defer push.Unsubscribe(server)