蘋果伺服器是如何承載全球移動設備Push請求的?

今天和同事討論iOS Push問題,想到微信和手Q這麼大的用戶量,對於蘋果的Push伺服器群要承載全球移動設備的Push需求,是怎麼做到及時響應的和伺服器負載平衡的,有沒有大牛分析下。


無聊,來答一發,奉上學習筆記

多圖預警!!!

先說明一點,所有資料全部來自網上,信則有不信則無

先回答問題:

想到微信和手Q這麼大的用戶量,對於蘋果的Push伺服器群要承載全球移動設備的Push需求,是怎麼做到及時響應的和伺服器負載平衡

1.大用戶量的需要provider(APP服務提供商)做一定的優化,比如微信做的推送隊列,異地負載均衡,不然出口會被阻塞

2.前端DNS做了一部分負載均衡

3.架構設計,對於每個device一個後台進程,處理所有APP的推送消息,轉化為一個大型消息推送系統,接收provider的消息,送入推送隊列,分發到device設備

4.限制發送速度,放棄一部分可靠性,並不保證消息一定到達

5.其他,私有二進位協議,減少數據冗餘,提升長連接並發數,MQ等等

相關概念及數據:

APNs使用場景:絕大部分是APP後台沒有運行,必須藉助於APNs通知用戶,對於APP後台運行的,一般使用的是本地PUSH,是由APP自己獲取消息本地推送給通知程序,對於如微信APP內部的聊天消息,那個就跟APNs沒關係了,為什麼不用,因為不可靠

iPhone 不允許後台跑服務聯網,APNs是唯一的PUSH選擇

蘋果iPhone 用戶數:2018年底iPhone用戶數增至6.5億

分析師稱2018年底iPhone用戶數增至6.5億 iPhone,用戶,統計,分析 _WeiPhone威鋒網

蘋果官網APNs推送數據:最近的數據沒有找到,WWDC 2012上宣布每天發送70億條,Technical Note TN2265: Troubleshooting Push Notifications,2012年,蘋果應用商店擁有超過4億信用卡賬戶(估計活躍用戶沒那麼多),2013年5億用戶,加上這幾年移動互聯網發展,APNs推送數據至少達到700億量級,甚至可能上千億

WWDC2012 數據

單條消息大小不超過2kbyteApple Push Notification Service

provider server單鏈接發送到APN發送速度官方推薦最好低於9,000 notifications per second,可以使用多線程技術,建多個鏈接,單台伺服器的處理能力沒有查到,provider發送到的APNs的消息並不會馬上被發送,直到用戶設備連接到APNs,具體等待時間沒有提,每個設備每個APP會有一個發送隊列,默認保存一個消息,如果原來的消息未發送,新來的消息會覆蓋原來的,不保證用戶一定會收到

Technical Note TN2265: Troubleshooting Push Notifications

QQ目前日活躍用戶數:高峰2.2億左右,同時並發幾億個鏈接

微信目前未知,應該和QQ差不多

apns server(gateway.push.apple.com)的網關DNS是做了負載均衡的,可以用dig或nslookup查,目測不止8台,每次出來的IP不一樣,網段是17.0.0.0/8 具體用了多少個地址不知道,可以自己爬,一個3000萬日活躍用戶App的真實數據,另外就算查出IP地址,也不知道內網機器有多少,內網還可以再做負載均衡

APN伺服器採用是push方案,維持長連接,按目前業界大公司鏈接數:優化後單台可以達到2000k

心跳鏈接:一般為15分鐘,具體心跳策略不知道,這個可以根據使用情況優化

APNs使用的埠號:Unable to use Apple Push Notification service (APNs)

apple各服務使用的埠號:TCP and UDP ports used by Apple software products

  • TCP port 5223 (used by devices to communicate to the APNs servers)
  • TCP port 2195 (used to send notifications to the APNs)
  • TCP port 2196 (used by the APNs feedback service)
  • TCP Port 443 (used as a fallback on Wi-fi only, when devices are unable to communicate to APNs on port 5223)

發送消息gateway.push.apple.com, port 2195

接收反饋信息feedback.push.apple.com on port 2196

用戶接收消息 on port 5223 或者 443

另外注意一點APNs包括遠端PUSH和本地PUSH,本地不需要經過APNs伺服器,由APP建立長連接獲取消息推送給手機

協議:目前來看傳送消息採用的是自定義的二進位協議,好像已經不用原來的XMPP協議了,初始採用TLS/SSL鏈接,Push: The history, experience, cost and future ? kellabyte

APNs系統邏輯:

Apple Push Notification Services in iOS 6 Tutorial: Part 1/2

  1. An app enables push notifications. The user has to confirm that he wishes to receive these notifications.
  2. The app receives a 「device token」. You can think of the device token as the address that push notifications will be sent to.
  3. The app sends the device token to your server.
  4. When something of interest to your app happens, the server sends a push notification to the Apple Push Notification Service, or APNS for short.
  5. APNS sends the push notification to the user』s device.

詳細的去官網看

1. 基本流程

再說微信:

APNs與微信推送作者是騰訊的

微信本身針對APN做了一個前端推送系統,但是發消息還是基於APN,為了做一個海量用戶的推送系統,只建立一個到APNs的連接是不夠的。單鏈接速度是有限制的,可以根據需要多建立一些連接。微信 做了推送隊列,異地負載均衡,另外微信後台做了本地PUSH,也就意味著當你打開微信應用的時候,數據基本不走APN server了,減少了APNs壓力

微信APNs推送系統的基本架構

再說後台系統框架:

蘋果沒有公布他的框架,但是依照目前的數據推測,可能是一個同時並發5億個長鏈接的消息系統,但是我們可以參考另外一個億級平台的消息系統whatsapp支撐4.5億活躍用戶的WhatsApp架構概覽-CSDN.NET

2013年數據

  • 4.5億的活躍用戶,並且是史上最快達到這個數字的公司
  • 32個工程師,平均每人支撐1400萬活躍用戶
  • 每天收發跨7個平台的500億消息
  • 平均每天註冊用戶過百萬
  • 0廣告開銷
  • 800萬投資
  • 數百個節點
  • 8000+核心
  • 數百TB內存
  • 每秒Erlang消息超過7000萬
  • 在2011年,WhatsApp單伺服器取得 100萬個tcp會話,同時還有內存和CPU剩餘。在2012年, tcp會話發展到了200萬。2013年WhatsApp 發表tweet聲明,70億消息入站,110億消息出戰,即每天處理180億消息,偉大的2013!

從這個數據上看,APNs,至少也得數百個節點啊

國內其他推送平台數據:

《移動應用-01手機淘寶長連接及分散式消息推送系統的架構與實踐-2.pdf》-王少川

2014年淘寶無線系統消息推送系統模型

? 長連保持(單機實現數百萬長連)

? 用戶在線狀態的准

確性(網路優化的心跳機制)

? 協議(SPDY)

? 安全(獨有的安全加密方式,已実請專利)

? 數據層非對稱加密等

? 長連接技術選型(Grizzly,心跳、數據包處理優化等)

? 用戶信息存儲優化(盡量少佔內存,如:使用Java堆外內存等)

? JVM參數優化(內存優化,CMS及線程優化回收等)

? OS層系統參數優化(TCP內存優化及連接回收等)

《移動互聯網實時消息推送系統的設計和實現》吳仲深 @阿里雲無線

2013新浪無線消息推送系統《消息推送系統.pdf》-周雲

小Tips:網路編程的各種雷

1、工作模式:單進程/線程或多進程/線程

2、埠回收:短連接模式下,客戶端埠復用、回收問題

3、網路隊列:系統處理未接受連接的數量

4、內部通訊及鎖 :多進程/線程工作模式下的相互通訊與鎖

5、文件描述符:limit的限制,更深層次的限制

6、內存問題:各種Buffer的使用控制,須有一個最大值

7、環境問題:系統版本及參數設置、網線情況、交換機情況

8、超時問題:網路、業務超時的處理

9、通道問題:在連接改變成單向模式時,需要做特殊處理

極光推送《大容量雲推送技術解析

》http://www.slideshare.net/kaerseng/ss-15885064

《百度雲推送介紹和架構分享》-郭振

百度雲推送介紹和架構分享

總結:IOS全部走APNs,Android平台自己搞一個

用到的技術:單機長連接數,分散式消息隊列,精簡協議,心跳策略優化,redis,epoll,主從熱備,異地負載均衡,其他各種優化等等

還有個騰訊中間件

《TDBank系列之二:分散式海量消息中間件系統-Tube的設計原理與實踐》TDBank系列之二:分散式海量消息中間件系統-Tube的設計原理與實踐感興趣的可以自己去看,每天處理的消息量達8000億

PPT可以下來看一眼,其他的您們補充吧

最後最重要的,如果侵權請告訴我,馬上刪!!!


就說一點,APNs的IP段是 17.0.0.0/8


推薦閱讀:

iOS 上有哪些程序員必備 App?
金山詞霸 iOS 版是如何實現長時間後台查詞以及發音的?
為什麼iPhone充電從99%到100%特別慢?
App Store 上新出的 Deus Ex The Fall 和該系列的其他作品有什麼不同?這款作品在 iPhone 上表現如何?
如何評價部落衝突這款遊戲?

TAG:iOS | 伺服器 | 推送Push |