多服务器处理架构
Last updated
Was this helpful?
Last updated
Was this helpful?
第 5 个版本的代码 goto_v5(和 讨论)见 。该版本仍然基于 gob
存储,但很容易调整为使用 json,正如版本 4 演示的那样。
目前为止 goto 以单线程运行,但即使用协程,在一台机器上运行的单一进程,也只能为一定数量的并发请求提供服务。一个缩短网址服务,相对于 Add()
(用 Put()
写入),通常 Redirect()
服务(用 Get()
读取)要多得多。因此我们应该可以创建任意数量的只读的从 (slave) 服务器,提供服务并缓存 Get()
方法调用的结果,将 Put()
请求转发给主 (master) 服务器,类似如下架构:
截至目前 URLStore
上基本的 Get()
和 Put()
方法具有如下签名:
而 RPC 调用仅能使用如下形式的方法(t
是 T
类型的值):
要使 URLStore
成为 RPC 服务,需要修改 Put()
和 Get()
方法使它们符合上述函数签名。以下是修改后的签名:
Get()
代码变更为:
现在,键和长 URL 都变成了指针,必须加上前缀 *
来取得它们的值,例如 *key
这种形式。u
是一个值,可以用 *url = u
来将其赋值给指针。
接着对 Put()
代码做同样的改动:
Put()
调用 Set()
,由于后者也要做调整,key
和 url
参数现在是指针类型,还必须返回 error
取代 boolean
:
同样,当从 load()
调用 Set()
时,也必须做调整:
还必须修改 HTTP 处理函数以适应 URLStore
上的更改。Redirect()
处理函数现在返回 URLStore
给出错误的字符串形式:
Add()
处理函数也以基本相同的方式修改:
要使应用程序更灵活,正如之前章节所为,可以添加一个命令行标志 (flag) 来决定是否在 main()
函数中启用 RPC 服务器:
要使 RPC 工作,还要用 rpc
包来注册 URLStore
,并用 HandleHTTP()
创建基于 HTTP 的 RPC 处理器:
对于 slave 进程,要在网络上运行 goto 应用的一个 master 节点实例,它们必须能相互通信。Go 的 rpc
包为跨越网络发起函数调用提供了便捷的途径。这里将把 URLStore
变为 RPC 服务( 详细讨论了 rpc
包)。slave 进程将应对 Get()
请求以交付长 URL。当一个长 URL 要被转换为缩短版本(使用 Put()
方法)时,它们通过 rpc 连接把任务委托给 master 进程,因此只有 master 节点会写入数据文件。
上一节:
下一节: