尝试订阅Podio Push服务时遇到一些意外错误。我使用定义为here的golang并发模式,这是用于订阅的bayeux client library。
基本上,该流程首先尝试检索项目,然后订阅与项目对象一起提供的推送对象。有一个通道对象,我在其中存储每个任务(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
}
,然后在另一个func内部
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 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
是使流程混乱的单例。就像在goroutine上下文中一样,由于服务器已被另一个goroutine关闭,所以不允许某些订阅。解决方法是公开
Unsubscribe
方法并使用它,而不是使用Close方法将客户端与服务器断开连接。
defer server.Close()
成为
defer push.Unsubscribe(server)