【发布时间】:2011-02-04 10:59:25
【问题描述】:
我正在实现一个类似 CORBA 的服务器。每个类都有可远程调用的方法和具有两个可能输入的分派方法,一个标识方法的字符串或一个整数,该整数将是表中方法的索引。字符串到相应整数的映射将由映射实现。
调用者将在第一次调用时发送字符串并在响应中返回整数,因此它只需在后续调用中发送整数。这只是一个小的优化。服务器对象可以根据需要动态分配整数。 服务器类可以派生自另一个具有重写虚方法的类。
定义方法绑定和调度方法的简单通用方法是什么?
编辑:这些方法都具有相同的签名(没有重载)。这些方法没有参数并返回一个布尔值。它们可能是静态的、虚拟的或非虚拟的、是否覆盖基类方法。绑定必须正确处理方法覆盖。
字符串是类层次结构绑定的。如果我们有由字符串“A.foo”标识的 A::foo(),并且类 B 继承了 A 并覆盖了方法 A::foo(),它仍然会被标识为“A.foo”,但是如果服务器是 A 对象,调度程序将调用 A::foo,如果它是 B 对象,则调用 B::foo。
编辑(4 月 6 日): 换句话说,我需要用一个动态调度方法实现我自己的虚拟方法表(vftable),该方法使用字符串键来标识要调用的方法。 vftable 应该在同一个类的对象之间共享,并按照多态的预期行为(继承方法覆盖)。
编辑(4 月 28 日):请参阅下面我自己的答案和最后的编辑。
【问题讨论】:
-
“优化”似乎很危险。您是否希望方法名称在 RPC 开销中很重要?如果有客户端使用索引,是不是就不能用新的方法重启服务器?
-
整数是对方法名称的重要优化。整数通常会被编码为单个字节,它可以用作方法表中的索引,并且名称需要在堆上分配和管理块(我的协议要求)。所以它有一个好处。绑定可以由客户端清除,但我没有考虑服务器可能要主动清除它的情况。好点子,谢谢。
-
编码不是 XDR (RPC) 或 IIOP (CORBA)。它是一种名为 IDR 的新编码,它是二进制但面向流的。我目前正在设计名为 DITP(分布式信息传输协议)的协议并对其进行原型设计。您及时发表了评论:)
-
既然是流式传输,在客户端和服务器上保持状态,为什么还要担心索引呢?您可能只保留一个 sessionid。
-
整数优化不会在服务器崩溃的情况下产生额外的问题吗?假设服务器公开了一个“无状态”API(à la NFS),即不需要瞬态的 API。如果服务器同时重新启动,客户端将不得不重新创建绑定。除此之外,由于 RPC 性能主要受每次调用的客户端-服务器延迟而不是有效负载大小的限制,因此优化数据序列化可能很重要,但优化 RPC 调用标头似乎不太重要。无论您发送 10 字节还是 20 字节,RPC 应答总是需要往返。