花了几天时间,对androidpn的源代码进行了阅读,并修改了一些必要的功能。
服务端:
1.用户认证策略改为用device id和token。token是用户登陆应用成功后生成的,device id是一台机器的UUID。一个用户会绑定到多个device,和网站本身验证机制整合。
2.添加调整mina线程池的参数
3.去除提供的console,太危险
4.修改加载配置文件的方式,原来是到固定conf目录下加载配置,改为从classpath加载
5.接收推送任务改成从队列接收,增加缓冲,控制并发
6.根据服务器的硬件配置,可设置可最大的并发连接数,对已建立的连接采用LRU淘汰策略,当session被淘汰后,发送kick消息给客户端,使客户端停止notification service,reconnetion thread。
7.添加不同环境的maven profile,结合hudson打包
客户端:
1.reconnection thread修改为需要时启动,监测connection close事件
2.修改注册验证流程,在登录应用时注册登记用户名,deviceid之间的关系,一个用户会绑定多台设备。登陆后会在手机上生成一个token。并有有效时间(一个月)。当token有效时,android客户端可以请求和push server建立连接。token失效后,android客户端不再和push server连接,并关闭连接,token失效,表明这个用户已经很长时间不使用我们应用,我们也没必要给他推送,降低服务器负载。
3.添加在服务关掉时,unregister connetion listener,这样避免服务关掉后,还监听网络事件,反复重连
4.修改客户端不停的往客户端线程队列中提交任务,在提交任务前判断是否需要提交任务,当没有连接时,提交连接和登陆任务,当连接建立但没有登陆push server时,只提交log in任务
5.修改reconnect thread为局部变量,原来是实例变量,这样线程才能反复创建。
6.添加kick功能,当服务端连接达到一定数目时,会按照LRU策略,淘汰连接,会将最久没使用的session kick掉。这时客户端收到kick消息后,会停止notification service
7.修改device id的生成方法
8.用户在打开应用时,如果token有效,如果notification service被关闭,会再次启动notification service
下一版修改点:
1.session存储到global cache中
2.增加IP过滤机制,防止DDOS攻击。按照频度和次数过滤。
3.负载均衡,haproxy,LVS
4.不采用xmpp协议,试着采用其他序列化方式(protobuf),因为本身就用TLS连接