【问题标题】:Best mechanism for communicating amongst Thrift services?Thrift 服务之间通信的最佳机制?
【发布时间】:2014-09-22 18:13:10
【问题描述】:

前几天我刚开始与 Thrift 合作开发项目原型,我有一个设计问题:

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

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

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

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

谢谢!

【问题讨论】:

    标签: thrift


    【解决方案1】:

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

    我对第一个问题的回答是,将分离的东西分开,将属于一起的东西放在一起。我的意思是什么?

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

    • 如果服务是分离的,因为您计划稍后将它们分布到多个进程和/或机器上,请将它们保持分离并从服务 A 调用服务 B。因此,我不会建立任何额外的处理程序之间的依赖关系,因为以后可能会成为阻塞器。

    当然,与往常一样,细节取决于具体情况。您可能还想看看multiplex protocol,它使您能够在一个端点上提供多种服务。

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

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

    【讨论】:

      猜你喜欢
      • 2012-04-12
      • 2020-10-23
      • 2020-01-15
      • 2020-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-01
      相关资源
      最近更新 更多