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