带有 HTTP 回调的异步 RPC

Posted

技术标签:

【中文标题】带有 HTTP 回调的异步 RPC【英文标题】:Async RPC with callback over HTTP 【发布时间】:2016-04-22 08:21:16 【问题描述】:

我正在设计一个具有阻塞功能的 SDK(在 Golang 中),它应该异步运行并通过回调返回结果。

我一直在使用 Gorilla Toolkit RPC library,这很棒,但我没有看到返回异步调用值的方法。

也许我遗漏了一些东西并且 RPC 模型不支持异步调用,我的意思是所有调用都是阻塞的,即使是很长时间。如果是这种情况,我假设没有 HTTP 超时?

如何实现异步 RPC 调用,并通过回调返回返回值。

澄清:我不能使用典型的 Go Channel 方法进行回调,因为我将通过 HTTP 从另一种语言调用 RPC。所以我的问题是,有没有办法在进行 RPC 时通过 HTTP 实现回调,或者调用是否应该阻塞,即使很长一段时间,直到一个值准备好返回?

【问题讨论】:

【参考方案1】:

我不知道 Gorilla,但是在 Go 标准库的 net/rpc 包中,你会发现这个方法 net/rpc/Go。它异步进行 RPC 调用,你给它一个通道作为参数,这样你就可以在远程过程调用完成时检索 RPC 回复。

net/rpc/Call 也进行 RPC 调用,但在调用完成之前一直处于阻塞状态。如果您知道如何使用通道,我相信您会通过 Go 方法得到您想要的。

【讨论】:

谢谢。我的问题是我将从其他平台(Java、Python 等)进行 RPC 调用,因此需要知道如何通过 HTTP 进行回调。或者调用只是阻塞直到返回值?【参考方案2】:

你可以看看grpc。这个:

有一个native go implementation 对于“等”的大多数值都有“Java、Python 等”的实现 通过 HTTP2 工作(好吧,不完全是 http,但非常相似) 完全是asynchronous(示例恰好是C++)。

【讨论】:

有趣,你能告诉我它是如何回调的吗?这是 HTTP2 的特性吗? 我不是grpc 的专家,但我认为它正在做的是维护单个(或小池)HTTP2 连接,通过它可以同时发出多个请求。当每个请求返回回复时,它会触发回调。 IE 的异步特性是“同时运行多个请求”和一个不错的库的产物,而不是真正的服务器->客户端通知。 嗯,好吧,听起来很有趣。我想知道 Gorilla 工具包的操作是否类似。我会进一步调查,谢谢。

以上是关于带有 HTTP 回调的异步 RPC的主要内容,如果未能解决你的问题,请参考以下文章

带有异步回调的 NSThread 与 GCD

无法使用带有 DCE 管道的异步 RPC 将数据推送到服务器

异步 node.js:带有回调的嵌套数组

基于RabbitMQ RPC实现的主机异步管理

iOS:在while循环中带有块回调的异步方法

在 dispatch_group_async 点,它在执行带有回调的异步任务时认为任务已完成