我正在开发一个简单的分布式系统,其中有:
1)管理节点"作为中央服务器
2)一个或多个"算术节点"与管理节点连接,将其服务列表存储到其中,可以请求任何服务,以及在发送另一个节点的请求时。
为了做到这一点,我在thrift中创建了两个服务,一个用于管理节点,一个用于算术节点,用java编译并编写各自的处理程序类和接口。
算术节点的服务包含用于从另一个节点调度请求的方法。
现在有我的问题。
当我有一个必须同时作为客户端和服务器的对象时,我无法理解节俭是如何工作的。
我遇到这种情况:
我有两个向管理节点注册的算术节点(两个Tsockets打开,两个Ttransport打开,两个管理客户端与同一管理服务器通信),然后一个算术节点必须调用一个操作,另一个算术节点可以响应请求。
此时此刻应该发生什么?我从这里不明白。 必须建立两个节点之间的连接,但它们之间是否有直接连接?这是否意味着我必须先使用算术服务器"和一个"算术客户" ?
答案 0 :(得分:1)
当我有一个必须同时作为客户端和服务器的对象时,我无法理解节俭是如何工作的。
Thrift本身只是一种RPC机制。你做一个(远程)调用,传入一些args,然后得到一个结果(也可以是void
或引发异常)。也就是说,服务器当然可以在服务器处理程序例程中调用另一台服务器。与简单的客户端相比,代码没有什么不同。
你面临的问题显然与Thrift无关,而是与分布式系统的设计有关,这本身就是一个广泛的话题。我可以给你一些概述,但你必须自己查阅,阅读和尝试,以全面了解这个问题。
必须建立两个节点之间的连接,但是它们之间是否有直接连接?这是否意味着我必须先使用算术服务器"和一个"算术客户" ?
除了为什么一个Arithmeter必须调用另一个Arithmeter来解决它可以独立完成的任务的问题:是的,这将是最简单的方法:
+------------------+ +-------------------+
| ArithClient +------ Calculate() --->+ ArithServer |
+------------------+ +-------------------+
在这个简单的场景中,左侧节点实现了客户端,右侧节点实现了服务器。
但是既然你也写过
我正在开发一个简单的分布式系统,其中有:
- a"管理节点"作为中央服务器
- 一个或多个"算术节点"连接管理节点,将其服务列表存储到其中,可以要求任何服务,以及发送另一个节点的请求
醇>
你可能想要管理算术节点彼此不认识的情况。它可以像这样工作:
+------------------+ +-------------------+
| ArithClient | | ArithServer |
+------+-----------+ +------------+------+
| ^
Calculate() Calculate()
| +-----------------------+ |
+--------->+ ManagementNode +--------+
+-----------------------+
所以我们有三个节点,一个充当客户端,第三个充当服务器,中间一个充当第一个节点的服务器,另外呼叫第三个节点,因此也充当客户端那边。
由于实际原因,虽然这可能有效,但它给中央管理节点带来了很多负担,使得它/它们成为整个构造的瓶颈。如果所有这些呼叫都是同步的,那么事情就会变得更糟。
更好的方法可能是以稍微不同的方式进行:
+------------------+ +-------------------+
| ArithClient +---- (2) Calculate() ---->+ ArithServer |
+------+-----------+ +-------------------+
|
(1) please tell me where the
next free ArithServer is?
|
| +-----------------------+
+--------->+ ManagementNode |
+-----------------------+
现在我们(1)仅向管理节点询问有关如何联系合适服务器的信息。使用此信息,我们直接进行调用(2),不再涉及管理节点。
为了进一步优化,客户端可以存储该信息一段时间,并根据需要尽可能长时间地调用ArithServer。这样,当服务器不可用,客户端重新启动或时间结束时,需要再次调用管理节点。
另一种方法涉及真正的异步消息传递,如消息总线或MQ系统。但这绝对超出了这个问题的范围。