我的任务是为我们公司研究一个全栈解决方案,我们将使用NoSQL数据库后端。它很可能是从数据仓库和/或某种类型的操作数据存储中以近乎实时的方式提供的(希望是:)。它将主要由我们的移动和web应用程序通过REST.使用
一些要求/假设:
- 它将是只读的(短期内),并由客户端以REST格式使用
- 它必须是可扩展的
- 快速响应时间
- 企业支持——或者如果缺乏实际支持,如果开源(基本上是管理层想要持有的如果堆栈中的某个东西出现故障,则有人负责)
- 最少的客户端数据转换-即:数据应存储在尽可能接近随时可用的格式中
- 最有可能需要某种类型的服务API管理(例如:3规模)
- 服务将在内部使用,但解决方案不应阻止我们将其作为长期目标对外公开
- 最好提供微服务(前提是API有足够的管理)
- 我们的移动/门户解决方案拥有Java和Grails方面的内部专业知识
我抛出的一些选项是:
- CouchDB:固有地返回REST-不需要转换层-作为只要客户说REST,我们都很好
- MongoDB:在客户端和DB之间需要一个REST层-根据我的调查,还没有找到一个广泛使用的层(Mongo网站上的那些似乎都还处于起步阶段,即:RestHeart)
我有一些问题:
- 我需要一个应用服务器吗?或者客户端和数据库之间的任何层出于性能/缓存原因?我在想一个反向代理nginx会是个好主意吗
- 如果CouchDB支持开箱即用的REST,为什么不在这个解决方案中使用它呢
我正在努力决定使用哪一个NoSQL数据库,是否需要REST翻译层、appserver等。我已经阅读了每一个的优缺点,他们大多说去Mongo,但对于我试图做的事情,缺乏成熟的REST层是令人担忧的。
我只是在寻找一些想法、技巧和经验教训,任何人都愿意分享。
谢谢!
将数据库直接暴露给客户端的问题是,大多数数据库都不支持权限控制,因为权限控制可以像您希望的那样细粒度。您通常不允许客户端查看和编辑自己的数据,同时也禁止它查看和编辑其他用户的任何数据,甚至更糟的是,禁止它从服务器本身查看和编辑任何数据。至少当您仍然想要一个健全的数据库模式时不会。
您还经常会发现,您有一个包含多个字段的文档,其中只有一些字段应该由用户控制,而其他字段则不受用户控制。例如,我可以编辑这个答案的内容,但我不能编辑它发布的时间、发布的名称或投票分数。到目前为止,我从未见过一个数据库系统可以处理单个字段的权限(当任何人都有权限时:请随意在评论中发布)。
您可能会考虑在客户端上尝试处理此问题,但不提供任何用于编辑所述字段的用户界面。但这只能在一个值得信赖的环境中发挥作用。当您有不受信任的用户时,他们可以创建客户端应用程序的克隆,从而公开此功能。你无法区分真正的客户端和克隆,尤其是当你没有智能应用程序服务器时(即使在那时,这实际上也是不可能的)。
出于这个原因,几乎总是需要在客户端和数据库之间有一个应用程序服务器,该服务器处理客户端的身份验证和权限管理,并且只将那些请求转发到允许的持久层。
我完全同意@Philipp的回答。在使用CouchDB的情况下,您至少需要在前面使用代理服务器来启用SSL。
CouchDB几乎可以满足您的所有需求。特别是即将推出的v2将满足您的"数据中心需求"。
但是,要回答什么应该是适合你的工具是非常复杂的。如果您有一些业务模型需求,比如说:节流,那么您肯定需要一个应用程序服务器中间件,比如http://mcavage.me/node-restify/
也许花点钱给像这样的专业人士是个好主意http://www.neighbourhood.ie/couchdb-support/?(我没有参与)