mit_6824
Mapreduce
url_0 | |||
url_1 | |||
url_2 | |||
[0, 2] | [1, 2] |
RPC:
抽象的调用模型。像调用本地函数一样远程调用。可以用http或者TCP等实现。
是为了跨主机,跨进程而设计的。
机器A上的进程a里的实例a0,可以用RPC命令机器B上的进程b里的实例b1执行某方法。
功能上类似b起一个进程监听http端口,等待a的调用请求。
- AWS SDK就是一种RPC-like的设计。(虽然本质上是http+json)
Go 标准库 net/rpc 支持两种通信方式:
"tcp":基于 TCP 网络通信,适合分布式场景。
"unix":基于 UNIX 域套接字,仅限本机进程间通信(srv 是 socket 文件路径)。
被调用者(即 RPC 服务器)需要初始化 rpc.Server。
调用者rpc.Dial 返回一个 rpc.Client 对象。
func call(srv string, rpcname string, args interface{}, reply interface{})
interface{}相当于Any
go normal_func() 启动一个 goroutine 异步执行该函数。
& 取地址,* 解引用
使用RPC双向通信时,两进程都同时作为client和server。
Go RPC 暴露方法规范要求:
- 方法名必须大写(导出)。
- 第一个参数是指针类型,第二个参数也是指针类型,返回值是 error。
这里有两个register:
1 master用rpc.register,暴露自己
2 worker用master的register方法,把自己注册到master(业务注册,不涉及rpc.register)
worker暴露了DoTask和Shutdown-用DoTask调用DoMap或者DoReduce
master暴露了Register和Shutdown-用Schedule调用Worker.DoTask
Master做两件事:
- 监听new registered wks,加入ch
- Schedule(Map),Schedule(Reduce)
Worker做两件事情:
- register自己
- 等master调DoTask