You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何高效向数千用户的Firebase设备组批量发送推送通知?

FCM设备组千量级推送性能优化问题

我们在应用后端集成了Firebase device group功能,可向用户的所有设备发送消息。根据官方文档说明,向设备组发消息需要携带notification key向Firebase发起请求。我们现有4000名用户的场景下,实现逻辑是遍历所有用户的notification key列表,逐个为每个用户发送消息。

该方案需要向Firebase API发起数千次网络请求,运行效率极低。我们使用Firebase Cloud Admin SDK实现推送功能的过程中,未找到面向设备组的"topic"类批量消息推送能力。

想咨询业内是否有比遍历notification key发起多次请求更高效的设备组推送方案?

以下是我们当前单设备组的消息发送代码:

public async Task<SendDeviceMessageResponse> SendNotificationToDevices(DeviceMessage message)
{
    var resultStr = await Post(JsonConvert.SerializeObject(message), FirebaseSendMessageURL);
    var result = JsonConvert.DeserializeObject<SendDeviceMessageResponse>(resultStr);

    if (result.FailureCount == 0 && result.SuccessCount == 0)
    {
        result.ResponseType = ResponseType.EmptyDeviceGroup;
    }
    else if (result.FailureCount > 0 && result.SuccessCount > 0)
    {
        result.ResponseType = ResponseType.PartialSuccess;
    }
    else if (result.FailureCount == 0 && result.SuccessCount > 0)
    {
        result.ResponseType = ResponseType.TotalSuccess;
    }
    else
    {
        result.ResponseType = ResponseType.TotalFailure;
    }

    return result;
}


private async Task<string> PostToFirebaseDeviceGroup(DeviceGroupRequestModel requestModel)
{
    string body = JsonConvert.SerializeObject(requestModel);
    var respStr = await Post(body, BaseFCMNotificationsURL);
    return respStr;
}

上述代码的完整实现可查看该代码仓库。

当前我们需要向多个设备组发消息时,会遍历所有设备组逐个调用上述SendNotificationToDevices方法,这就是性能瓶颈的来源。使用Topic消息仅需发起一次请求即可完成批量推送,想问设备组是否有类似Topic的批量推送能力?或是有其他更高效的千量级消息推送方案?


解决方案

方案1:复用FCM单Token批量发送接口

FCM的设备组notification key本质是特殊的Token,所有面向单Token的批量能力都可以直接复用。Firebase官方提供了批量发送接口,单次请求最多支持500个独立推送任务,4000个设备组仅需8次请求即可完成,能直接把请求量降低到原来的1/500,改造成本极低。
可以直接用Admin SDK封装好的SendAllAsync方法实现,不需要自己封装HTTP请求:

// 构造所有设备组的推送消息集合
var messages = new List<Message>();
foreach (var notificationKey in userNotificationKeys)
{
    messages.Add(new Message()
    {
        Token = notificationKey,
        Notification = new Notification()
        {
            Title = "你的推送标题",
            Body = "你的推送内容"
        }
        // 按需补充其他自定义参数
    });
}
// 批量发送,SDK会自动拆分超过500条的批次,也可自己控制批次大小避开限流
var batchResponse = await FirebaseMessaging.DefaultInstance.SendAllAsync(messages);
// 按业务需求处理成功/失败的推送结果即可

方案2:结合Topic实现单请求全量推送

如果你的推送场景是给全量/特定群体的用户发统一内容的通知,不需要单用户差异化,可调整设备关联逻辑:给每个用户的所有设备订阅对应用户标识的私有Topic,同时按需订阅公共/分组Topic。给全量用户发通知时直接调用公共Topic的推送接口,仅需1次请求即可完成所有用户的推送。
如果需要给特定属性的用户群体推送,也可以用FCM条件Topic组合实现,同样可以做到单请求批量推送。

临时优化方案

如果暂时不想调整核心逻辑,也可以先把当前的串行遍历调用改成并行异步调用,控制好并发数避免触发FCM限流规则,在现有架构基础上也能获得数倍的性能提升。

注:FCM没有单独提供设备组专属的批量推送接口,直接复用通用批量发送能力即可覆盖你的需求。


内容的提问来源于stack exchange,提问作者Damien Doumer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.17 03:06:06