【问题标题】:Java Network Data Exchange ArchitectureJava 网络数据交换架构
【发布时间】:2012-03-24 17:25:02
【问题描述】:

我目前正在重新设计我的一个旧应用程序。我不确定以哪种形式将数据从客户端传输到服务器以及在不同服务器之间传输。以前只有一台服务器在处理客户端。数据的交换是通过序列化和自定义的“IO-Solution”完成的(我之前没有使用像 netty 这样的框架。我现在打算使用 netty。)

我现在的问题是我是否应该使用序列化?我有各种类型的服务器(登录、“集群管理器”(跟踪其他服务器状态等并向它们分配任务)、处理客户端并提供对集群的访问的服务器,我可能会称它们为“对象或实例服务器” . 最后的服务器运行特定场景,例如“战斗”或特定世界/地图的一部分。

序列化的替代方法是使用基于字节的自定义协议并从缓冲区逐步解析它...

如果您需要更多信息以获得好的答案,请询问。

【问题讨论】:

  • 使用json传递消息怎么样?它可以很容易地转换为对象,反之亦然。
  • 这是 Java 而不是 JavaScript...真的不明白我是如何从 JSON 构建一个对象,而双方又没有相同的类。
  • @Nightmares:JSON 起源于 Javascript,但现在可以被认为是一种标准化的跨平台消息格式,所有主流语言都可以使用解析器,其中至少有 3 个用于 Java:stackoverflow.com/questions/338586/a-better-java-json-library

标签: java networking


【解决方案1】:

最佳解决方案取决于您的场景细节和未来计划。如果:

  1. 您的各种服务器和客户端都是用 Java 编写的
  2. 你控制他们的发展
  3. 您可以控制它们的部署,以便版本可以保持同步
  4. 网络通信不是性能关键
  5. 在可预见的未来,因素 1-4 将保持不变

那么 Java 序列化是最好的解决方案,我会毫不犹豫地使用它。

  • 如果对因素 1 有疑问,您肯定需要一个标准化的跨平台解决方案,例如 JSON、XML、Protocol BuffersApache ThriftASN.1

  • 1234563 /li>
  • 如果对因素 3 有疑问,您需要一个可以以受控方式进行扩展和版本控制的协议。 Java 序列化在某种程度上可以做到这一点,但我怀疑它是最好的解决方案。不过我没有太多经验;你必须看看哪种解决方案最能支持这一点。

  • 1234563李>

【讨论】:

  • 感谢您的回答。它真的帮助我做出了决定。网络性能对性能至关重要,这意味着我只有一个选择:基于自定义字节的协议或类似协议。 XML 解析或类似的数据结构为整个事物增加了至少 2 层工作:解析结构,然后解析节点值。当使用基于字节的协议时,我可以重新组装原始类型而不会损失性能(或至少几乎没有)。
【解决方案2】:

看看Kryo。它是序列化,只是要快得多。您也可以尝试 Google 协议缓冲区。

【讨论】:

  • 看起来很有希望,但我认为序列化的一个问题是我必须将所有类都放在两边。
【解决方案3】:

不同序列化库的基准: https://github.com/eishay/jvm-serializers/wiki/

【讨论】:

    猜你喜欢
    • 2012-02-27
    • 1970-01-01
    • 1970-01-01
    • 2011-05-10
    • 1970-01-01
    • 2019-10-06
    • 2013-08-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多