无法为我的Java应用程序选择合适的网络解决方案

时间:2011-01-25 21:11:38

标签: java network-programming

我正在编写一个分布式Java应用程序,它将大量使用网络,并且需要快速

让我假装我有一个名为 Widget 的课程。窗口小部件是在客户端创建的(很可能是Swing框),但需要在服务器端持久化并在所有其他连接的客户端之间共享/分发。因此,我需要一种方法来序列化Widget实例,将它们发送到服务器,服务器将在其中管理它们并更新所有连接的客户端,并更新他们感兴趣的Widgets中的状态。(因此,一旦创建了一个Widget并发送了服务器理论上,它可以被“拉下”并被任何其他客户修改。

性能是必须的,因此这必须是二进制协议。也更喜欢非阻塞套接字,以及非常非常可扩展的东西。

因此,我将RMI,NIO和Netty视为可行的解决方案。如果我正确理解Java网络,那么一切似乎都表明RMI比NIO慢得多。我也听说RMI缺乏可扩展性部门。另一方面,NIO为您提供了更大的灵活性,因此更加复杂。 Netty似乎拥有最好的文档,但似乎比NIO慢,可能无法满足我真正需要它做的事情。

对于Widget发布,我只是在寻找能够通过网络快速发送Widgets的能力。不关心使用什么协议。

有人愿意分享他们的想法/意见吗?

谢谢!

4 个答案:

答案 0 :(得分:2)

首先,RMI和NIO是苹果到橙子;所以不要混淆不是替代品的东西。第二,确保表现真正重要;什么样的性能(吞吐量和延迟是通常的第一候选者;或者可能是空间效率)。您有可能过高估计性能的重要性,因为良好的解决方案更可能受到网络性能的限制,而不受端点(CPU)性能的限制。

如果性能很重要,请查看jvm-serializers以获得实际格式的性能比较。例如,Java序列化用于RMI。

哦,顺便说一下,不要以为你必须使用二进制格式。这通常不是一项艰难的要求;文本格式压缩得很好,并且更容易调试/排除故障,并且如果需要,可以通过其他平台,语言进行处理。

答案 1 :(得分:0)

您是否看过JiniJavaspaces?这是RMI,所以可能不合适。但是,基于空间的模式对于分发对象,接收通知,以分布式方式进行更新等非常强大,并且您可以非常轻松地启动和运行。

答案 2 :(得分:0)

你提到了Netty。我会想到的。我对Netty的体验很棒。它是一个非常高效的库,具有可靠的文档和灵活性。

它可以做任何你能想象的二进制协议,但它只做你需要的,所以它是轻量级的。它也很好地扩展。我已成功加载测试单个服务器,其中一个简单的工作可以为200-300个并发客户端维持超过10k +请求/秒。那是在一个相当标准的机架服务器上。

有一点学习曲线,但javadoc是我在处理这个障碍时看到的最好的一些。该项目正在积极开发中,项目的领导者对问题和缺陷反应极为敏感。

编辑:为了快速传输小部件,您可以查看协议缓冲区。它们非常有效地通过线路序列化/反序列化对象。

答案 3 :(得分:0)

Google的Protocol BuffersApache Thrift都符合这些标准。

它们是用于数据序列化的二进制协议,它们具有RPC API,用于通过网络传递小部件,因此您无需重新发明轮子。