好久沒寫東西了,近期在研究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如果大家需要可找我要