APNs 高效率推送一些经验分享(no gevent,no celery,no multithreading)

2014-09-17 10:25:30 +08:00
 daydaysay
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的情况也欢迎大家讨论。
6216 次点击
所在节点    iDev
5 条回复
jiangzhuo
2014-09-17 13:52:12 +08:00
看了github上nodejs的實現star最多的 也是樓主說的這個問題
GTim
2014-09-17 17:20:39 +08:00
@jiangzhuo 给个链接
julyclyde
2014-09-18 13:34:47 +08:00
why no gevent?
抵制得毫无理由
daydaysay
2014-09-18 18:15:57 +08:00
@julyclyde
我的意思是不是任何业务都需要用框架来解决。用gevent当然可以提高最终效率。
现实中,碰到有家伙说到调优,提高速度,就是增加协程数,进程数。
”我再多开几个进程吧“
daydaysay
2014-09-18 18:16:57 +08:00
我的意思是,不是任何业务都需要用框架来解决

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/133928

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX