在Thrift服务中进行通信的最佳机制?

时间:2014-07-30 22:33:23

标签: thrift

前几天我刚开始使用Thrift进行项目原型设计,我有一个设计问题:

假设我有一组三个Thrift服务,所有这些服务都将运行在同一台服务器上;例如:TenantService,UserAccountService和AuthService。单个服务器将在一组计算机中运行并托管所有这些服务。

UserAccounts属于Tenants,因此当在UserAccountService上调用Handler方法时,我需要查询TenantService以检索有关租户的信息。在不同的场景中,我可能需要从AuthService咨询UserAccountService。

在单个服务器上处理程序之间进行通信的最佳实践/机制是什么?是否只是将必要的处理程序传递给另一个Handler,这样如果AuthService依赖于UserAccountService,那么我应该在构建AuthHandler时将UserAccountHandler实现传递给AuthHandler?

如果这种方法不好,我应该将其他服务的客户端传递给适当的处理程序吗?是否有TTransport不需要外出到网络;例如本地内存TTransport?

谢谢!

1 个答案:

答案 0 :(得分:1)

问题似乎与您希望如何构建服务实现及其依赖关系,而不是Thrift本身有关。

我对第一个问题的回答是将分开的东西分开,并将所有属于一起的东西保持在一起。那是什么意思?

  • 如果服务共享一个实现,例如它们在同一模块或进程中实现,最好直接调用依赖服务的实现,而不是通过Thrift服务接口。虽然后者可行,但似乎是不必要的开销。鉴于这种情况,将一个处理程序实现传递给另一个处理程序实现是否有意义取决于您希望如何使用它。

  • 如果服务是分开的,因为您计划稍后将它们分布在多个进程和/或计算机上,请将它们分开,只需从服务A调用服务B.在这种情况下,我不会建立任何额外的服务处理程序之间的依赖关系,因为稍后可能会成为阻止程序。

当然,一如既往,细节取决于具体情况。您可能还想查看multiplex protocol,它可以让您通过一个端点提供多种服务。

  

不需要外出到网络的TTransport;例如本地内存TTransport?

由于您没有指定语言,我只能给出通用答案:是的。存在可用于各种语言的存储器传输和流传输,但并非所有语言都实现了所有语言。但是,编写传输实现并不是那么难,所以如果所有其他方法都失败了,您可以自己完成而不需要花太多时间。