阅读我发现的文档:
XMPP服务器节流我们将您连接到FCM XMPP服务器的速率限制为每个项目每分钟400个连接。这对消息传递来说不应该是一个问题,但对确保系统的稳定性很重要。对于每个项目,FCM允许2500个并行连接。
https://firebase.google.com/docs/cloud-messaging/concept-options#xmpp_throttling
该页面中还描述了连接到FCM发送消息的不同方式。HTML和XMPP是不同的机制,所以我假设管理员SDK(在我的例子中是Golang(在后台使用HTTP而不是XMPP,所以如果这不是真的,请纠正我。
如果管理SDK使用HTTP,则意味着只能有2500个同时连接。
我正在制作一个可扩展的应用程序,用户基本上可以定义自己的通知(和消息(时间表,服务器会检索它,每隔30秒左右运行一次定时器循环,以查看谁需要发送他们的消息。
出于所有意图和目的,每个通知都是不同的。然而,绝大多数通知都会准时送达。这意味着我的服务器将不得不在一小时内的X:00分钟内发送可能成千上万的通知。重要的是这些通知要准时送达(即,我不能在一小时内把它们全部隔开(。
在我的情况下,使用像主题这样的变通方法是行不通的,因为每个人都是个体的。
我只是在考虑如何应对这些限制(并确保我理解它们(。如果FCM允许通过Go中的管理SDK并行2500个连接,我可以进行2500个异步连接,等待它们全部完成,然后再进行2500个,冲洗并重复吗?这样,如果我有25000个订阅用户,每个用户需要1秒,理论上我可以在10秒内发送所有通知,这是可以接受的。
我是否需要了解其他利率限制?
谢谢!
我假设管理员SDK(在我的例子中是Golang(在后台使用HTTP
这是正确的。管理SDK使用版本化的HTTP API来调用FCM。
扩展FCM使用率的关键是有效地使用资源。例如,在版本化的API(管理SDK在后台使用(中,您可以通过单个HTTP连接传递多达500个请求,这意味着您可以通过多次调用分摊建立连接的成本。
您可以在关于向多个设备发送消息的文档中的REST示例中找到实际HTTP调用的示例:
--subrequest_boundary Content-Type: application/http Content-Transfer-Encoding: binary Authorization: Bearer ya29.ElqKBGN2Ri_Uz...HnS_uNreA POST /v1/projects/myproject-b5ae1/messages:send Content-Type: application/json accept: application/json { "message":{ "token":"bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...", "notification":{ "title":"FCM Message", "body":"This is an FCM notification message!" } } } ... --subrequest_boundary Content-Type: application/http Content-Transfer-Encoding: binary Authorization: Bearer ya29.ElqKBGN2Ri_Uz...HnS_uNreA POST /v1/projects/myproject-b5ae1/messages:send Content-Type: application/json accept: application/json { "message":{ "token":"cR1rjyj4_Kc:APA91bGusqbypSuMdsh7jSNrW4nzsM...", "notification":{ "title":"FCM Message", "body":"This is an FCM notification message!" } } } --subrequest_boundary--
在Go Admin SDK中,这相当于调用sendAll
,即:
func (c Client) SendAll(ctx context.Context, messages []*Message) (*BatchResponse, error)
SendAll通过Firebase Cloud Messaging发送给定阵列中的消息。
消息数组最多可包含500条消息。SendAll使用批处理将整个[messages]数组作为单个RPC调用发送。与
Send()
功能相比,这是一种发送多条消息的高效方式。从返回值获得的响应列表对应于输入消息的顺序。来自SendAll
的错误表示完全失败,即阵列中的任何消息都无法发送。部分故障由BatchResponse
返回值指示。