37 lines
1.7 KiB
JavaScript
37 lines
1.7 KiB
JavaScript
|
// 动态分片流
|
||
|
// 1. 默认提供分片流
|
||
|
// 2. 允许请求者指定数据段, 返回相应分片, 发送队列可以并行, 接收队列在检查没有新数据时, 补充要求失败的分片
|
||
|
// 3. 可靠模式下分片是完整的, 但响应不是立即的, 当请求超时时放弃接受和发送队列中的分片
|
||
|
// 4. 同一个资源可以向不同的提供者请求, 将不同区段的分片合并然后存储
|
||
|
// 5. 不需要验证hash, 但是需要验证顺序, 发送者应当标记这个分片的开始和结束位置
|
||
|
|
||
|
// 资源id, 开始位置, 结束位置, 数据
|
||
|
// 资源的其他信息, 如hash, 大小, 类型等, 由其他方式获取
|
||
|
// 并不信任发送者, 所以必须验证发送者的分片HASH, 所以资源信息里应当包含每个分片的HASH
|
||
|
// 但如果每个HASH都要验证, 那么验证的成本太高, 所以应当有一个HASH验证的阈值, 例如每100个分片验证一次, 如果验证失败, 则放弃这个分片, 重新请求
|
||
|
|
||
|
// 数据块, 每个数据块验证一次HASH, 如果验证失败, 则放弃这个数据块, 重新请求
|
||
|
// 数据块的大小应当是2的幂, 例如2, 4, 8, 16, 32, 64, 128, 256, 512, 1024等
|
||
|
// 数据块的大小应当是分片的倍数, 例如分片大小是1024, 那么数据块大小应当是1024的倍数, 例如1024, 2048, 4096等
|
||
|
|
||
|
/**
|
||
|
* {
|
||
|
* id: 'resource id',
|
||
|
* type: 'resource type',
|
||
|
* size: 'resource size',
|
||
|
* hash: 'resource hash',
|
||
|
* blocks: [
|
||
|
* 'md5 hash of block 1',
|
||
|
* 'md5 hash of block 2',
|
||
|
* 'md5 hash of block 3',
|
||
|
* ]
|
||
|
* }
|
||
|
*/
|
||
|
|
||
|
// 分片交叉验证
|
||
|
// 1. 每个分片都没有hash
|
||
|
// 2. 文件有一个完整的hash
|
||
|
// 3. 文件取4个交叉验证维度
|
||
|
// 4. 16个HASH验证1GB文件
|
||
|
// 5. 且只在完整hash验证失败时才验证分片
|