【问题标题】:Good protocol for FAST inter-application communication? [closed]FAST 应用程序间通信的良好协议? [关闭]
【发布时间】:2009-02-12 04:52:40
【问题描述】:

我即将实现一个可以快速回答查询的服务器应用程序。服务器是用java实现的。我不想在复杂的通信协议上浪费很多时间,所以我寻找一种好的最佳实践方式 1)对我的服务器执行查询 2)让服务器回答该查询 查询和答案都是从整数到整数列表的映射。

相关:是否有任何组合框架既可以处理查询/响应协议又可以管理传入查询(将它们放入队列中)?

我不知道我是否应该将它实现为普通的守护程序或 Web 服务。 Web 服务似乎更灵活,因为它可以相对容易地移动到另一台机器上,但普通的守护进程听起来更快。

【问题讨论】:

    标签: java web-services daemon protocols


    【解决方案1】:

    以灵活性为代价,守护进程在短期内会更快。守护程序的优点是您可以以紧凑的形式将回复发送回,在您的情况下作为二进制整数值流。这将尽可能快。

    如果请求数量增加超过一定限制,您可以使用DNS with Round Robin 将负载分散到几台机器上,因此使用 HTTP 服务器没有任何优势。

    主要缺点是您不能轻松调试此接口(对于大多数 Internet 协议,您只需 telnet 到服务器侦听的端口并运行几个命令即可查看结果)。此外,如果您出于任何原因必须更改界面,您也必须更改每个客户端。当您需要在其他地方使用此服务时,情况会变得更糟,例如在 mashup 中。

    因此,如果您想更灵活,请使用 HTTP 和 JSON 之类的协议作为数据格式。这不像二进制那么紧凑,所以回答时间会更糟。差多少取决于数据的大小。如果您可以将 JSON 编码的响应放入标准 IP 包(大约 1500 字节)中,您可能不会注意到差异。

    【讨论】:

      【解决方案2】:

      我知道这是一个笼统的答案,但您说的是守护程序和 Web 服务之间的毫秒差异。

      话虽如此,请使用更灵活的架构。 好的设计远胜过你用来执行它的技术。

      如果几毫秒真的很重要,那么问题不在于使用哪种技术,而是如何使用缓存和负载平衡来扩展它。

      【讨论】:

        【解决方案3】:

        如果你开发一个守护服务器,你为客户端提供什么接口来连接?您将实现套接字或 RMI 或其他东西。在可扩展性方面不是一个非常灵活且易于维护的解决方案。

        使用网络服务。

        【讨论】:

        • 感谢您的所有 cmets!我将使用 Web 服务实现。但是,我在网络服务方面没有经验。我是否应该编写某种我应该编写的 servlet 并让 fx tomcat 或 jetty “服务”它?还是有更快更轻量级的方法?
        • Webservice 对我来说是一个广义的术语。这意味着通过 http 提供的任何内容。您当然可以创建一个 servlet 并在 Tomcat 中部署您的应用程序。现在客户端可以通过传递参数通过该 servlet 访问您的应用程序。您的 servlet 可以返回 XML 或文本的响应,这取决于您想要什么
        【解决方案4】:

        你可以 follow the leader 和用户 HTTP :)

        例如在他们的 AJAX API 中,他们将它与 JSON 结合使用(或者是纯 javascript?)

        Here 就是一个例子。

        对于以下查询:

        http://ajax.googleapis.com/ajax/services/language/translate?v=1.0&q=hello%20world&langpair=en%7Cit&callback=foo&context=bar

        完整的输出是这样的:

        HTTP/1.0 200 OK
        Date: Thu, 12 Feb 2009 05:13:31 GMT
        Content-Length: 97
        Content-Type: text/javascript; charset=utf-8
        Expires: Thu, 12 Feb 2009 05:13:31 GMT
        Cache-Control: no-cache, no-store, max-age=0, must-revalidate
        Pragma: no-cache
        X-Backend-Content-Length: 16
        X-Embedded-Status: 200
        X-Content-Type-Options: nosniff
        Server: GFE/2.0
        
        {"responseData": {"translatedText":"ciao mondo"}, "responseDetails": null, "responseStatus": 200}
        

        当然测试很简单,但是使用java实现再简单不过了。

        当然,这取决于您的项目需求、安全性、访问控制等,但通过使用 HTTP,您可以在经过超级测试的协议上进行中继。

        【讨论】:

          【解决方案5】:

          如果性能是一个很大的问题,我怀疑您很需要采用某种集群解决方案网格。我不久前写了一个overview of Java grid/cluster libraries,这是有用的背景。

          如果可以选择商业软件,我建议查看 GigaSpaces(或者如果不是,则使用一些免费软件 JavaSpaces 实现)。它可以让你这样做:

          • 消息的 FIFO 排序,如果这对您很重要(尽管这会带来性能成本);
          • 亚毫秒事务网格更新;
          • 如果您想使用排队 API,它会附带一个构建在上面的 JMS 实现;和
          • 消息由类定义,因此您只需读取/写入相应的操作即可。

          GigaSpaces(以及任何真正的网格/集群技术)扩展性很好。比纯队列解决方案要好得多,后者要么不能随发布-订阅(因为所有侦听器都会收到消息;通常不是您想要的)或请求-响应(您必须确保队列没有被阻止一条坏消息)。

          你没有提到服务器使用的是什么技术。如果它是Java,那么你就可以了。如果没有,它会变得更有趣。如果是这种情况,您可能需要考虑使用 Google Protocol Buffers 构建一些东西,这是一种高性能二进制交换格式,受 Java、C++ 和可能的其他平台支持。

          就我个人而言,我不是 Web 服务的忠实拥护者,因为它们不是事务性的(从某种意义上说,它们不能注册分布式事务)。这对你来说可能是也可能不是问题。此外,不同技术堆栈(例如 Java 和 .Net)之间的互操作性充其量仍然存在问题。

          【讨论】:

            【解决方案6】:

            除非您尝试过多种方法,否则您不会知道哪种方法“更好”。最好的方法是制作每个原型,然后尝试一下!它甚至不需要做所有你想做的事情,只需要做一些基本的事情(比如返回预定义的数据),你可以对它进行负载测试,看看哪个更好。

            我怀疑这些天来,现代机器的运行速度足以让 http 正常工作,并且由于更加标准化,其他服务可以利用您的服务器而无需专门的客户端。

            【讨论】:

              猜你喜欢
              • 2010-12-26
              • 1970-01-01
              • 2014-04-29
              • 1970-01-01
              • 2019-01-12
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2018-02-10
              相关资源
              最近更新 更多