gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 10:20:59 25 4
gpt4 key购买 nike

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

1)作为中央服务器的“管理节点”

2) 一个或多个“算术节点”与管理节点连接,将其服务列表存储到其中,可以请求任何服务,并在情况下分派(dispatch)另一个节点的请求。

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

算术节点的服务包含用于从另一个节点分派(dispatch)请求的方法。

现在我的问题来了。

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

我现在的处境是这样的:

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

此时此刻,到底应该发生什么?从这里我无法理解。两个节点之间必须建立连接,但是它们之间必须是直接连接吗?这是否意味着我必须实例化一个“算术服务器”和一个“算术客户端”?

最佳答案

I'm failing to understand how thrift works when I have a single object that must work both as client and as server.

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

您面临的问题显然与 Thrift 没有太大关系,而是与一般分布式系统的设计相关,这本身就是一个广泛的主题。我可以给你一些大概的轮廓,但你必须自己查找、阅读和尝试才能充分理解问题。

直接调用

A connection between the two nodes must be established, but has it to be a direct connection between them? Does it mean I have to istantiate an "arithmetic server" and an "arithmetic client" ?

除了为什么一个算术计必须调用另一个算术计来解决它可以自己完成的任务的问题之外:是的,这将是最简单的方法:

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

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

“中继”调用

但是既然你也写了

I'm working on a simple distributed system where there are:

  1. a "management node" that works as central server
  2. one or more "arithmetic nodes" that connect with the management node, store their list of services into it, can ask for any service and, in case, dispatch another node's request

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

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

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

出于实际原因,虽然这可能有效,但它给中央管理节点带来了很大的负担,使其成为整个构造的瓶颈。如果所有这些调用都是同步的,这会让事情变得更糟。

服务存储库

更好的方法可能是采用稍微不同的方式:

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

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

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

进一步的方法

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

关于java - 如何使用 thrift 实现客户端/服务器对象与另一个相同类型的对象之间的通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35625236/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com