我们正在开发一个网络应用程序(我们称之为图像库),我们已经确定了以下需求:
- 该应用程序迎合由一组用户组成的客户。
- 可以动态创建新客户并由客户管理其用户
- 客户有不同的功能集,可以动态更改
- 客户可以开发自己的功能并进行部署。
- 应用是同构的,有当前版本,但客户的版本提升仍然可以单独处理。
- 应用程序应该作为一个整体进行管理,客户共享应该易于扩展的资源。
问题:我们应该在标准的 OSGi 框架上构建它,还是使用新兴的应用程序框架之一(Virgo、Aries 或即将推出的 OSGi 标准)更好?
更多背景和一些初步想法:
我们正在构建一个网络应用程序,我们设想它很快就会拥有数百个客户(公司),每个客户(员工)有数百个用户,否则为什么要麻烦;)。我们想让它模块化,因此 OSGi。将来客户自己可能会开发和插入组件到他们的应用程序中,所以我们需要客户隔离。我们还可能希望不同的客户获得不同的功能集。
当不同的客户端共享相同的包时,向应用程序的不同客户端提供不同服务实现的“正确”方式是什么?
我们可以使用应用程序服务器方法(我们已经查看了 Virgo)并将每个客户的每个捆绑包一次加载到他们自己的“应用程序”中。然而,它并不像拥抱 OSGi。我们没有托管大量应用程序,99% 的服务将共享相同的 impl。为所有客户。此外,我们希望将应用程序作为一个整体进行管理(配置、监控等)。
可以为每个客户注册(正确配置)每个服务以及一些“客户令牌”属性。这有点混乱,必须使用扩展器模式或 ManagedServiceFactory 来处理?此外,在为客户 A 注册服务之前,需要获取其每个依赖项的 A 版本。
每个请求都知道“当前”客户,并且可以绑定到线程。每次搜索服务时都必须提供客户令牌有点麻烦。这使得使用像蓝图这样的组件框架变得很困难。为了解决这个问题,我们可以使用服务挂钩来代理每个注册的服务类型,并让代理根据当前客户(线程)分派到正确的实例。
通过实现上面的解决方法(hack?)开始我们的整个 OSGi 体验真的感觉像是我们走错了路。那么我们应该怎么做呢?回到处女座?尝试类似于上面概述的内容?完全不同的东西?!
附言。感谢您一直阅读这里!;)