Java中高效的TCP服务器和数据转换
Posted
技术标签:
【中文标题】Java中高效的TCP服务器和数据转换【英文标题】:Efficient TCP Server and Data conversion in Java 【发布时间】:2011-07-20 16:27:58 【问题描述】:背景
在我的 java 应用程序中,我在 ConcurrentHashMap 中有相当多的数据。
现在,当客户端通过 TCP 端口连接到我的应用程序时,我需要将此数据以 XML 格式提供给消费者客户端。
简而言之 - 我有一个客户端连接到的 TCP 服务器。客户端连接后,我必须读取 Map 中的所有数据,并在 TCP 端口上以 XML 格式(自定义)将其吐出。 Map 中的数据会使用工作线程等从其他地方自动更新,因此我必须不断地在这个 tcp 端口上向客户端发送新数据。
我想实现一个内存和 cpu 高效的解决方案 - 主要是我不希望在堆中生成太多不可变对象。 .
注意:将来我可能必须支持多种输出格式(如逗号分隔或 Json 或 HL7 等)。为简单起见,假设客户端可以针对特定格式连接不同的 TCP 端口。
问题
话虽如此 - 我一直在为我的 TCP 服务器实现和从 ConcurrentHashMap 到 XML 的数据转换过程寻找最佳解决方案。
对于TCP Server,人们议论纷纷
NETTY
Kryonet
Apache MINA
我的客户将是一些第三方,所以我认为 kryonet 已经出局了,因为客户不会做 Kryonet 所需的“注册”业务。那么在 MINA 和 NETTY 中,哪一个是可扩展且更易于理解的呢?还有什么建议吗?
对于从 ConcurrentHashMap 到 XML 的数据转换,我正在考虑使用 XSTREAM 还有什么建议吗?
谢谢
【问题讨论】:
【参考方案1】:如果您有 100 或 1000 个连接,您应该开始考虑可扩展性。但是,如果您的连接数量较少,则可能只需要使用普通 Socket。
如果只有一部分数据发生变化,最好只发送已更改的数据,或者至少只重新生成已更改的 XML。
【讨论】:
【参考方案2】:需要多快?似乎您应该能够创建仅使用 tomcat 和 spring-mvc 之类的标准框架在不到 10 毫秒(加上 RTT)内返回的东西。使用 JAXB 将对象转换为 XML。如果你想支持像 json 这样的额外输出格式,这很简单(使用 Jackson 库,api 类似于 JAXB)。
我有一个同事尝试了套接字服务器方法,最后我们使用了 tomcat,因为它几乎一样快,而且 QPS 更稳定/可预测。
【讨论】:
:我的要求是不断地向连接的客户端提供数据。理想情况下,客户端可以连接数天,使用它从服务器接收到的最新数据。所以我不确定tomcat是否会这样做。以上是关于Java中高效的TCP服务器和数据转换的主要内容,如果未能解决你的问题,请参考以下文章