zoukankan      html  css  js  c++  java
  • 【苹果通知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如果大家需要可找我要

  • 相关阅读:
    将文件移出版本控制 (Revision Control)
    luogu 1966 火柴排队
    bzoj 1069 最大土地面积
    bzoj 1060 时态同步
    luogu 1901 发射站
    bzoj 1007 水平可见直线
    bzoj 2654 tree
    luogu 2024 食物链
    10.21 模拟赛
    tyvj 1013 找啊找啊找GF
  • 原文地址:https://www.cnblogs.com/rjf1979/p/6738016.html
Copyright © 2011-2022 走看看