如何用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
相关产品推荐
相关产品推荐

