关注于分布式问题本身,而不是别的。
go 支持 concurrency,RPC,GC,type safe。
go 简单
利用并发, I/O 并发,多核
线程让程序同时执行多个事情(逻辑上)
共享内存
每个线程自己的状态: programe counter,register,stack
目标: 简化进程间网络通讯
RPC problem: lost packet, broken network, slow server, crashed server
发生下列错误时 client RPC库如何反应?
“at least once” 行为:
“at least once” 问题:
Put("k", 10)
Put("k", 20)
“at least once” 对只读操作或应用本身处理了重复请求是 OK 的
“at most once” 更好的行为:
server RPC 处理重复的请求,返回原来的回复,代替重新运行
client 请求中包含 unique ID(XID)
if seen[xid]:
r = old[xid]
else:
r = handler()
old[xid] = r
seen[xid] = true
“at most once” 复杂问题:
“at most once” server 崩溃和重启如何处理?
什么是 “exactly once”?
Go RPC is “at-most-once”