以并发模式订阅Podio Push服务时出现4xx错误

时间:2019-01-03 12:51:46

标签: go goroutine podio

尝试订阅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)

0 个答案:

没有答案