Ruby on rails 去还是不去

Ruby on rails 去还是不去,ruby-on-rails,ruby,performance,json,api,Ruby On Rails,Ruby,Performance,Json,Api,我的公司有一个巨大的数据库,可以从多个来源获取(许多)事件,用于监控和报告目的。到目前为止,数据中的每一个新的仪表板或图形都是一个新的Rails应用程序,在庞大的数据库中有额外的表,可以完全访问数据库内容 最近,有一种想法在我们的数据上有外部(不是我们的公司,而是姐妹公司)客户,并且已经决定我们应该公开一个只读的RESTful API来查阅我们的数据 我的观点是——我们是否也应该为自己的项目使用API?即使对于“本地”项目,访问RESTful API,而不是直接访问数据库,这是否过火了?我认为这

我的公司有一个巨大的数据库,可以从多个来源获取(许多)事件,用于监控和报告目的。到目前为止,数据中的每一个新的仪表板或图形都是一个新的Rails应用程序,在庞大的数据库中有额外的表,可以完全访问数据库内容

最近,有一种想法在我们的数据上有外部(不是我们的公司,而是姐妹公司)客户,并且已经决定我们应该公开一个只读的RESTful API来查阅我们的数据

我的观点是——我们是否也应该为自己的项目使用API?即使对于“本地”项目,访问RESTful API,而不是直接访问数据库,这是否过火了?我认为这将在统一我们团队对数据的访问方面获得回报——但这值得额外的往返吗?RESTful API能否满足每秒运行20个左右查询并通过JSON公开结果的要求


谢谢你的意见

我认为要保持一致性还有很多话要说。如果你正在为你的客户提供一个API,在我看来,通过使用相同的API,你会更好地理解它。为您的客户支持它,您将定期测试它(在回归测试之外),并且您正在发送一条消息,表明它足够好,可以使用,因此它对您的客户应该是好的

通过隐藏API背后的所有内容,您可以自由更改数据库表示,而不必同时更改API接口代码(通过API显示数据)和内部应用程序中的数据库访问代码。你只会改变前者


最后,这些性能问题实际上只能通过尝试和测量来解决。也许值得拼凑一个原型API系统并在负载下研究它?

此外,如果您在内部使用API,那么您应该能够减少需要维护的代码量,因为您将只维护API,而不是API和您自己访问数据的内部方法

我肯定会走API路线。这为所有与应用程序对话的应用程序提供了一个易于维护的界面,包括验证等。当然,您可以通过列限制和存储过程来确保数据库的完整性,但为什么还要维护呢

别忘了——您还可以在文件系统、内存或使用memcached(或任何其他服务)缓存API调用。在数据集未更改的地方(使用更新的_at或etag进行检查),您可以简单地返回缓存版本以获得极大的速度改进。在我最近开发的一个应用程序中添加ETag,HTML加载时间从1.6秒增加到60毫秒


离题:我一直在考虑的一个想法是根据请求动态加载API版本。类似这样的东西将使您能够在保持向后兼容性的同时显著更改API。由于不同的版本在不同的文件中,所以单独维护它们会很简单。

对于我即将开始的项目,我一直在考虑同样的事情,我是否应该从头开始构建Rails应用程序作为API的客户端。我同意这里已经提到的优点,我将重述并补充:

  • 更好的API设计:您将成为API的用户,因此当您决定打开API时,它将更加完善
  • 数据库独立性:通过减少耦合,您可以稍后从RDBMS切换到文档存储,而无需进行太多更改
  • 可比性能:性能可以通过HTTP缓存解决(尽管我希望看到一些数字将两者进行比较)
除此之外,您还可以获得:

  • 更好的可测试性:您的整个业务逻辑可以通过基本的HTTP重新请求/响应进行黑盒测试。无头浏览器/Selenium只对特定于应用程序的行为负责
  • 前端独立性:您不仅可以自由地更改数据库表示,还可以自由地更改整个前端,从带有HTML和页面重新加载的普通Rails,到Spreaded Ajax,再到完全成熟的纯javascript(例如with),所有这些都共享相同的后端

批评

我最初看到的这个方法的一个问题是,它会让我失去ActiveRecord提供的所有便利和灵活性,包括关联、命名的_范围等等。但通过ActveResource使用API带来了很多好东西,而且看起来您也可以使用它。我不确定有什么关联

更多批评,请


我们都在为这种方法唱赞歌,但是,尽管已经找到了答案,我还是想听听其他人的意见,这种方法可能会带来什么问题,以及为什么我们不应该使用它。

+1用于解决缓存和ETag的性能问题。+1也是一条有趣的评论;)一个主要的批评(或者更可能是一个主要问题)可能是安全方面