1 问题描述
最近笔者在工作中遇到了这样一个问题:对于离线的数据/远端的数据,如何保证在处理过程中的数据安全。
服务器P是我们的业务服务器,负责处理各项业务。比如聊天服务器,处理各种聊天相关的逻辑;邮件服务器,处理和邮件相关的部分。
服务器P处理业务,是需要数据的,但一般而言,进程中存储的,一般只是在线用户的数据。对于不在线的用户来说,数据是存放在数据中心的(有可能是数据库,也有可能是缓存中心)等,总之是不在服务器P上的。
假定数据中心是服务器D,某个时刻,服务器P接到一个请求,要求对用户user1的数据进行修改。user1并不是一个在线用户,服务器P上没有user1的数据。
服务器P的处理逻辑如下:
1 服务器P收到请求,发现没有数据,向服务器D(数据中心)拉取数据,并等待数据到来。
2 服务器P拉取到数据,进行数据处理。
3 将处理后的数据发送回数据中心记录。
看上去逻辑没什么问题,但是,当服务器P处于拉取的过程中(已经发送了拉取协议,但是数据还没有取到),服务器P又收到了一条请求,要求对用户user1的数据进行修改。如果按照上面的处理逻辑,服务器P检测到没有数据,就再发起拉取协议的请求,从服务器D拉取数据,等待数据回来并做处理。
后果:第一次的数据处理后的数据,将会被覆盖掉,引发数据安全问题。
2 解决方案
方案的流程图如下图所示:
紫色部分是操作的发起者,它有可能是用户,有可能是运维人员等。
浅绿色部分是服务器P,是处理操作的地方。
橙色是服务器D,存放所有用户的数据。
服务器P新的处理逻辑如下:
1 服务器P收到操作请求,首先判断该数据是否有缓存(data_map里是否有该数据)。如果有,则直接进行处理;如果没有进入步骤2。
2 服务器P判断当前该数据是否处于拉取中。如果处于拉取状态,则忽略拉取,只是将操作放入到待处理的操作池(handler队列)中;如果不处于拉取状态,服务器P发起一个拉取,并将该数据的拉取状态设置为True,同时将操作放入到待处理的操作池中。
3 服务器P接收到数据中心返回的数据(data_store),通知操作池中所有关注此数据的操作。
4 操作池中的操作,将按照先入先出的顺序,依次对该数据进行处理。
5 将数据写回到数据中心,并根据条件(比如10分钟),将数据从data_map中移除。
3 总结
分布式服务器中,数据安全是很重要的部分,因此开发者对于这部分的逻辑,一定要多检测多验证,保证数据的安全性和一致性。
关注博主获取更多服务器相关的知识~