【发布时间】:2014-08-05 08:28:30
【问题描述】:
我们使用 Apache thrift(在我们的案例中是在 Windows 上)来定义由我们的一个可执行文件公开的多个服务。我们通常最终会使用新方法扩展一个服务接口,否则我们将不得不创建新线程(至少一个)来为新定义的“节俭服务”提供服务
有没有办法在 thrift 中使用相同的底层线程来处理多个 thrift 服务定义?
【问题讨论】:
我们使用 Apache thrift(在我们的案例中是在 Windows 上)来定义由我们的一个可执行文件公开的多个服务。我们通常最终会使用新方法扩展一个服务接口,否则我们将不得不创建新线程(至少一个)来为新定义的“节俭服务”提供服务
有没有办法在 thrift 中使用相同的底层线程来处理多个 thrift 服务定义?
【问题讨论】:
从 0.9.x 开始,Thrift 支持某些语言的多路复用协议。从那时起,为其余语言添加了几个实现。
像往常一样,遵循的路径非常相似。您将两侧的TMultiplexedProtocol 添加到传输堆栈。代码库中也有一些示例。
这会带来一些影响:
由于TMultiplexedProtocol 是一个分层协议,所有服务共享相同的端点协议(例如二进制)和传输(例如套接字)。在大多数情况下,这正是您想要的。如果您需要不同的传输或端点协议,您仍然需要设置不同的服务。
理论上,用多路复用服务器替换服务器是可行的,尽管尚未针对所有语言完全实现,见下文。详情请见THRIFT-1915。
关于兼容性:新的多路复用使用分隔符字符。现有代码可以通过这种方式进行修改,其中有一个默认服务(它将是旧的、未复用的服务),只要在名称中找不到分隔符,就会调用该服务。如果默认值为 null 或为空,则代码的行为与实际解决方案相同。
如果您需要针对您选择的语言进行这种比较简单的修改并希望提供补丁,我们将很乐意对其进行审核和集成。
【讨论】: