RamosLi / dbay-apns-for-java

High performance Java client for APNS(Apple Push Notification Service)
Apache License 2.0
238 stars 152 forks source link

大批量发送的疑问 #2

Open laoyur opened 10 years ago

laoyur commented 10 years ago

RamosLi 你好,我是通过Google搜到你的博客然后进到这里的。 大概看了一下你的demo和源码,貌似没有支持大批量发送的功能嘛? 如果有的话,最好封装成直接可用的API哦,并且更新相应Demo。

需要的功能是:大批量发送给成千上万个设备,并且能非常优雅地处理某些token失效后对后续token的重发机制。当然,对失效token的回调通知也应该是必不可少的。

往作者指教,谢谢

RamosLi commented 10 years ago

你好!这个库的设计就是为大批量发送准备的,demo中把所有的功能都列出来了,可能这给大家带来了疑惑。第一步:创建apnsService实例(创建一个即可),第二步:apnsService.sendNotification即可。如果量比较大,可以在第一步时调整下poolSize(apnsConfig.setPoolSize())。目前,我自己的应用每日发送量是百万级,还有家公司也是在用这个库,他们的发送量是千万级的,都运行良好哈 至于token失效自动重发,Apns服务关闭连接等等各种情况都考虑到了,并且实现了哈

laoyur commented 10 years ago

感谢作者这么快给予回复 是不是只要创建service后,只管调用sendNotification即可,所有的重连之类的机制都由框架自己处理了?这样的话听起来不错哈 但我还是想知道发送过程中失败的回调怎么使用(因为在某个token发送失败的时候,立刻将该token从库中标记为失效,要比在feedback中做来得高效),我是做c++的,对java不是很熟,看了一圈你的代码没明白怎么整 :) 如果Readerme中能直接写出例子来那是最好不过了。

RamosLi commented 10 years ago

对,创建service后只需要调用sendNotification就行了,其他所有的事情类库都做了。 至于清除失效的token,这么做吧:定期调用feedback接口,比如10分钟调一次,或者20分钟调一次,取出来后再统一清除。虽然不是及时的,但是这段时间内给失效token发通知,也就是浪费一些请求,不会有什么大问题。设计良好的业务系统我相信是不会间隔这么短时间就给用户发通知的。 不过,我觉得这个问题确实是apns4j需要改进的地方,应该是加一些callback机制,在不同情况下回调调用者提供的函数

laoyur commented 10 years ago

了解了,感谢解答。期待apns4j能更加完善!

qiaobotao commented 10 years ago

您好:“假如需要在同个java进程里给不同APP发送通知,那就需要设置为不同的name”这是什么意思,能详细说下吗?不同的APP 是不同的设备还是不同的应用?

RamosLi commented 10 years ago

是这样的:不同的app证书和密码应该都不一样,甚至同一个app开发证书和测试证书都不一样,因此,给它们发送APNS通知时需要生成不同的ApnsService实例。dbay-apns4j把所有已经生成过的ApnsService放到了一个map中存了起来,这个map的key就是在ApnsConfig中指定的name(apnsConfig.setName(...)),value就是对应的ApnsService实例。如果不指定name,就会用默认的name,就会造成后面生成的实例在map中把前面的覆盖掉。

qiaobotao commented 10 years ago

哦,明白了,只是在生成实例的时候有区分就行,在耽误您点时间,设置poolSize的值,有什么凭据吗?或者说 我要根据推送量,每次都设置一遍吗?

RamosLi commented 10 years ago

poolSize的意思时同一时刻,最多有几个线程在发送APNS。这个需要根据你具体的发送量来调整 假设你每秒需要发送50条通知,每条大约为100ms,一个线程每秒就能发1000ms/100ms=10条,50条/10条=5,就需要5个线程同时发。那poolSize设成5就够用了。

qiaobotao commented 10 years ago

非常感谢!

luffyliups commented 10 years ago

RamosLi: 您好!看到这个项目一直在维护,所以比较放心。有个问题请教: getFeedbacks()在什么情况下会得到非空的结果?或者说某个APP被卸载之后导致token失效,APNS服务器多长时间能判断到?我这边的情况是APP卸载之后也得不到feedback。谢谢您~

RamosLi commented 10 years ago

你好!这个问题是Apple的策略,具体得问问他们咯。你可以去官网反馈下 我的应用是这么做的:只要我的DB里存了device_token,就发。至于用户已经卸载了,没关系,顶多浪费点服务器的资源,无伤大雅。等取到feedbacks之后再删除这些无效的device_token。

luffyliups commented 10 years ago

赞!回复和作品一样给力!让我有点小惊喜。我也打算这么做。 多谢!

MonsterJJ commented 9 years ago

请问 apnsService.sendNotification 里面能放 token的集合吗

swordwong719 commented 7 years ago

@MonsterJJ 请问您的问题解决了吗 token是怎么处理的 放到队列里面吗