如何“启用”旧版C ++应用程序

时间:2010-07-21 10:32:28

标签: c++ c apache rest wt

我正在开发一个按组织划分用户的系统。每个用户都属于一个组织。每个组织将其数据存储在驻留在数据库服务器计算机上的自己的数据库中。数据库服务器可以管理一个或多个组织的数据库。

现有(遗留)系统假设只有一个组织,但是我想通过运行它的“实例”(绑定到一个组织)来“扩展”应用程序,并在服务器计算机上运行多个实例(即运行“单一组织”应用程序的多个实例 - 每个组织一个实例。

我将为服务器上运行的每个实例提供RESTful API,以便瘦客户端可用于访问服务器计算机上运行的实例提供的服务。

这是一个简单的示意图,演示了这些关系:

  

服务器1 - > N数据库(每个   组织有一个数据库)

     

组织1 - > N个用户

我的问题涉及如何将来自客户端的RESTful请求“引导”到处理该组织用户请求的相应实例。

更具体地说,当我收到RESTful请求时,它将来自用户(属于某个组织),如何(或实际上,最好的方式)将请求“路由”到正在运行的相应应用程序实例在服务器上?

4 个答案:

答案 0 :(得分:1)

从我可以收集的内容来看,这实际上是一个严重的问题。无论您如何在硬件级别拆分实例(使用VM,多个服务器,所有功能都在一个功能强大的服务器上等),您需要在整个架构中使用中央注册表和代理层,将每个请求的给定用户映射到正确的目标实例

当然,有很多方法可以实现这一点,所以只需选择一个你知道且速度很快的方法,并且可以扩展,因为所有请求都会通过它来实现。我建议一个轻量级无状态Web应用程序,由一个简单的只读数据库支持,该数据库执行相应的客户端标识符 - >实例映射,您将加载到内存/缓存中。要增加硬件和实例位置的灵活性,请使用(假设Java)JNDI存储每个实例的硬件/端口/ etc信息,并在标识符映射中将客户端标识符映射到相应的JNDI查找键。

答案 1 :(得分:1)

让公共API仅指定用户听起来有点脆弱。我会更改公共API,以便请求指定组织和用户,然后有一些简单的服务器端将组织映射到实例(例如,组织foo - >实例侦听端口7331)。

答案 2 :(得分:0)

这确实是一个非常棘手的问题;仅仅因为有许多可能的答案,哪一个是最好的答案只能由你和你的环境决定。

我会用C ++编写一个apache模块来做到这一点。使用this book,我设法开始编写非常有效的模块。

为了能够为您提供更多解决方案(可能只是设置Squid代理?),您需要指定如何确定重定向客户端所需的服务器。如果你可以通过IP来做,虽然是一个GET参数,虽然是一个POST XML参数(如SOAP)。等

答案 3 :(得分:0)

正如另一个答案所说,有很多方法可以解决这个问题。让我们假设您无权访问旧版软件源代码,这意味着您无法修改它以在不同端口上侦听不同的实例。

编写Apache模块似乎非常极端地解决了这个问题(并且作为一个实际上刚刚完成编写生产apache模块的人,我建议避免使用它,除非你要赚很多钱)。

这种方法可以像你喜欢的那样深奥。例如,如果您的旧版软件在正常的英特尔架构上运行,并且您拥有硬件容量,则可以使用VM解决方案,您应该能够创建一个瘦虚拟机,一个运行单个软件实例,一个多路复用器将它们全部绑定。

另一方面,如果你正在运行类似HPUX的东西:-)还有其他方法。你怎么样给出更多细节?

艾哈迈德。