V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
iOS 开发实用技术导航
NSHipster 中文版
http://nshipster.cn/
cocos2d 开源 2D 游戏引擎
http://www.cocos2d-iphone.org/
CocoaPods
http://cocoapods.org/
Google Analytics for Mobile 统计解决方案
http://code.google.com/mobile/analytics/
WWDC
https://developer.apple.com/wwdc/
Design Guides and Resources
https://developer.apple.com/design/
Transcripts of WWDC sessions
http://asciiwwdc.com
Cocoa with Love
http://cocoawithlove.com/
Cocoa Dev Central
http://cocoadevcentral.com/
NSHipster
http://nshipster.com/
Style Guides
Google Objective-C Style Guide
NYTimes Objective-C Style Guide
Useful Tools and Services
Charles Web Debugging Proxy
Smore
athenaxp
V2EX  ›  iDev

请问有人实现过大规模(百万级)的APNS服务端么?

  •  
  •   athenaxp · 2013-05-30 13:23:51 +08:00 · 5590 次点击
    这是一个创建于 4223 天前的主题,其中的信息可能已经有所发展或是发生改变。
    现在发送不是问题,但是由于苹果的设定,遇到失效的ptoken就会关闭连接,导致于不能重用长连接,那么效率就很低了,如何能够使用长连接还可以避开失效ptoken?

    请教各位有什么经验么?
    13 条回复    2015-10-29 11:28:38 +08:00
    est
        1
    est  
       2013-05-30 13:29:48 +08:00
    用过。多线程发就行了。
    laputa7
        2
    laputa7  
       2013-05-30 14:02:17 +08:00
    推送前应该调用苹果的feedback服务,把失效的token干掉。
    athenaxp
        3
    athenaxp  
    OP
       2013-05-30 14:02:38 +08:00
    @est 请问如何解决的invalid ptoken导致关闭连接的问题?
    est
        4
    est  
       2013-05-30 14:03:50 +08:00
    @athenaxp 一个连接断了不影响其他999999个TCP连接发送呀。苹果的simple和enhanced格式都会断连接的。别折腾长连接了。早发完早收工。
    ipconfiger
        5
    ipconfiger  
       2013-05-30 14:11:02 +08:00
    遇到失败就干掉连接,重新建立一个继续......,然后用gevent开一堆纤程来跑
    athenaxp
        6
    athenaxp  
    OP
       2013-05-30 14:12:08 +08:00
    @laputa7 苹果的文档上说,他会返回最近一次connect失败的token,这样的话feedback并不能预知这一次push的token种哪些失效了,还是无法避免在一个连接中给多个token发消息,中间有一个token失效,导致后续的所有消息都无法收到的问题。
    athenaxp
        7
    athenaxp  
    OP
       2013-05-30 14:15:29 +08:00
    @est
    @ipconfiger 这样会不会被苹果干掉?我用10个线程跑,就会经常遇到连接超时了。
    Cadina
        8
    Cadina  
       2013-05-30 14:23:34 +08:00
    遇到失效token导致的连接断开直接重新连接就可以了,没有别的办法,觉得太慢就加大并发。
    有一点需要注意,就是token失效断开连接是有延时的,大概1-2s左右,但是不能每发送一条就等这么久,需要用select来提升性能,这样带来的问题是有可能失效的token后面又发送了几条连接才被关闭,这时候后面的其实是没有发送成功的,你需要维护一个队列,遇到这种情况的时候跳过那个失效的token从后面一条开始重试。
    laputa7
        9
    laputa7  
       2013-05-30 15:28:05 +08:00
    @athenaxp 可以参考这个 https://github.com/duccio/ApnsPHP ,遇到失效的token被断开连接后会再重连,跳过失效的token推送下一个,发送前调用feedback服务是为了减少无效的推送,也就尽量避免了断开重连,但确实无法确保此次推送的token全部有效。
    athenaxp
        10
    athenaxp  
    OP
       2013-05-30 16:39:11 +08:00
    @laputa7
    @Cadina thanks all.我准备对架构做大改了.
    felinx
        11
    felinx  
       2013-05-30 17:11:06 +08:00
    1. 断链之前一端时间内的要重发,所以消息要缓存一段供必要时回滚
    2. apns feedback过来无效的token要清掉不再发,减少断链的可能
    3. 尽量用异步、长链接方案
    4. 我这每天大推时,单机1分钟大约推百万级ios设备。
    nesuk
        12
    nesuk  
       2015-10-29 10:22:24 +08:00
    @felinx 冒昧请问最近是否依然关注 apns?
    felinx
        13
    felinx  
       2015-10-29 11:28:38 +08:00   ❤️ 1
    @nesuk 好老的帖被挖出来了,在关注的。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2566 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 10:44 · PVG 18:44 · LAX 02:44 · JFK 05:44
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.