进行 go RPC 调用时,返回类型为 channel

Posted

技术标签:

【中文标题】进行 go RPC 调用时,返回类型为 channel【英文标题】:When making a go RPC call , the return type is channel 【发布时间】:2021-11-28 20:51:47 【问题描述】:

首先,这是一个PRC 服务器。请注意其中一个返回类型是chan:

func (c *Coordinator) FetchTask() (*chan string, error) 
    // ...
    return &reply, nil

然后 客户端 进行 RPC 调用。通常调用者会得到一个类型为*chan string的频道。

call("Coordinator.FecthTask", &args, &reply)

这是我的问题。如果服务器连续写入通道:

for i := 0; i < 100; i++ 
    reply<- strconv.Itoa(i)

???????????? 客户端能否连续读取通道中的读取数据?

for 
    var s string = <-reply

我猜客户端不能,因为服务器和客户端不在同一个内存中。他们通过互联网进行交流。因此,即使变量reply是一个指针,它在服务端和客户端指向不同的地址。

我不确定。你怎么看呢?非常感谢!!!!

??????????顺便说一句,有没有办法在服务器和客户端之间实现一个REAL、有状态的通道?

【问题讨论】:

【参考方案1】:

正如您已经提到的,通道位于内存变量中,无法在其他应用程序或系统中使用它们。另一方面,gRPC 将传递和解析二进制数据,在这种情况下再次传递通道指针,只会返回服务器内存中的指针地址。客户端收到该地址后,它将尝试指向本地计算机内存中的该地址,不幸的是,这可能是任何类型的数据。

如果您想推送一组数据(比如说字符串数组),您可以使用服务器流式传输或双向流式传输。

另一方面,如果您想实现某种稳定且保持活动的连接,您也可以考虑使用 websockets。

【讨论】:

以上是关于进行 go RPC 调用时,返回类型为 channel的主要内容,如果未能解决你的问题,请参考以下文章

Go通关22:如何通过 RPC 来实现跨平台服务!

[go微服务-16] Go RPC 实现服务间通信

go new() 和 make() 的区别

一个方便调试JS的RPC工具PIGA-GO

7.Go语言高并发与微服务实战 --- 远程过程调用 RPC

go微服务RPC的原理与Go RPC