如何使用节俭实现 client/server 对象与另一个相同类型的对象之间的通信
How to implement communication between a client/server object with another of the same type using thrift
我正在开发一个简单的分布式系统,其中有:
1) 作为中央服务器工作的"management node"
2) 一个或多个 "arithmetic nodes" 与管理节点连接,将它们的服务列表存储在其中,可以请求任何服务,并在情况下分派另一个节点的请求。
为了做到这一点,我在 thrift 中创建了两个服务,一个用于管理节点,一个用于算术节点,在 java 中编译并编写了各自的处理程序 类 和接口。
算术节点的服务包含用于从另一个节点调度请求的方法。
现在我的问题来了。
当我有一个必须同时作为客户端和服务器工作的对象时,我无法理解 thrift 是如何工作的。
我现在的情况是:
我有两个算术节点注册到管理节点(两个Tsockets打开,两个Ttransport打开,两个管理客户端通信到同一个管理服务器),那么一个算术节点必须调用一个操作,另一个可以响应要求。
此时此刻,究竟应该发生什么?我无法从这里理解。
两个节点之间必须建立连接,但它们之间必须是直接连接吗?这是否意味着我必须实例化一个 "arithmetic server" 和一个 "arithmetic client" ?
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" ?
抛开为什么一个 Arithmeter 必须调用另一个 Arithmeter 来解决它可以自己完成的任务的问题:是的,这将是最简单的方法:
+------------------+ +-------------------+
| ArithClient +------ Calculate() --->+ ArithServer |
+------------------+ +-------------------+
在这个简单的场景中,左侧节点实现客户端,右侧节点实现服务器。
"Relayed" 通话
但是既然你也写了
I'm working on a simple distributed system where there are:
- a "management node" that works as central server
- 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 +--------+
+-----------------------+
所以我们有三个节点,一个作为客户端,第三个作为服务器,中间一个作为第一个的服务器,另外调用第三个节点,因此也作为一个那边的客户。
出于实际原因,虽然这可能有效,但它给中央管理节点带来了很多负担,使 it/them 成为整个结构的瓶颈。如果所有这些调用都是同步的,这会使事情变得更糟。
服务存储库
更好的方法可能是以稍微不同的方式进行:
+------------------+ +-------------------+
| ArithClient +---- (2) Calculate() ---->+ ArithServer |
+------+-----------+ +-------------------+
|
(1) please tell me where the
next free ArithServer is?
|
| +-----------------------+
+--------->+ ManagementNode |
+-----------------------+
现在我们 (1) 只向管理节点询问有关如何联系合适的服务器的信息。使用此信息,我们直接执行调用 (2),不再涉及管理节点。
为了进一步优化,客户端可以将该信息存储一段时间,并根据需要随时调用 ArithServer。这样当服务器不可用,客户端重启,或者时间段结束时,需要再次调用管理节点。
进一步的方法
另一种方法涉及真正的异步消息传递,如消息总线或 MQ 系统。但这绝对超出了这个问题的范围。
我正在开发一个简单的分布式系统,其中有:
1) 作为中央服务器工作的"management node"
2) 一个或多个 "arithmetic nodes" 与管理节点连接,将它们的服务列表存储在其中,可以请求任何服务,并在情况下分派另一个节点的请求。
为了做到这一点,我在 thrift 中创建了两个服务,一个用于管理节点,一个用于算术节点,在 java 中编译并编写了各自的处理程序 类 和接口。
算术节点的服务包含用于从另一个节点调度请求的方法。
现在我的问题来了。
当我有一个必须同时作为客户端和服务器工作的对象时,我无法理解 thrift 是如何工作的。
我现在的情况是:
我有两个算术节点注册到管理节点(两个Tsockets打开,两个Ttransport打开,两个管理客户端通信到同一个管理服务器),那么一个算术节点必须调用一个操作,另一个可以响应要求。
此时此刻,究竟应该发生什么?我无法从这里理解。 两个节点之间必须建立连接,但它们之间必须是直接连接吗?这是否意味着我必须实例化一个 "arithmetic server" 和一个 "arithmetic client" ?
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" ?
抛开为什么一个 Arithmeter 必须调用另一个 Arithmeter 来解决它可以自己完成的任务的问题:是的,这将是最简单的方法:
+------------------+ +-------------------+
| ArithClient +------ Calculate() --->+ ArithServer |
+------------------+ +-------------------+
在这个简单的场景中,左侧节点实现客户端,右侧节点实现服务器。
"Relayed" 通话
但是既然你也写了
I'm working on a simple distributed system where there are:
- a "management node" that works as central server
- 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 +--------+
+-----------------------+
所以我们有三个节点,一个作为客户端,第三个作为服务器,中间一个作为第一个的服务器,另外调用第三个节点,因此也作为一个那边的客户。
出于实际原因,虽然这可能有效,但它给中央管理节点带来了很多负担,使 it/them 成为整个结构的瓶颈。如果所有这些调用都是同步的,这会使事情变得更糟。
服务存储库
更好的方法可能是以稍微不同的方式进行:
+------------------+ +-------------------+
| ArithClient +---- (2) Calculate() ---->+ ArithServer |
+------+-----------+ +-------------------+
|
(1) please tell me where the
next free ArithServer is?
|
| +-----------------------+
+--------->+ ManagementNode |
+-----------------------+
现在我们 (1) 只向管理节点询问有关如何联系合适的服务器的信息。使用此信息,我们直接执行调用 (2),不再涉及管理节点。
为了进一步优化,客户端可以将该信息存储一段时间,并根据需要随时调用 ArithServer。这样当服务器不可用,客户端重启,或者时间段结束时,需要再次调用管理节点。
进一步的方法
另一种方法涉及真正的异步消息传递,如消息总线或 MQ 系统。但这绝对超出了这个问题的范围。