如何使用thrift实现客户端/服务器对象与另一个相同类型之间的通信

时间:2016-02-25 10:53:04

标签: java client-server thrift

我正在开发一个简单的分布式系统,其中有:

1)管理节点"作为中央服务器

2)一个或多个"算术节点"与管理节点连接,将其服务列表存储到其中,可以请求任何服务,以及在发送另一个节点的请求时。

为了做到这一点,我在thrift中创建了两个服务,一个用于管理节点,一个用于算术节点,用java编译并编写各自的处理程序类和接口。

算术节点的服务包含用于从另一个节点调度请求的方法。

现在有我的问题。

当我有一个必须同时作为客户端和服务器的对象时,我无法理解节俭是如何工作的。

我遇到这种情况:

我有两个向管理节点注册的算术节点(两个Tsockets打开,两个Ttransport打开,两个管理客户端与同一管理服务器通信),然后一个算术节点必须调用一个操作,另一个算术节点可以响应请求。

此时此刻应该发生什么?我从这里不明白。 必须建立两个节点之间的连接,但它们之间是否有直接连接?这是否意味着我必须先使用算术服务器"和一个"算术客户" ?

1 个答案:

答案 0 :(得分:1)

  

当我有一个必须同时作为客户端和服务器的对象时,我无法理解节俭是如何工作的。

Thrift本身只是一种RPC机制。你做一个(远程)调用,传入一些args,然后得到一个结果(也可以是void或引发异常)。也就是说,服务器当然可以在服务器处理程序例程中调用另一台服务器。与简单的客户端相比,代码没有什么不同。

你面临的问题显然与Thrift无关,而是与分布式系统的设计有关,这本身就是一个广泛的话题。我可以给你一些概述,但你必须自己查阅,阅读和尝试,以全面了解这个问题。

直接电话

  

必须建立两个节点之间的连接,但是它们之间是否有直接连接?这是否意味着我必须先使用算术服务器"和一个"算术客户" ?

除了为什么一个Arithmeter必须调用另一个Arithmeter来解决它可以独立完成的任务的问题:是的,这将是最简单的方法:

+------------------+                       +-------------------+
|  ArithClient     +------ Calculate() --->+  ArithServer      |
+------------------+                       +-------------------+

在这个简单的场景中,左侧节点实现了客户端,右侧节点实现了服务器。

"中继的"调用

但是既然你也写过

  

我正在开发一个简单的分布式系统,其中有:

     
      
  1. a"管理节点"作为中央服务器
  2.   
  3. 一个或多个"算术节点"连接管理节点,将其服务列表存储到其中,可以要求任何服务,以及发送另一个节点的请求
  4.   

你可能想要管理算术节点彼此不认识的情况。它可以像这样工作:

+------------------+                  +-------------------+
|  ArithClient     |                  |  ArithServer      |
+------+-----------+                  +------------+------+
       |                                           ^
    Calculate()                                Calculate()
       |          +-----------------------+        |
       +--------->+    ManagementNode     +--------+
                  +-----------------------+

所以我们有三个节点,一个充当客户端,第三个充当服务器,中间一个充当第一个节点的服务器,另外呼叫第三个节点,因此也充当客户端那边。

由于实际原因,虽然这可能有效,但它给中央管理节点带来了很多负担,使得它/它们成为整个构造的瓶颈。如果所有这些呼叫都是同步的,那么事情就会变得更糟。

服务存储库

更好的方法可能是以稍微不同的方式进行:

   +------------------+                          +-------------------+
   |  ArithClient     +---- (2) Calculate() ---->+  ArithServer      |
   +------+-----------+                          +-------------------+
          |
(1) please tell me where the
    next free ArithServer is?
          |
          |          +-----------------------+
          +--------->+    ManagementNode     |
                     +-----------------------+

现在我们(1)仅向管理节点询问有关如何联系合适服务器的信息。使用此信息,我们直接进行调用(2),不再涉及管理节点。

为了进一步优化,客户端可以存储该信息一段时间,并根据需要尽可能长时间地调用ArithServer。这样,当服务器不可用,客户端重新启动或时间结束时,需要再次调用管理节点。

进一步的方法

另一种方法涉及真正的异步消息传递,如消息总线或MQ系统。但这绝对超出了这个问题的范围。