【问题标题】:ArangoDB Foxx as a REST back-endArangoDB Foxx 作为 REST 后端
【发布时间】:2016-05-25 22:55:01
【问题描述】:

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

.

问题本身:

应该并且可以使用 arangodb + foxx 创建完整的后端堆栈以提供 REST API,从而避免堆栈中的另一个层/组件?例如express/hapi/loopback 等。

.

主要后端要求:

  • 使用角色进行身份验证
  • 会话
  • 加密
  • 复杂的查询(我最初的想法是为了避免 DB 和后端之间的多跳)
  • 条目解析、验证和清理
  • 计划任务

.

主要找:

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

.

附带问题(可能会回答上述部分问题):Foxx 能否利用一些可通过 npm 获得的节点中间件?

提前感谢您的宝贵时间!

【问题讨论】:

  • 嘿@GRE2608,您发现我的回答很有用,您能否将其标记为已接受以关闭此问题?或者您还需要我在我的回答中解决什么问题才能被接受?

标签: rest arangodb foxx


【解决方案1】:

您可以使用 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、promise),它们可能与 Foxx 兼容。许多实用程序库(如 lodash)完全没有问题。即使您发现某个模块不起作用,也可以为它编写一个适配器,就像我们使用 mocha(集成到 Foxx)和 GraphQL(通过 NPM 上的 graphql-sync 包)所做的那样。

根据我的经验,将 Foxx 服务置于 Node.js 薄层(例如,一个简单的快速应用程序,主要代理您的 Foxx API)和/或将后端的某些部分委托给可以通过 HTTP 集成到 Foxx 中的独立 Node.js 微服务(例如与电子邮件或 LDAP 等非 HTTP 服务集成)。

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

【讨论】:

  • 谢谢艾伦!在考虑了你所有的笔记之后,我将继续构建基本的应用程序组件,希望在我们需要深入了解核心细节的时候,v3 已经在稳定的分支中了。尽管如此,你在 Arango 前面的瘦 nodejs 层的概念确实是一个很好的方法,因为很可能会有其他非 DB 相关的微服务需要实现。在您的最后一条评论中,您知道 v3 是否会带来 native 异步,还是仅与异步中间件兼容?
  • @GRE2608 只是为了澄清这一点:Foxx 默认情况下明确不兼容任何异步。然而,许多 express 中间件实际上并不依赖于异步行为,因此通常可以简单地与 Foxx 一起使用。
【解决方案2】:

我刚刚开始将我的sails 应用程序移植到一个FOXX 应用程序,这样我就可以回答你的一些问题了。

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

对于授权和会话,我会查看位于以下位置的 FOXX 示例:FOXX authorization-session example

不清楚您对加密的要求是什么。如果您谈论的是 SSL 连接,那么它是本机支持的(请参阅 arangodb 端点)。至于内部加密,有一个javascript加密模块ArangoDb crypto

javascript joi包支持入口验证等。

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

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

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

【讨论】:

  • 谢谢你ggendel!请通过这个问题让我们了解当您完成移植后事情会如何发展。
  • sails 应用程序(仍处于原型形式)已完全移植到 Foxx。底线,没有重大的代码更改主要将sails/arangojs 查询更改为Foxx 查询,Foxx 明显更快。一个测试用例在风帆中花费了 3.5 小时,在 Foxx 中花费了 29 分钟(加速了 7 倍)。由于 AQL 调用几乎相同,因此我必须将其归结为网络流量并在 Sails 端重新处理数据。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-27
  • 1970-01-01
相关资源
最近更新 更多