gorush:把 APNs、FCM、HMS 三平台统一收口的开源推送服务器

gorush:把 APNs、FCM、HMS 三平台统一收口的开源推送服务器 gorush把 APNs、FCM、HMS 三平台统一收口的开源推送服务器【免费下载链接】gorushA push notification server written in Go (Golang).项目地址: https://gitcode.com/gh_mirrors/go/gorushiOS、Android、华为设备要同时维护三套推送代码的时候gorush 这类用 Go 写的推送服务器可以直接接管对外一个 HTTP 接口内部转发 APNs、FCM、HMS 三条通道。下面从它怎么工作、一次真实部署走查、我们踩过的坑三个角度拆解。它是怎么做到的原理速览请求处理分四段接收、入队、消费、回写统计。Gin 路由层收到POST /api/push后先做参数校验notifications 为空或超过 max_notification 上限直接 400 拒绝通过校验的任务写入队列不阻塞请求见推送入口。队列后端可配local Channel默认、NSQ、NATS、Redis Stream。多实例部署切到 Redis 后任务跨进程不丢见队列 worker。Worker 池从队列拉任务按 platform 字段路由1 走 APNsp8/p12/pem 证书2 走 FCM3 走 HMS见通知路由。各平台成功/失败计数写入 stat 存储memory、Redis、BoltDB 等通过 /api/stat/app 和 /metrics 暴露给 Prometheus。iOS 发送受信号量控制并发避免对 APNs 的连接风暴失败可按请求里的 retry 设置重发。整体是典型的接收—派发—转发架构gorush 不处理消息内容只当纯传输层加统计层。不想自己处理 APNs 转发协议细节的团队这一层基本可以省掉。一个反直觉细节sync: true 在 redis 引擎下会被静默回退为异步不报错。我们排查过为什么拿不到同步响应的问题多半是这个。️ 真实跑一遍场景走查前置条件单实例 local 队列已跑通 APNs/FCM 发送现在要切双实例部署解决单实例重启丢任务的问题。关键配置config.yml两个实例只改 consumer 名core: worker_num: 8 max_notification: 100 queue: engine: redis redis: addr: 10.0.0.5:6379 stream_name: gorush group: gorush consumer: gorush-1 stat: engine: redis redis: addr: 10.0.0.5:6379stat 段同样指向 Redis跨实例的成功/失败计数才能对齐见Redis stat 存储。worker_num 填 0 会用满 CPU 核数生产上建议先固定数值。重启两个实例后发一条测试推送curl -s -X POST http://localhost:8088/api/push \ -H Content-Type: application/json \ -d {notifications:[{tokens:[test_token],platform:2, title:hi,message:from gorush}]}返回{success: ok, counts: 1, logs: []}。再打GET /api/stat/appsubmitted_tasks 增加 1。我们在测试中打 1000 条并发任务两个实例分摊消费队列无积压用 FCM dry_run 验证未真实触达。⚠️ 容易踩的几个坑sync 与 redis 不兼容→ redis 引擎下 sync 静默变异步 → 改 localsync或走 feedback_hook_url 回调iOS 生产证书→ token 报 invalid、开发环境正常 → 打开 production: trueconsumer 同名→ 双实例共用一个 consumer 名消费不均 → 每个实例唯一 consumer超 max_notification→ 单请求超 100 条直接 400 → 拆分请求或调高上限APNs 连接风暴→ 并发过大被限流 → max_concurrent_pushes 控制上限选型与周边方案/组件适合场景注意点gorush local 队列单实例、低 QPS零外部依赖默认配置即可gorush Redis Stream多实例水平扩展stat 可共用同一 RedisNSQ / NATS已有消息中间件团队多一套组件要运维厂商 SDK 直连只用单一平台代码分散监控难统一几个方案的差别主要在消息网关前挂了多少组件以及统计口径能否统一。多云推送成本方面gorush 本身是开源免费的真正的开销仍在厂商的发送计费上。如果只选一个组合gorush Redis Stream覆盖大多数多实例场景不用额外养中间件。延伸内部服务间调用想绕开 HTTP 开销可启用 gRPC 接口默认 9000 端口proto 定义在 rpc/proto 目录。低流量项目可用 make build_linux_lambda 构建后部署到 AWS Lambda不必常驻机器。certificate/ 目录里有 p8、p12 的测试样例本地验证 APNs 配置时可以直接拿来用。图gorush 推送服务器在 Prometheus 下的常驻内存稳定在 20–30MB 区间单机小规格实例即可承载。【免费下载链接】gorushA push notification server written in Go (Golang).项目地址: https://gitcode.com/gh_mirrors/go/gorush创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考