我即将实现一个可以快速回答查询的服务器应用程序。服务器是用java实现的。我不想在复杂的通信协议上浪费很多时间,所以我寻找一种好的最佳实践方法 1)对我的服务器执行查询 2)让服务器回答该查询 查询和答案都将是从整数映射到整数列表。
相关:是否有任何组合框架既可以处理查询/响应协议又可以管理传入查询(将它们放入队列中)?
我不知道我是否应该将它实现为普通的守护程序或 Web 服务。Web 服务似乎更灵活,因为它可以相对容易地移动到另一台机器上,但普通的守护进程听起来更快。
我即将实现一个可以快速回答查询的服务器应用程序。服务器是用java实现的。我不想在复杂的通信协议上浪费很多时间,所以我寻找一种好的最佳实践方法 1)对我的服务器执行查询 2)让服务器回答该查询 查询和答案都将是从整数映射到整数列表。
相关:是否有任何组合框架既可以处理查询/响应协议又可以管理传入查询(将它们放入队列中)?
我不知道我是否应该将它实现为普通的守护程序或 Web 服务。Web 服务似乎更灵活,因为它可以相对容易地移动到另一台机器上,但普通的守护进程听起来更快。
以灵活性为代价,守护进程在短期内会更快。守护程序的优点是您可以以紧凑的形式将回复发送回,在您的情况下作为二进制整数值流。这将尽可能快。
如果请求数量增加超过一定限制,您可以使用带有轮询的 DNS将负载分散到多台机器上,因此使用 HTTP 服务器没有任何优势。
主要缺点是您无法轻松调试此接口(对于大多数 Internet 协议,您只需 telnet 到服务器侦听的端口并运行几个命令即可查看结果)。此外,如果您出于任何原因必须更改界面,您也必须更改每个客户端。当您需要在其他地方使用此服务时,情况会变得更糟,例如在mashup中。
所以如果你想要更灵活,可以使用 HTTP 和 JSON 之类的协议作为数据格式。这不像二进制那么紧凑,所以回答时间会更糟。差多少取决于数据的大小。如果您可以将 JSON 编码的响应放入标准 IP 包(大约 1500 字节)中,您可能不会注意到差异。
我知道这是一个一般性的答案,但是您说的是守护程序和 Web 服务之间的毫秒差异。
话虽如此,请使用更灵活的架构。好的设计将远远超过你用来执行它的技术。
如果几毫秒真的很重要,那么问题不在于使用哪种技术,而是如何使用缓存和负载平衡来扩展它。
如果你开发一个守护服务器,你提供给客户端连接的接口是什么?您将实现套接字或 RMI 或其他东西。在可扩展性方面不是一个非常灵活且易于维护的解决方案。
使用网络服务。
除非您尝试过多种方法,否则您不会知道哪种方法“更好”。最好的方法是制作每个原型,然后尝试一下!它甚至不需要做所有你想做的事情,只需要做一些基本的事情(比如返回预定义的数据),你可以对它进行负载测试,看看哪个更好。
我怀疑这些天,现代机器的运行速度足以让 http 运行得相当好,而且由于更加标准化,其他服务可以利用您的服务器而无需专门的客户端。
您可以为此关注领导者和用户 HTTP :)
例如在他们的 AJAX API 中,他们将它与 JSON 结合使用(或者是纯 javascript?)
这是一个例子。
对于以下查询:
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,您可以在经过超级测试的协议上进行中继。
如果性能是一个很大的问题,我怀疑您很需要使用某种集群解决方案网格。不久前我写了一篇关于 Java 网格/集群库的概述,这是有用的背景。
如果商业软件是一个选项,我建议查看 GigaSpaces(或者一些免费软件 JavaSpaces 实现,如果不是)。它可以让你做:
GigaSpaces(以及任何真正的网格/集群技术)可以很好地扩展。比纯队列解决方案要好得多,后者要么不能随发布-订阅(因为所有侦听器都会收到消息;通常不是您想要的)或请求-响应(您必须确保队列没有被阻止一个坏消息)。
您没有提到服务器使用的是什么技术。如果它是Java,那么你就可以了。如果没有,它会变得更有趣。如果是这种情况,您可能需要考虑使用Google Protocol Buffers构建一些东西,这是一种高性能二进制交换格式,受 Java、C++ 和可能的其他平台支持。
就我个人而言,我不是 Web 服务的忠实拥护者,因为它们不是事务性的(从某种意义上说,它们不能参与分布式事务)。这对你来说可能是也可能不是问题。此外,不同技术栈(例如 Java 和 .Net)之间的互操作性充其量仍然是个问题。