在不同计算机上运行的服务器之间转发Thrift服务请求

时间:2015-05-08 05:39:33

标签: thrift forwarding broker

我的Mac上运行了一个Ubuntu服务器,我在Ubuntu和Mac上都运行了Thrift服务器。每个Thrift服务器提供的服务是不同的。

限制是我需要只将Mac Thrift服务器IP和端口暴露给客户端。

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

1 个答案:

答案 0 :(得分:0)

不确定。至少有三种方法出现在我的脑海中。它主要取决于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序列化来记录/回放服务调用,那么无论如何这将是最佳选择。

方法3:嵌套序列化

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

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

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

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

支付的价格显然是双序列化开销。