cached根据protobuf的元数据机制去保存和读取数据库中的数据。
为了简化服务器交互的复杂度,逻辑服务器用的protobuf和cached的protobuf,数据结构要完全一致。
不一致的话,会出现不确定的错误。比如,逻辑服务器用Msg1序列化数据,传给cached, cached却用Msg2去解析,重组,保存到DB。结果就全乱了!
所以,逻辑服务器连接cached成功后,先要保证protobuf是一致的。
1. logicd从cached获取Message名字列表和所有Message的总MD5
Message列表名字,每一个文件只须给出一个Message名字即可
这些数据在cached启动的时候,一次性生成即可。
2. logicd根据返回的Message名字列表,反查Message所在文件的所有Message,算出总MD5,判断该MD5是否和返回的MD5一致。
关于MD5计算
cached和logicd计算过程不一样。
cached
cached的protobuf的对象都从proto文件导入,动态生成protobuf对象。
1. 通过Import获取DescriptorPool;
2. 通过DescriptorPool::FindFileByName(...)获取各个FileDescriptor;
3. 从FileDescriptor,计算出MD5,最后计算总MD5。
logicd
logicd的protobuf都是编译进来的,通过DescriptorPool::generated_pool()获取DescriptPool对象。后面步骤和cached一样。
-----------------------------------2015-4-29补充-------------------------------------
实际实现的时候,发现通过md5计算版本受字段的顺序之类影响,同时发现版本不匹配的时候,还没法定位差异。直接采用一个一个字段对比的方式了。
版本比较有两处地方,DB(MySQL)结构和cache服务器中的protobuf元数据,cache服务器和逻辑服务器的protobuf元数据。
版本比较非常重要,节点间版本不一致,会导致存储错误或者读取出来的数据错误。