2010-01-28 59 views
2

我正在开发一个用于创建各种规模高效应用程序的框架。应用程序由模块组成(应用程序也是一个模块),性能对我很重要。我知道现有的模块化框架等,但我需要实现我自己的。尽管我对个别模块的性能进行了颠覆并对它们进行了优化,但是对象之间(以及线程之间)之间的通信却是我无法决定如何实现的。这里有一些选择我认为:Java对象之间的有效通信

  • NIO管道
  • 活动(注册监听器)在应用程序上下文
  • 事务队列

我的问题是, 其中哪一个是更好的避免瓶颈和锁?或者有什么替代方案可以提供建议?

+0

我不知道为什么有人投票关闭这个。这是一个真正的问题。他问的是各种Java通信机制之间的权衡,并研究了一些替代方案。似乎对我有效。 – 2010-01-28 22:33:31

+0

没有足够的信息提供有意义的建议。这些应用程序是否位于同一个JVM,同一台机器,局域网上的不同机器等?应用程序是否交易?他们是否需要在交易中进行协作?该框架支持哪些通信原语:RPC,异步消息传递,数据流?什么同步原语? – 2010-01-28 22:35:57

+0

我认为我给自己说的例子说明了一切;管道,事件...这些只是双向沟通的例子。例如, 假设我有一个主类和一个管理对象。需要双向通信:主类向管理器对象提交缓冲区进行处理并继续执行,当管理器中的进程完成时,结果将发送到主类。我可以使用管道发送和检索数据,或者可以通知附加的事件对象结果的注册侦听器,或者我可以从等待队列中弹出等待缓冲区,处理它并将其存储在结果队列中。 – 2010-01-29 00:30:13

回答

0

如果这是一个打算导致生产质量代码的项目,我强烈建议你而不是实现你自己的框架。首先,显然你并没有真正了解你的应用程序需要什么样的框架,或者你可以使用各种技术来实现这样的框架。不要低估你对知识的缺乏,以及在你开始时不知道自己在做什么的项目的风险。

其次,您实施自己的框架的动机是错误的。如果您发现现有的框架对于您的需求来说过于庞大而复杂,您可以选择一个更简单的框架,或者只是学习完成工作所需的子集......而忽略其余部分。

三,设计和建造一个半体面的框架很多工作。这可能是您花费构建实际应用程序的时间。当然这很有趣,但你的老板可能对结果更感兴趣。第四,不要低估使用许多其他人使用的框架的内在优势;第四,不要低估使用许多其他人使用的框架的内在优势;第四,不要低估使用许多其他人使用的框架的内在优势;例如一个社区可以提出问题(比如SO),一个社区来改善框架,就业人员的简历框架。

最后,通过实施自己的框架,您最有可能为团队/公司创造大量额外的未来维护工作。你错了,你的同事们会在未来10年咒骂你在走廊上下。即使你的框架100%正确,你组织中的某个人仍然需要在依赖它的应用程序的整个生命周期中进行维护。

+0

我实际上是一名学生。我开发的框架是实现服务器的一个API,它将专注于一项工作。我知道关于http实现和cdns。我已经写了几乎所有的东西。在阅读你写的内容之后,我决定使用osgi进行模块化。我的服务器正在使用通道和选择器来读取请求,然后将它们作为选择键传递给http解释器。当服务器产生响应时,它被写回到客户端。我无法找到一种方法来发送回应,但它看起来像响应准备就绪。它看起来像我所要做的就是将键设置为写入。 thnx – 2010-01-29 03:59:41

+0

不是每个节目都有老板的人,或者没有看到“有趣”作为做事的正当理由。 – 2010-02-09 21:15:06

+0

@Bart - OP显然不是为了好玩而做的。他现在可能有也可能没有老板,但他肯定要考虑做一些可能使他的项目失败的后果。在这种情况下,结果可能是他没有通过课程。此外,作为一名学生,他还应该学习用专业开发人员/经理的思维去思考。最后,他需要咨询替代方案,“使用现有框架”是最佳选择。 – 2010-02-09 22:41:35

2

有太多变数。要知道的唯一方法是以可插入的方式编写消息传递系统,以便在编写代码时以不同的方式编写代码并进行测量。

遗憾的是,你已经抛出使用框架,大多数会比任何你可能写自己的东西更快,更完整和更有用。提出这一要求的人应该面对并可能被解雇。

+0

和更复杂和繁琐:)我只需要一个简单的机制 – 2010-01-29 00:05:53

+0

虽然我明白你不愿意学习似乎有很多功能的框架,但我一直发现,当我不认为我需要的功能像这样的框架,这是因为我没有像框架实现者那样花费太多时间来理解问题 - 最终你必须在你自己的框架中实现这些功能。 – 2010-01-29 18:21:36

1
i am developing a framework for creating efficient applications in all sizes 

举个很普遍的意见,我会建议你潜入JBoss的源代码来获得的印象如何时,他们都应该工作(也许你可以得到最老版本的事情是由作为出发点)

3

我唯一的建议就是不要这样。正如Bill K已经说过的那样,大多数实施将会更快更完整。更重要的是,有很好的资源可以实现你想要做的事情:OSGi,例如Eclipse和Glassfish v3。

就我个人而言,我实现了类似于您的描述的内容,在运行时加载插件而无需重新启动容器。维护和调试是一场噩梦。更重要的是,虽然实现新模块相对容易(毕竟,我设计了这个模块),但编程很难。我最终学到了很多关于类加载器的知识,但就是这样。

+1

+1 - 第一句话。特别是因为你必须首先提出这样的问题! – 2010-01-28 22:42:23

+0

+1我也一样,这就是指出事情已经完成的工作示例的原因。 – stacker 2010-01-28 22:44:31

+0

@stacker - 我们甚至不知道OP是在询问关于web的东西,所以我们如何知道哪些示例是相关的? – 2010-01-28 22:49:50