跟随我的illogical question,要求使用OSGi 或 Akka,我被告知两者可以一起使用,并且它们各自解决了不同的问题。我可以使用OSGi来提供模块化和可更新性,而Akka则可以提供可扩展性和性能。由于没有很多尝试将OSGi和Akka结合起来,我仍然有几个问题。
OSGi和Akka如何一起使用并互相受益?这个结构如何?您的所有演员是否都驻留在一个OSGi包中,他们每个人都得到一个单独的包,是否有混合解决方案或者不是真的有“正确”的方法吗?
我会将不同OSGi包中的大组件分开。每个包都存在不同的Akka演员。然后,每个束可以根据该束上的负载彼此分开地缩放。在每个捆绑中,透明负载平衡可用于将负载分散到不同的角色上。 这是一种正确而现实的方法吗?
修改
实施后的想法: 他们显然相互补充!我将我的应用程序划分为大块,然后使用Spring将其注入应用程序的某些部分。在大块里面,我只使用了Akka。块的门是Typed Actors。为了使我的系统完全异步,我必须实现一些额外的功能。因此,所有接口方法都不应该返回void类型。找不到任何其他方式。然后,您可以通过接口传递消息作为在请求的整个过程中被携带的属性,该消息在请求开始时被注册到“响应者”中。最后,成功返回DeferredResult对象或返回错误/超时。
答案 0 :(得分:4)
以下是我如何将两者结合使用。
想想这样......
面向对象编程引入了新的封装层。在对象级别(使用私有成员)。 OSGi只启用JAR级封装。如果没有OSGi,一旦编译完成,它就会融入一个底池。 OSGi在JAR级别强制执行接口。因此,您拥有更清晰的模块化和更好的代码(出于同样的原因,任何类型的封装都是好的。)
我只使用OSGi来进行JAR级封装。任何重叠的功能,例如根据使用情况扩展某些模块,我在Akka中做,因为API更高级,更容易做和维护。
但是,关于它们的许多事情并没有重叠,所以你应该能够在考虑到这一经验法则的情况下轻松看到哪些内容。
OSGi对我来说非常有用,可以强制执行一个好的设计,因为它有我如何使用服务的规则......在JAR级强制执行接口。
我会说你的最后一段解释得很好。就像对任何大型软件一样模块化它。但现在它们是OSGi捆绑包。
如果您有后续问题,请发表评论。我可以编辑说更多。我现在一直在使用这两个。
编辑:对评论的回应
阅读你的问题,似乎你可能知道一些我不知道的事情。这是我无法确定的,所以如果这篇文章错过了它的标记,请告诉我。我是一个Akka家伙,后来做了一些OSGi,如果你那样做,你可能会意识到我不是的选择。
分享演员系统是微不足道的。 OSGi包不会像框架那样导致控制反转。你可以像任何其他库代码一样调用它。
无论你在哪里创建actor都使用system.actorOf调用另一个bundle中的actor类,就是这样。您的问题似乎暗示您对其他OSGi选项有更多了解,或者可能认为OSGi会进行控制反转,因此每个捆绑包都会被其自己的actor系统所困扰。
如果还不清楚,我会推荐一个快速原型。只需通过使用该设计的第一个端到端测试,然后在OSGi中重构添加。