如何在thrift中使用异步模式?
How to use asynchronous mode in thrift?
我知道 oneway
方法用于使用异步模式,但这是否足够?
我需要使用 TNonblockingSocket(而不是 TSocket)吗?
我需要将服务器定义为 TNonblockingServer 吗?
首先,oneway
关键字用于将 Thrift 服务方法标记为 "fire and forget"。
在幕后发生的事情是,只有用于发送输入数据的代码是由 Thrift 编译器生成的。 oneway
次调用 完全省略了客户端代码的接收部分。换句话说,客户端只是发送请求,然后继续前进而不等待任何响应(注意这也包括异常)。
在第一个 运行 中,这些调用是否 oneway
对服务器端没有影响。它主要影响客户端,因为一旦成功发送请求,客户端不需要再等待对 return 的 oneway
调用。
服务器端如何处理该请求完全取决于服务器端。它可以是 TSimpleServer
一次只处理一个调用。或者它可以是其他服务器类型,例如 TNonblockingServer
或 TThreadPoolServer
,能够以并行(或半并行)方式处理多个请求。但这与任何非 oneway
调用没有太大区别。唯一真正的区别是 没有响应发送回客户端。
...但当然有一个警告。
如果服务器无法提供所需的吞吐量,下一个请求到达时它可能仍在处理上一个请求。 此时客户端可能确实会阻塞,直到可以发送下一个请求。
底线
如果你的代码有一定的复杂性,服务器端面临频繁的请求,你就需要增强服务器端来保证你期望的吞吐量。 Little's law 将其形式化并放入一个漂亮的公式中。
我知道 oneway
方法用于使用异步模式,但这是否足够?
我需要使用 TNonblockingSocket(而不是 TSocket)吗?
我需要将服务器定义为 TNonblockingServer 吗?
首先,oneway
关键字用于将 Thrift 服务方法标记为 "fire and forget"。
在幕后发生的事情是,只有用于发送输入数据的代码是由 Thrift 编译器生成的。 oneway
次调用 完全省略了客户端代码的接收部分。换句话说,客户端只是发送请求,然后继续前进而不等待任何响应(注意这也包括异常)。
在第一个 运行 中,这些调用是否 oneway
对服务器端没有影响。它主要影响客户端,因为一旦成功发送请求,客户端不需要再等待对 return 的 oneway
调用。
服务器端如何处理该请求完全取决于服务器端。它可以是 TSimpleServer
一次只处理一个调用。或者它可以是其他服务器类型,例如 TNonblockingServer
或 TThreadPoolServer
,能够以并行(或半并行)方式处理多个请求。但这与任何非 oneway
调用没有太大区别。唯一真正的区别是 没有响应发送回客户端。
...但当然有一个警告。
如果服务器无法提供所需的吞吐量,下一个请求到达时它可能仍在处理上一个请求。 此时客户端可能确实会阻塞,直到可以发送下一个请求。
底线
如果你的代码有一定的复杂性,服务器端面临频繁的请求,你就需要增强服务器端来保证你期望的吞吐量。 Little's law 将其形式化并放入一个漂亮的公式中。