v2ex也有很多讨论帖,但从我最后的实践结果来看,这些都没说到重点。
http://64.233.160.68/search?q=site:
v2ex.com/t%20apns所以想到在此分享下我在解决APNs推送的一些经验。
推送的效率与两个因素有关
1,服务器与APNs Gateway的连接带宽
2,发送到APNs数据的有效性(保证每个消息体都是正确的,避免APNs主动close掉连接,因为重新创建一个ssl连接得花费大概1s的时间)
做到了这些,你就可以仅仅通过单线程来高效率推送。
提醒一下,github上最热门的几个APNs推送项目不是最佳选择,他们都是单个消息体传送,这样的话,ip层就浪费太大,MTU如果是1500的话,我们可以把7个消息体封装到一个package去,这样ip层一个数据包就可以传输7条推送。
理想状态下的推送,每秒发送数可以直接计算得出:
(最大带宽/每个消息体大小),假设你能保证与APNs服务器有10M字节的传输速度,每个消息体200字节,那么你每秒可以推送 10×1000×1000/200 = 5W,也就是1min可以推送300W条。除去组装数据和其他逻辑处理,1分钟至少也可以达到百万级别。
那么,推送次数如若没有达到10亿级别,所有的异步,协程,多线程都是不必要的。
最开始设计celery+rabbitmq的组合方案也就没有什么优势了,不过方便以后横向扩展。
还有badge,长连接过程中一段时间没有数据后,会被reset的情况也欢迎大家讨论。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
https://www.v2ex.com/t/133928
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.