本实验是构建一个单节点的Key/Value服务,该服务确保即使是在网络故障的情况下,每个操作只执行一次,且这些操作是可线性化的。
服务支持三种操作:
- Get(Key) : 获取与Key对应的Value,如果Key不存在,返回空字符串“”
- Put(Key, Value) : 如果Key已存在,更新现有的Value;不存在,插入新的Key-Value
- Append(Key, Value) : 向Key对应的Value追加新的Value,即Put(Key, Get(Key) + Value),返回旧的Value
手册:https://pdos.csail.mit.edu/6.824/labs/lab-kvsrv.html
思路:
- Server用map存储Key/Value键值对,对map操作时加锁
- 每个Client分配一个独立的ClientId,随机生成
- Client的每个操作分配一个序列号Seq,Seq从零开始自增
- Client的每个操作携带上ClientId和Seq
- Server保存每个ClientId所对应的最新的Seq和相关数据
- Server收到Client的操作时,根据ClientId查询Seq,如果Seq一致,则忽略此操作,返回已保存的数据
- Get操作是幂等的,无需记录,只记录Put和Append
结果
go test
Test: one client ...
... Passed -- t 3.5 nrpc 19493 ops 19493
Test: many clients ...
... Passed -- t 3.3 nrpc 34525 ops 34525
Test: unreliable net, many clients ...
... Passed -- t 3.3 nrpc 1129 ops 922
Test: concurrent append to same key, unreliable ...
... Passed -- t 0.2 nrpc 59 ops 52
Test: memory use get ...
... Passed -- t 0.4 nrpc 4 ops 0
Test: memory use put ...
... Passed -- t 0.3 nrpc 2 ops 0
Test: memory use append ...
... Passed -- t 0.6 nrpc 2 ops 0
Test: memory use many puts ...
... Passed -- t 19.0 nrpc 100000 ops 0
Test: memory use many gets ...
... Passed -- t 20.0 nrpc 100001 ops 0
PASS
ok 6.5840/kvsrv 52.132s
代码:https://github.com/tlxxzj/6.5840-Distributed-Systems/tree/lab2-key-value-server/src/kvsrv
发表回复