【问题标题】:Forwarding Thrift service requests across servers running on different machines跨运行在不同机器上的服务器转发 Thrift 服务请求
【发布时间】:2015-05-08 05:39:32
【问题描述】:

我的 Mac 上运行着 Ubuntu 服务器,并且在 Ubuntu 和 Mac 上都运行着 Thrift 服务器。每个 Thrift 服务器提供的服务都不同。

限制是我只需要向客户端公开 Mac Thrift 服务器 IP 和端口。

有什么方法可以将来自客户端的请求从 Mac thrift 服务器转发到 ubuntu 服务器?或者就此而言,是否有任何其他代理可以根据所请求的服务进行转发?

【问题讨论】:

  • 似乎是复式周。这可能是本季的流行语吗?

标签: thrift forwarding broker


【解决方案1】:

当然。我想到了至少三种方法。这主要取决于 API 的设计方式以及您是否能够更改它。

方法 1:朴素的方法

如果您不能或不会更改 API,这将非常方便。每个请求处理函数只是将数据转发给另一个共享相同 Thrift IDL 定义的完全相似的服务。与响应相同。实现起来非常简单,但效率可能较低,因为需要在代理上对消息进行解码和编码,这要求代理始终保持最新并了解该 API 的旧版本。

方法 2:更通用

为了避免在代理上实现每个 API 函数只是为了进行一些愚蠢的数据混洗,特别是当 API 将随着时间的推移而发展时,可以将所有请求和响应放入某个通用包装器 union 中,就像这样,让您只需要一个 API 调用,这在代理上也很容易实现:

union AllRequests {
  1: FooRequest foo
  2: BarRequest bar
  // more as needed
}


union AllResponses {
  1: FooResponse foo
  2: BarResponse bar
  // more as needed
}

service Fowarding {
    AllResponses  HandleRequest( 1: AllRequests request)
}

消息仍然需要在代理上进行解码和编码,另外还要考虑 IDL 版本控制。另外,数据格式比较正式,但其实也未必是坏事。如果有一天您想切换到 MQ 系统,或者您打算使用 Thrift 序列化记录/回放服务调用,无论如何这都是可行的方法。

方法三:嵌套序列化

负载消息可以序列化为 BLOB,然后发送到代理服务器,代理服务器将其转发到最终目的地。

service Fowarding {
    binary  HandleRequest( 1: binary request)
}

这里最大的好处是,代理不需要知道二进制数据中的任何内容。这对他来说是完全透明的。这也意味着,代理甚至不需要知道用于序列化这些数据的 IDL。最后同样重要的是,如果需要优化路由和/或处理,它还允许向二进制数据添加一些元数据:

struct BinaryRequest {
  1: binary data
  2: string preferredRoute
}

付出的代价显然是双倍的序列化开销。

【讨论】:

  • 谢谢 JensG,最后一个对我来说似乎是最好的选择。但是,我将评估所有三个选项,并会在未来更新线程以供其他节俭用户使用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-13
  • 2012-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多