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

如何用Python通过Firebase Messaging异步批量发送推送通知?

如何用Firebase Messaging异步批量发送推送通知

当然可以!你现在用的同步逐个发送的方式效率确实太低了——100个用户花100秒,本质是因为每次send()都要单独发起一次HTTP请求,开销全耗在网络往返上了。Firebase Messaging提供了专门的批量发送能力,再结合异步处理,能把这个耗时压缩到几秒甚至更短。

核心优化:用send_multicast批量发送

Firebase Admin SDK的Python版本里,messaging.send_multicast()方法可以一次性给最多500个token发送相同的消息,这比逐个调用send()效率高太多,因为它把多次HTTP请求合并成了一次。

直接上代码示例:

from firebase_admin import messaging

# 先把所有用户的FCM Token收集到一个列表里
user_tokens = [user['fcmToken'] for user in users]

# 构造批量推送消息
multicast_message = messaging.MulticastMessage(
    notification=messaging.Notification(
        title="Push title",
        body="Push body"
    ),
    tokens=user_tokens  # 这里传token列表,而不是单个token
)

# 发送批量消息
response = messaging.send_multicast(multicast_message)

# 可以查看发送结果统计
print(f"成功推送: {response.success_count} 条,失败: {response.failure_count} 条")

# 如果有失败的情况,还能定位具体哪个token出了问题
for index, error in enumerate(response.errors):
    if error:
        print(f"Token {user_tokens[index]} 推送失败,原因: {error}")

进一步提速:异步批量发送

如果你的用户量很大(比如超过500),或者想彻底解放主线程,可以用SDK提供的异步版本async_send_multicast(),配合Python的asyncio实现并发发送多个批次:

import asyncio
from firebase_admin import messaging

async def send_batch(batch_tokens):
    """发送单个批次的推送"""
    message = messaging.MulticastMessage(
        notification=messaging.Notification(
            title="Push title",
            body="Push body"
        ),
        tokens=batch_tokens
    )
    return await messaging.async_send_multicast(message)

async def main():
    # 把所有token分成每500个一组的批次(Firebase批量上限是500)
    all_tokens = [user['fcmToken'] for user in users]
    batch_size = 500
    token_batches = [all_tokens[i:i+batch_size] for i in range(0, len(all_tokens), batch_size)]
    
    # 并发执行所有批次的发送任务
    tasks = [send_batch(batch) for batch in token_batches]
    results = await asyncio.gather(*tasks)
    
    # 统计全局发送结果
    total_success = sum(res.success_count for res in results)
    total_failure = sum(res.failure_count for res in results)
    print(f"总成功推送: {total_success} 条,总失败: {total_failure} 条")

if __name__ == "__main__":
    asyncio.run(main())

几个关键注意点

  • 批次大小限制:不管是同步还是异步的批量方法,每个请求最多只能传500个token,超过的话必须分批次处理
  • 失败重试:对于推送失败的token,建议记录下来,后续可以重试(有些失败是临时的,比如设备离线),或者标记为无效token清理掉
  • 限流问题:Firebase有请求频次限制,并发发送批次的时候不要一次性发起太多,比如控制同时发送的批次在10个以内,避免触发限流

内容的提问来源于stack exchange,提问作者Serik Shaikamalov

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 00:12:40