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

无法为我的Java应用程序选择正确的网络解决方案,java,network-programming,Java,Network Programming,我正在编写一个分布式Java应用程序,它将大量使用网络,并且需要快速 让我们假设我有一个名为Widget的类。小部件是在客户端(很可能是一个Swing box)创建的,但需要在服务器端持久化,并在所有其他连接的客户端之间共享/分发。因此,我需要一种方法来序列化小部件实例,将它们发送到服务器,服务器将在那里管理它们,并使用它们感兴趣的小部件中的状态更改来更新所有连接的客户端。(因此,一旦一个小部件被创建并发送到服务器端,理论上它可以被任何其他客户端“拉下来”并修改 性能是必须的,所以这必须是一个二

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

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

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

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

对于Widget分发,我只是希望能够通过网络快速发送Widget

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


谢谢!

你看过和吗?它是RMI,所以可能不适合。但是基于空间的模式对于分发对象、接收通知、以分布式方式更新等功能非常强大,你可以很容易地启动和运行一些东西。

你提到了Netty。我同意。我与Netty的经验是great、 这是一个非常高效的库,具有可靠的文档和灵活性

它可以用二进制协议做任何你能想象得到的事情,但它只做你需要的事情,所以它很轻。它的可扩展性也很好。我已经成功地用一个简单的作业对一台服务器进行了负载测试,为200-300个并发客户机提供了10k+请求/秒的支持。这是在一个相当标准的机架式服务器上实现的

有一点学习曲线,但javadoc是我见过的最好的解决这个障碍的工具之一。项目正在积极开发中,项目负责人对问题和缺陷的反应非常灵敏

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

谷歌的和符合这些标准的


它们是用于数据序列化的二进制协议,它们有用于在网络上传递小部件的RPC API,这样您就不必重新发明轮子了。

首先,RMI和NIO是苹果对桔子;所以不要混淆不是替代品的东西。其次,确保性能真正重要;以及什么样的性能ce(吞吐量和延迟通常是首选;或者可能是空间效率)。您可能高估了性能的重要性,因为对于好的解决方案,您更可能受到网络性能的限制,而不是端点(CPU)性能的限制

如果性能很重要的话,可以查看一下实际格式的性能比较。例如,Java序列化用于RMI


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

谢谢你!我会考虑到这一点-这些都是相当大的数字。另外,当我说这是一个网络时对于使用分布式小部件对象的应用程序,我是正确使用短语“分布式”还是“序列化”、“分布式”或“网络化”有不同的含义吗?谢谢!Brian,谢谢你的建议-今晚我将看一看Jini。StaxMan-谢谢你的投入。在理解RMI和NIO之间的区别时,我似乎缺少一些基本的东西。据我所知,两者都是基于套接字的。而NIO允许你在TCP或UD之上实现任何东西P、 RMI似乎有自己的应用层协议,用于在网络上传输序列化对象。但这不是归结为两种不同的基于套接字的协议吗?我在这里缺少什么?除非术语“序列化”和“网络化”对象并不意味着相同的事情…NIO是旧的阻塞I/O(“BIO”)的低级替代品。NIO只允许以非阻塞方式访问套接字(和文件等)。Netty是一个使NIO更易于使用的库。RMI只是实现了“黑盒”不仅仅是基于tcp的发送/接收,还包括对象序列化和其他相关部分。RMI的序列化确实包括从任何Java对象到字节[]的完全序列化;我认为序列化在其他上下文中有其他含义?因此:基本上,RMI实现了“您所需的一切”,很难替换这些部分。NIO(有或没有NETY)是一个较低级别的构建块。您可以使用NIO(或阻塞I/O)的几十个串行化方案。如果您喜欢RMI的想法,可以考虑由高级亚马逊工程师编写的RMI替换DiRMI;它“就像RMI一样,只是更好”。,解决了大多数已知的现有RMI问题。啊……那么,为了在网络上传递小部件,必须首先将其序列化为字节,然后RMI使用TCP套接字(基于NIO?)在网络上传递字节。然后,在另一端,RMI有“黑盒”吗将字节重建为Java对象的神奇方法。这是一个公平的评估吗?没错。JDK使用的RMI实现可能使用NIO或阻塞i/o(可能是后者,因为NIO是在RMI之后添加的),但它基于套接字。