- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在开发一个简单的分布式系统,其中有:
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:
- 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 +--------+
+-----------------------+
所以我们有三个节点,一个充当客户端,第三个充当服务器,中间一个充当第一个节点的服务器,并且另外调用第三个节点,因此也充当客户端那边。
出于实际原因,虽然这可能有效,但它给中央管理节点带来了很大的负担,使其成为整个构造的瓶颈。如果所有这些调用都是同步的,这会让事情变得更糟。
更好的方法可能是采用稍微不同的方式:
+------------------+ +-------------------+
| 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/
是 if(a == 0 && b == 0 && c == 0) { return; } 一样 if(a == 0) { return; } if(b == 0) { return; } if(c =
我想做这样的事情: Class A Class B extends A Class C extends A B b = new B(); C c = new C(); b->setField("foo
我对 Mysql 世界很天真......:)我试图使用连接从表中查询, 我遇到结果集问题...表结构如下 下面... VIDEO_XXXXX | Field | Type
我最近问过关于从另一个类获取类的唯一实例的问题。 ( How to get specific instance of class from another class in Java? ) 所以,我正
假设我们有两种类型 using t1 = int*; using t2 = int*; 我知道 std::is_same::value会给我们true .什么是,或者是否有模板工具可以实现以下目标?
对于我的一个应用程序,我假设比较 2 个字符串的第一个字符比比较整个字符串是否相等要快。例如,如果我知道只有 2 个可能的字符串(在一组 n 字符串中)可以以相同的字母开头(比如说 'q'),如果是这
我想在我的NXP LPC11U37H主板(ARM Cortex-M0)上分析一些算法,因为我想知道执行特定算法需要多少个时钟周期。 我编写了这些简单的宏来进行一些分析: #define START_C
我在 Excel 中创建了一个宏,它将在 Excel 中复制一个表格,并将行除以我确定的特定数字(默认 = 500 行),并为宏创建的每个部门打开不同的工作表。 使用的代码是这样的: Sub Copy
我想根据第一个字典对第二个字典的值求和。如果我有字典 A 和 B。 A = {"Mark": ["a", "b", "c", "d"], "June": ["e", "a"], "John": ["a
当我这样做时 system()在 Perl 中调用,我通常根据 perldocs 检查返回码.嗯,我是这么想的。大部分时间 $rc!=0对我来说已经足够了。最近我在这里帮助了两个遇到问题的人syste
在我的进度条上,我试图让它检测 div 加载速度。 如果 div 加载速度很快,我想要实现的目标将很快达到 100%。但进度条的加载速度应该与 div 的加载速度一样快。 问题:如何让我的进度条加载
当我获得与本地时间相同的时间戳时,firebase 生成的服务器时间戳是否会自动转换为本地时间,或者我错过了什么? _firestore.collection("9213903123").docume
根据the original OWL definition of OWL DL ,我们不能为类和个体赋予相同的名称(这是 OWL DL 和 OWL Full 之间的明显区别)。 "Punning" i
我有两个输入复选框: 尝试使用 jQuery 来允许两个输入的行为相同。如果选中第一个复选框,则选中第二个复选框。如果未检查第 1 个,则不会检查第 2 个。反之亦然。 我有代码: $('inpu
可以从不同系统编译两个相同的java文件,但它们都有相同的内容操作系统(Windows 7),会生成不同的.class文件(大小)? 最佳答案 是的,您可以检查是否有不同版本的JDK(Java Dev
我正在清理另一个人的正则表达式,他们目前所有的都以结尾 .*$ 那么下面的不是完全一样吗? .* 最佳答案 .*将尽可能匹配,但默认情况下为 .不匹配换行符。如果您要匹配的文本有换行符并且您处于 MU
我使用 Pick ,但是如何编写可以选择多个字段的通用PickMulti呢? interface MyInterface { a: number, b: number, c: number
我有一个 SQL 数据库服务器和 2 个具有相同结构和数据的数据库。我在 2 个数据库中运行相同的 sql 查询,其中一个需要更长的时间,而另一个在不到 50% 的时间内完成。他们都有不同的执行计划。
我需要你的帮助,我有一个包含两列的表,一个 id 和 numpos,我希望 id 和 numops 具有相同的结果。 例子: $cnx = mysql_connect( "localhost", "r
如何将相同的列(在本例中按“级别”排序)放在一起?我正在做一个高分,我从我的数据库中按级别列出它们。如果他们处于同一级别,我希望他们具有相同的 ID。 但是我不想在别人身上显示ID。只有第一个。这是一
我是一名优秀的程序员,十分优秀!