投放设置可以存储为文件,也可以存储在数据库中,如果存储在文件中,当投放设置改变时需要重新reload投放设置。
在后台服务程序中,比如是c++程序,投放设置会被定义为一个对象,当投放设置被改变时,需要创建一个新的对象,但是问题是什么时候释之前的这个对象,因为之前的对象可能还有某个线程在使用,还有如果投放设置一直在修改,那就可能有多个之前的对象。
解决reload有两种方式:
a:一种使用指针,当投放设置被修改时,创建一个新的指针,新进来的请求则使用新的投放设置对象,将老的指针保存在一个将要被删除的队列中,比如设置为1分钟之后删除,则在1分钟之内其他的线程还是可以使用老的指针的。
b:使用智能指针,
当投放设置被修改时,创建一个新的指针,并将新指针设置到智能指针对象中,新进来的请求则使用新的投放设置对象,如果之前已经拿到了老的对象的线程,则会使用老的对象,直到没有任何线程使用老对象时,老的对象会自动释放析构
二:文件同步
因为使用文件保存投放设置,文件同步服务就必不可少了。
当用户在界面操作修改投放设置的时候,前端将数据存储到数据库中,并触发客户端开始准备发送投放设置文件到投放机器。
a:如果文件内容短,则可以一次性发送。
b:当文件内容比较大的时候,则需要分多条发送。比如文件有100k,我们发送的最小数据段为1k,则可以分为100段来发送,每一段都有一个长度,还有总长度,以及md5和总的md5,还要包括这个是第几段即需要sequence id。服务端每次收到数据都要根据总长度判断是否已经接受完毕。每次如果接受到连续的段(比如sequence id为0,1,2)则存到临时文件中,假设这时候服务挂掉了,重启服务之后可以继续断点续传。
最初发表于网易博客,现转移至csdn