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

  • 相关阅读:
    微信小程序 单选按钮 最佳
    微信小程序 单选按钮的实现
    微信小程序 单选框实现
    Java Code To Create Pyramid and Pattern
    Java language
    npm Err! Unexpected end of JSON input while parsing near
    Node.js Express FrameWork Tutorial
    Higher-Order Function Examples
    Create First HTTP Web Server in Node.js: Complete Tutorial
    Node.js NPM Tutorial: Create, Publish, Extend & Manage
  • 原文地址:https://www.cnblogs.com/rjf1979/p/6738016.html
Copyright © 2011-2022 走看看