很久没写东西了,近期在研究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若是你们须要可找我要