ArangoDB Foxx作为REST后端

时间:2016-05-25 22:55:01

标签: rest arangodb foxx

我正在开发一款可以从Arangos的多模型功能中获益的应用程序。考虑到应用程序对后端的需求,我得出结论,大多数(如果不是全部)可以通过REST API提供,以帮助更清洁的设计,以便将来开发和与其他人集成。然后,API将由几个Web和移动前端框架使用,以处理其余的逻辑。使用NodeJS生态系统,将使用Javascript为整个堆栈开发项目。

问题本身:

是否应该使用arangodb + foxx创建完整的后端堆栈以提供REST API,从而避免堆栈中的其他层/组件?例如express / hapi / loopback等。

主要后端要求:

  • 使用角色进行身份验证
  • 会话
  • 加密
  • 复杂查询(我最初的想法的根源,以避免数据库和后端之间多次跳跃)
  • 条目解析,验证和清理
  • 预定任务

主要寻找:

  • 已知的设计优势
  • 已知设计限制
  • “隐藏”瓶颈
  • 其他可能的未来遗憾

附带问题(可能会回答上述问题):Foxx可以利用npm提供的一些节点中间件吗?

提前感谢您的时间!

2 个答案:

答案 0 :(得分:4)

您可以使用ArangoDB Foxx作为应用程序的唯一后端,但在执行此操作时,请务必记住Foxx的限制(与Node.js等通用JS环境相比)。

你提到加密。虽然ArangoDB确实支持一些加密(例如HMAC签名和密码的PBKDF2密钥派生),但支持并不像Node.js那样详尽和可扩展。此外,当使用计算上昂贵的加密时,这将影响数据库的性能(因为与Node.js不同,Foxx严格同步,因此所有操作都应被视为阻塞)。

ArangoDB不支持开箱即用的基于角色的身份验证,但使用Foxx在ArangoDB中实现它是完全合理的(就像你在Node.js中实现它一样,除非你不需要离开数据库)。

对于会话,通常有两种可能的方法:您可以使用带有会话文档的集合(使用ArangoDB作为会话后端),也可以使用签名令牌保持您的服务无状态(Foxx带有开箱即用的JWT支持)。

复杂/存储查询和输入验证(使用最初为hapi编写的joi模式库)实际上是Foxx的一些主要用例,所以那些不应该是任何问题。

Foxx有自己的排队任务机制,也可以提前安排或定期重复。但是,根据您的要求,外部作业或消息队列可能更适合。好处是您可以立即开始使用内置作业队列,如果在开发过程中出现需要,仍可继续使用专用解决方案。

至于中间件和NPM包:Foxx与Node.js代码不完全兼容。虽然我们提供了大量兼容性代码并尝试尽可能保持核心模块兼容,但一个很大的区别是Node.js通常用于执行异步操作,而在ArangoDB中所有操作都是同步的。

如果你有Node.js模块不使用加密,文件或网络I / O并且不使用异步API(例如setTimeout,promises),那么它们可能与Foxx兼容。像lodash这样的很多实用程序库都没有任何问题。即使您发现模块不起作用,也可以为它编写适配器,就像我们使用mocha(集成到Foxx)和GraphQL(通过NPM上的graphql-sync软件包)一样。

根据我的经验,将你的Foxx服务放在一小块Node.js(例如一个简单的快速应用程序,主要只代理你的Foxx API)和/或委托你后端的某些部分是一个很好的方法。独立的Node.js微服务(例如与非HTTP服务集成,如电子邮件或LDAP),可以通过HTTP集成到Foxx中。

还有一件事:由于特定于节点的依赖关系和异步逻辑,许多现有的快速中间件可能与Foxx不兼容,ArangoDB 3将带来一个新版本的Foxx,支持使用功能表达的中间件兼容的API。

答案 1 :(得分:3)

我刚开始将我的风帆应用程序移植到FOXX应用程序中,所以我可以回答你的一些问题。

ArangoDB中基于角色的授权可能比您想要的级别高。在我们的例子中,我们使用外部服务在非常细粒度的级别(远低于顶点或边缘)授权各种基于Web和服务的应用程序。我的感觉是,该级别的授权将要求您自己在javascript中编写它。如果它只是基于每个集合的CRUD,那么它不需要太多努力。

对于授权和会话,我会查看在FOXX authorization-session example

找到的FOXX示例

目前尚不清楚您对加密的要求。如果您正在谈论SSL连接,那么本机支持(参见arangodb端点)。至于内部加密,有一个javascript加密模块ArangoDb crypto

javascript joi包支持条目验证等。

复杂的查询...在ArangoDB版本3.x中绝对变得更好。遍历可以链接(使用一个边缘集合向下,然后使用另一个边缘集合)。

在考虑效率时,你是正确的。这是我们从帆到FOXX的主要原因。在我们的示例中,我们根据外部服务的权限过滤查询结果。这意味着如果客户端指定了这些属性,我们就无法使用ArangoDB本机跳过和限制支持。在风帆中,我们必须将结果带回块并收集,直到我们达到适当的跳过并限制值。通过转移到FOXX,我们节省了大量的网络和其他资源。我们通过向我们的原型FOXX实现转发请求来测试这一点。这比帆后处理设置要好得多。

您可以使用有限制的NPM模块。见Javascript Modules