Ruby on rails 针对数据密集型应用程序的RESTful web服务与套接字编程
我正在用RubyonRails构建一个web应用程序,它需要具有高度的可伸缩性。在此应用程序中,数据由移动客户端每秒生成(约20字节)。所有这些数据都必须在某个时候传输到服务器,最好尽快传输 为了完成这项任务,我希望服务器充当RESTful服务。客户端可以缓冲位置(比如每5到30秒一次),然后将它们作为HTTP put请求发送出去,然后服务器可以将它们存储在那里。我相信这个模型更容易实现,并且更好地处理高容量的流量,因为客户端可以一直缓冲数据,直到听到服务器的响应为止 另一方面,我的老板希望使用套接字编程实现服务器。他相信socket编程将减少数据传输,从而提高系统的总体效率。我不能不同意这一点,但我认为考虑到现代带宽,HTTP的额外开销是值得的。另外,我认为尝试与用户同时保持数千(或数百万)个连接会导致自身的问题,并大大增加服务器的复杂性 老实说,我不知道解决这个问题的正确方法,所以我想我应该把它贴在这里,征求比我聪明得多的人的意见。如果有任何答案包括建议解决方案的利弊,我将不胜感激 谢谢 更新Ruby on rails 针对数据密集型应用程序的RESTful web服务与套接字编程,ruby-on-rails,sockets,networking,rest,architecture,Ruby On Rails,Sockets,Networking,Rest,Architecture,我正在用RubyonRails构建一个web应用程序,它需要具有高度的可伸缩性。在此应用程序中,数据由移动客户端每秒生成(约20字节)。所有这些数据都必须在某个时候传输到服务器,最好尽快传输 为了完成这项任务,我希望服务器充当RESTful服务。客户端可以缓冲位置(比如每5到30秒一次),然后将它们作为HTTP put请求发送出去,然后服务器可以将它们存储在那里。我相信这个模型更容易实现,并且更好地处理高容量的流量,因为客户端可以一直缓冲数据,直到听到服务器的响应为止 另一方面,我的老板希望使用
我们现在有一些额外的要求。首先,移动客户端每月上传的数据不能超过5 GB。在这种情况下,我们每月每天八小时,每秒只讲一条消息。第二,我们希望用户尽可能少地组合消息。这是为了确保如果移动客户端出现问题(比如车祸),我们会丢失尽可能少的数据。您的老板似乎过早地进行了优化,这不是一个好主意 在开始编写代码之前,您应该检查应用程序的需求,并根据需求进行设计,而不是试图与一个虚构的性能恶魔作斗争。不要让感知到的问题驱动你的设计 如果是这样的话,让你的老板准确地描述一下他是如何通过套接字连接封送数据的,然后做一些快速计算,看看你是否能用HTTP匹配或击败他们。他会使用谷歌的协议缓冲区,还是编写自己的封送协议?如果是的话,它会自我描述吗?应用程序“动词”怎么样,比如在HTTP中免费获得的?他的关系会持续吗?“sockets”不仅仅是打开一个连接并将字节从中释放出来 您还正确地注意到,您的老板似乎更喜欢套接字的原始速度,而不是其他一切:可伸缩性、可维护性、开发和测试工具的可用性、协议嗅探器、HTTPS动词的有用语义,等等。HTTP被负载均衡器和防火墙等很好地理解。您的专有套接字协议将不会如此幸运 我建议您研究所有的选项,并通过测试、原型设计和基准测试从性能角度对其进行评估。然后将这些数字与使用该技术构建和维护应用程序的难度进行权衡。坚持使用HTTP 创建一个HTTP服务器园区并将它们放在负载平衡器后面要比尝试为您自己的协议做同样的事情容易得多。为什么?HTTP的所有内容都已存在 更新 您需要自己重新实现的内容:
- 缓冲区管理(如果负载较高,则很重要)
- 确保您已收到完整的消息(一个简单的
/Receive
是不够的)BeginReceive
- 异步套接字处理
- 认证
- 负载平衡器(这部分比较复杂,需要仔细设计)
- 您自己的协议(您需要一种方法来识别何时收到整个消息)
[Authorize]
属性标记它什么最便宜?服务器还是让你花一个月的时间做已经完成的事情?你的老板和你都是对的,正确的选择取决于业务需求:你需要多久才能扩展规模 如果你是一家刚起步的公司,正在推出一项新服务,你担心自己无法在3个月内管理数百万新用户,那么@Brian Kelly是对的——这是过早的优化。OTOH,如果你是Twitter,你正在建立一个新的基于位置的服务,那么规模是你应该处理的首要问题。如果你介于两者之间,那么,这是你的事——做出选择 使用Rails构建RESTful web服务既快速又简单,从移动客户端调用它也很简单(尽管移动客户端上的缓冲确实需要更多代码)。在您的案例中,这是该方法的主要(也是唯一的imho)优势,也是一个巨大的优势 然而,HTTP确实增加了很多开销。如果消息长度为20字节,那么实际上每条消息的开销是有效负载的几倍。这意味着更多的网络带宽和更多的CPU时间。是的,您可以添加更多的服务器来处理它,但这将花费您的成本-需要多台服务器来完成一台服务器可以完成的工作 如果您的服务刚刚从移动客户端接收到非常短的消息,如果它失去了偶尔的消息,那么我会考虑使用UDP。你的20个字节应该放在一个包里。这比TCP的几种协议节省了很多