【蘋果通知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均可以,開的越多,他能更快的處理大併發請求通知。spa

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

1、Console.WriteLine的方法裏最終在Buffer部分會致使內存溢出,故我把這塊代碼給禁閉了,代碼以下調整:線程

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

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

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

改動位置:PushSharp.Apple.ApnsConnectionblog

 

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

改動後的DLL若是你們須要可找我要

相關文章
相關標籤/搜索