【苹果通知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若是你们须要可找我要

相关文章
相关标签/搜索