【蘋果通知APNs】不知道大家用過PushSharp沒?


好久沒寫東西了,近期在研究Jenkins,大家有興趣可以一起來玩玩交流,學習DevOps還是蠻重要。

近期我負責的項目里需要APNs的通知,這個自己單獨開發還是蠻費功夫,故用了第三方開源的PushSharp。里面倒是有很多對接的通知,類似亞馬遜,GSM,黑莓,Windows,還有就是蘋果。

首先我先說說使用中碰到的問題,在對接后密集請求發送到APNs的服務端時,一般常會碰到兩種情況,一個是InvalidToken和ConnectionError,但它里面有個小小的潛規則,就是連續反饋InvalidToken情況下,后續不管你是正確的Token它都會拒絕你連接,直接反饋ConnectionError,反正我時常碰到這種情況,后來查了度娘后有人據說蘋果的APNs這種做是為了防止惡意的攻擊,想想如果人家隨便生成一個無效Token去大量請求你,APNs還能忍受嘛,肯定連續拒絕,當然過一段時間肯定又能發送了,因為它不會禁IP。

我碰到這種沒有請求通知成功的,可以篩選出ConnectionError再次請求發送通知就可以了。還有如果你覺得它的發送請求太慢可以調整內部連接對象池的數量,代碼如下:

var config = ApnsConfigurationFactory.CreateConfiguration();
var apnsBroker = new ApnsServiceBroker(config);
apnsBroker.ChangeScale(10);//內部連接對象池數量,建議10個足夠用,一般四核機可控制在最高40%
apnsBroker.Start();

如果機器夠強悍,你可以開多點,20,30,50都可以,開的越多,他能更快的處理大並發請求通知。

對了,關於PushSharp我在部署生成環境后,發現大並發發送請求會導致服務宕機,發現兩大問題:

一、Console.WriteLine的方法里最終在Buffer部分會導致內存溢出,故我把這塊代碼給禁閉了,代碼如下調整:

        static Log()
        {
            counters = new Dictionary<CounterToken, Stopwatch>();
            loggers = new List<ILogger>();
#if DEBUG
            AddLogger(new ConsoleLogger());
#endif
        }

以上是在PushSharp.Core.Log類里的靜態構造函數調整了代碼,我不讓執行Console.WriteLine

二、是關於內部沒有用線程安全隊列導致的問題,也會宕機,我替換成線程安全隊列,圖片如下:

改動位置:PushSharp.Apple.ApnsConnection

 

經以上改動目前運行也是良好,未出現宕機,也希望給各位踩坑的朋友帶來警示。

改動后的DLL如果大家需要可找我要

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM