如何在thrift中使用异步模式?

How to use asynchronous mode in thrift?

我知道 oneway 方法用于使用异步模式,但这是否足够? 我需要使用 TNonblockingSocket(而不是 TSocket)吗? 我需要将服务器定义为 TNonblockingServer 吗?

首先,oneway 关键字用于将 Thrift 服务方法标记为 "fire and forget"。

在幕后发生的事情是,只有用于发送输入数据的代码是由 Thrift 编译器生成的。 oneway 次调用 完全省略了客户端代码的接收部分。换句话说,客户端只是发送请求,然后继续前进而不等待任何响应(注意这也包括异常)。

在第一个 运行 中,这些调用是否 oneway 对服务器端没有影响。它主要影响客户端,因为一旦成功发送请求,客户端不需要再等待对 return 的 oneway 调用。

服务器端如何处理该请求完全取决于服务器端。它可以是 TSimpleServer 一次只处理一个调用。或者它可以是其他服务器类型,例如 TNonblockingServerTThreadPoolServer,能够以并行(或半并行)方式处理多个请求。但这与任何非 oneway 调用没有太大区别。唯一真正的区别是 没有响应发送回客户端

...但当然有一个警告。

如果服务器无法提供所需的吞吐量,下一个请求到达时它可能仍在处理上一个请求。 此时客户端可能确实会阻塞,直到可以发送下一个请求

底线

如果你的代码有一定的复杂性,服务器端面临频繁的请求,你就需要增强服务器端来保证你期望的吞吐量。 Little's law 将其形式化并放入一个漂亮的公式中。