server push指的是server端发生某事件后立刻向client端发送消息。
远程事件:
和本地事件类似,分为两步:注册和通知,client发送一个代表事件注册的异步RPC至server,处理事件的代码写在对应的RPC回调中,此RPC同时也在等待通知,server收到请求后不直接回复,而是等待对应的本地事件触发时才调用done->Run()通知client发生了事件,可以看到server也是异步的,这个过程中如果连接断开,client端的RPC一般会很快失败,client可选择重试或者结束,server端应通过Controller.NotifyOnFailed()及时获知连接断开的信息,并删除无用的done
Restful回调:
REST((resource)Representational State Transfer,表现层状态转移):即Resource资源、Representational某种表现形式,如JSON、XML、JPEG等、State Transfer状态变化,即通过HTTP动词实现。
cilent希望在事件发生时调用一个给定的URL,并附上必要的参数,,在这个模式中,server在收到client注册请求时可以直接回复,因为事件不由注册用RPC的结束触发,由于,回调只是一个URL,可以存放在数据库或经消息队列流转,这个模式灵活性很高,在业务系统中使用广泛。由于网络抖动、机器重启等因素注册多次,client可能要关注多个事件。回调应处理等幂问题(即参数不变的情况下,任何一次调用结果都相同),server为了确保不漏通知,在网络出现问题时往往会多次重试,如果第一次的通知成功了,后续的通知就不应该产生效果。为了避免重要的通知被漏掉,用户可以灵活组合RPC和消息队列,RPC的时效性和开销都明显好于消息队列,但由于内存有限,在重试一些次数后仍然失败,则server就得把这部分内存空出来去做其他事情了,这时把通知放到消息队列中,利用其持久化能力做较长时间的重试。