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如果大家需要可找我要

  • 相关阅读:
    leetcode
    Eclipse出现&quot;Running Android Lint has encountered a problem&quot;解决方式
    乱码又来捣乱了
    给MySQL增加一个表示例
    给MySQL中某表增加一个新字段,设为主键值为自动增长。
    MySQL数据源在Spring中的配置
    DB2数据源在Spring环境中的配置
    为何你变成了“焦”“郁”“碌(怒)”
    十一有感
    将来的你 一定会感谢 现在努力拼搏奋斗的自己
  • 原文地址:https://www.cnblogs.com/rjf1979/p/6738016.html
Copyright © 2011-2022 走看看