单例 Apache Thrift 客户端是否优于多个客户端实例?

Is a Singleton Apache Thrift client better than multiple client instances?

我有一个 thrift 服务器应用程序和另一个通过 apache thrift 与之通信的客户端应用程序。

3 个问题:

1 - 在我的客户端应用程序中,当创建一个节俭客户端并打开通信传输时,是否最好在整个应用程序生命周期(也就是始终打开)中将相同的客户端和传输作为单例重用,通过保持传输打开,或者最好创建一个新客户端,打开传输,然后在每次调用节俭服务器时关闭它?

2 - 为什么?

3 - 就性能而言,它是否有任何改变(考虑通过同一客户端打开和关闭传输和数据吞吐量的开销)?

'1 & '2。带有 I/O 堆栈 (proto/trans) 的单个 Thrift 客户端表示单个连接。建立和拆除连接的成本相对较高,因此如果您经常使用客户端,保留它通常是个好主意。但是,客户端对象通常不是线程安全的,因此如果您的应用程序是多线程的,您将需要管理对客户端的访问,以便 RPC request/response 操作被序列化。

'3.如果你经常发出 RPC 请求,打开和关闭连接会增加很多开销,所以通常最好保持连接打开。另一方面,如果您很少发出 RPC 请求,保持连接打开会在您不使用它们时占用服务器上的资源,因此最好为每个稀疏请求打开和关闭。

我的建议是为每个独立线程创建一个客户端,但真正的答案是对每种情况进行试验并衡量结果,选择 fastest/least 昂贵的结果。