跟进我的相当不合逻辑的问题 https://stackoverflow.com/questions/20122538/component-based-application-with-scalability-in-mind-osgi-or-akka,要求使用OSGiorAkka,有人建议我这两者可以一起使用,并且它们各自解决不同的问题。我可以使用 OSGi 提供模块化和可更新性,并使用 Akka 提供可扩展性和性能。由于尚未对 OSGi 和 Akka 的结合进行大量实验,所以我仍然有几个问题。
OSGi 和 Akka 如何一起使用并互相受益?这是如何构造的?您的所有参与者是否都驻留在一个 OSGi 捆绑包中,他们是否每个人都获得一个单独的捆绑包,是否有混合解决方案,或者是否确实存在一种“正确”的方法来做到这一点?
我会将大组件分成不同的 OSGi 包。每个包都存在不同的 Akka actor。然后,每个捆绑包可以根据该捆绑包上的负载彼此单独地缩放。在每个捆绑包中,可以使用透明负载平衡将负载分散到不同的参与者上。
这是正确且现实的做法吗?
EDIT
实施后的感想:
他们显然是互补的!我将应用程序分成大块,然后使用 Spring 将其注入到应用程序的各个部分中。在大块中我只使用 Akka。区块的大门是类型化的演员。为了使我的系统完全异步,我必须实现一些额外的功能。因此,没有阻塞调用,所有接口方法都应该返回 void 类型。找不到任何其他方法。然后,您可以通过接口传递消息作为属性,该属性在请求的整个过程中携带,并在请求开始时注册到“响应者”中。最后成功返回 DeferredResult 对象或返回错误/超时。
以下是我如何将两者结合使用。
这样想吧...
面向对象编程引入了新的封装层。在对象级别(具有私有成员)。 OSGi 只是启用 JAR 级别的封装。如果没有 OSGi,一旦编译完成,一切都会融为一锅。 OSGi 在 JAR 级别强制执行接口。正因为如此,您拥有更清晰的模块化和更好的代码(出于同样的原因,任何类型的封装都是好的)。
我只使用OSGi来做JAR级别的封装。任何重叠的功能,例如根据使用情况扩展某些模块,我在 Akka 中这样做,因为 API 级别更高,因此更容易执行和维护。
但是,关于它们的许多事情并不重叠,因此您应该能够根据经验法则轻松地了解哪些内容会发生在哪里。
OSGi 对我来说对于强制执行良好的设计非常有用,因为它有关于如何使用服务的规则...在 JAR 级别强制执行接口。
我想说你的最后一段解释得很好。就像对任何大型软件一样将其模块化。但现在它们是 OSGi 捆绑包。
如果您有后续问题,请发表评论。我可以编辑说更多。我已经将两者一起使用有一段时间了。
编辑:回复评论
看了你的问题,看来你可能知道一些我不知道的事情。我不能确定这一点,所以如果这篇文章没有达到目的,请告诉我。我是一个 Akka 人,后来做了一些 OSGi,如果你反过来做,你可能会知道我不知道的选项。
共享 Actor 系统很简单。 OSGi 包不会像框架那样导致控制反转。您只需像任何其他库代码一样调用它即可。
无论您在何处创建 actor,都使用 system.actorOf 调用另一个包中的 actor 的类,仅此而已。你的问题似乎暗示你对其他 OSGi 选项了解更多,或者可能认为 OSGi 会进行控制反转,因此每个包都会被其自己的参与者系统所困扰。
如果仍然不清楚,我会推荐一个快速原型。只需通过使用该设计的第一个端到端测试,然后在 OSGi 中添加重构即可。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)