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的调用请求。



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做两件事:

  1. 监听new registered wks,加入ch
  1. Schedule(Map),Schedule(Reduce)

Worker做两件事情:

  1. register自己
  1. 等master调DoTask