gpt4 book ai didi

go - Go 中的 RPC 有某种缓存?

转载 作者:数据小太阳 更新时间:2023-10-29 03:06:04 24 4
gpt4 key购买 nike

昨天我在 go 中使用 RPC 进行了 around 操作,出现了一个我无法理解的行为。

我编写了一个简单的 RPC 服务器,它在 VM 中运行,监听连接并提供单一的斐波那契计算方法。本地计算机上的 RPC 客户端每秒向服务器询问 fibonacci(n),其中 n 是 (currentSecond*fixedMultiplicator),因此我可以产生至少略有不同的负载。

因此,在 for 循环中,客户端将在 60 秒内请求 60 个不同的值,然后重新开始。 RPC 拨号在此循环之外,因此连接在某种程度上是持久的。

当我终止服务器时,比方说,10 秒后,客户端将抛出一个错误,因为它无法向现在丢失的服务器发送任何内容。到目前为止,一切按计划进行。

现在是什么让我想到:当我在 61 秒后终止服务器时,客户端不断打印出所有请求的正确结果,尽管服务器丢失并且无法响应请求。我什至关闭了服务器的虚拟机,所以服务器 IP 甚至不再在网络中。虽然有点有趣,但这种行为可能对实际应用程序有害(取决于您正在开发的内容)。

有什么想法吗?

// ############
// # RPC SERVER

err := rpc.Register(service.Object)
// errorcheck

rpc.HandleHTTP()
l, e := net.Listen("tcp", ":1301")
// errorcheck
go http.Serve(l, nil)


// ############
// # RPC CLIENT

client, err := rpc.DialHTTP("tcp", "192.168.2.111:1301")
// errorcheck

var divCall *rpc.Call

for {
<-time.After(time.Duration(1 * time.Second)):

n := time.Now().Second() * 90000000
log.Debug("n=", n)

args := &services.FibonacciArgs{N: n}
var reply int
divCall = client.Go("Fibonacci.Calculate", args, &reply, nil)

go func() {
replyCall := <-divCall.Done
r := replyCall.Reply.(*int)
log.Debug("reply: ", r)
}()
}

回答

在 Linux 和 Windows 上运行代码后,我注意到不同的结果。在 Linux 上,回复将始终是适当的零值(在我的例子中为 0)。另一方面,在 Windows 上,回复似乎被缓存了。

要走的路是@cnicutar 的提示。在 RPC 调用后检查错误值并相应地处理内容。切勿盲目相信回复。

最佳答案

您不检查代码中的错误:

divCall = client.Go("Fibonacci.Calculate", args, &reply, nil)

go func() {
replyCall := <-divCall.Done

// -- Must check replyCall.Error here --.

r := replyCall.Reply.(*int)
log.Debug("reply: ", r)
}()

也就是说,我认为这种行为很奇怪,而且可能还不止于此。

关于go - Go 中的 RPC 有某种缓存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37720777/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com