我有一个网络应用程序和一个Windows服务,它们使用Firebase云消息进行通信。Web应用程序订阅了几个主题以接收消息,Windows服务应用程序向其中一个主题发送消息。在某些情况下,它可能是每秒几条消息,它会给我这个错误:
FirebaseAdmin.Messaging.FirebaseMessagingException:主题配额超过
我不太明白。可以发送到特定主题的消息有限制吗?或者意思是什么?到目前为止,我只找到了关于主题名称和订阅限制的信息,但实际上我找不到任何关于";主题配额";,除了这一页的文档(https://firebase.google.com/docs/cloud-messaging/concept-options#fanout_throttling)尽管我不确定它指的是同一件事,以防它是否以及如何改变。在Firebase控制台中,我也找不到任何东西。有人有主意吗?
嗯。。从这份文件中可以很清楚地看出,这是可能发生的:
每个项目的新订阅频率是有费率限制的。如果你FCM在短时间内发送过多的订阅请求服务器将以429 RESOURCE_EXHAUSTED("超过配额"(响应回答使用指数退避重试。
我确实同意文档应该说明有多少数量将触发块机制,而不是仅仅告诉开发人员"用指数后退重试">。但是,最终,谷歌也制作了这份文档,以帮助开发人员了解如何正确地实现这一机制。简而言之:
如果请求失败,请等待1+random_number_milliseconds,然后请重试该请求。
如果请求失败,请等待2+random_number_milliseconds,然后请重试该请求。
如果请求失败,请等待4+random_number_milliseconds,然后请重试该请求。
依此类推,直到最大后退时间。
我的结论:减少发送到主题的消息数量,或者实现重试机制来恢复不成功的尝试
可能是以下问题之一:
1.订阅率过高
如所述
每个项目的新订阅频率是有费率限制的。如果您在短时间内发送了过多的订阅请求,FCM服务器将以429 RESOURCE_EXHAUSTED("超过配额"(响应。使用指数退避重试。但这似乎不是你的问题,因为你没有开通新的订阅,而是以高速率发送消息。
2.在设备上发送的消息太多
如此处所述
单个设备的最大消息速率对于Android,您可以向单个设备发送240条消息/分钟和5000条消息/小时。这个高阈值是为了允许短期的流量爆发,例如当用户通过聊天快速互动时。此限制可防止发送逻辑中的错误无意中耗尽设备上的电池电量。
对于iOS,当速率超过APN限制时,我们会返回一个错误。
注意:不要经常发送接近此最大速率的消息。这可能会浪费最终用户的资源,并且您的应用程序可能被标记为辱骂的
尾注
扇出节流似乎不是这里的问题,因为利率限制确实很高。
解决问题的最佳方法是:
- 降低您的费率,控制";设备";通知并在短时间内全面限制您的使用
- 保持费率不变,但在Windows服务应用程序中实施回退重试策略
- 也许可以考虑一种更适合您使用的服务(因为FCM非常关注最终客户通知(,比如PubSub