为什么org / arangodb /请求是同步的?

时间:2015-03-19 16:29:39

标签: javascript arangodb foxx

为什么新的JavaScript模块request是同步的?它应该只用在作业队列中吗?

有没有办法在ArangoDB中发出异步的http(s)请求?

1 个答案:

答案 0 :(得分:6)

完全披露:我是ArangoDB开发团队的一员,主要负责Foxx和所有JavaScript。我也是撰写org/arangodb/request模块的人。


ArangoDB是一个与Node.js不同的环境,尽管有许多相似之处(例如使用V8 JavaScript引擎)。与Node.js(或浏览器)不同,ArangoDB使用基于线程的并发模型,并且没有事件循环功能。但是线程没有在JavaScript中公开(事实上在V8中,每个线程都是完全隔离的),所以你通常不必考虑它们。

在浏览器和Node.js函数中,setTimeout等函数通过事件循环延迟代码执行(直到经过一定时间或发生外部事件)。

在ArangoDB中,代码总是线性执行。例如,传入的HTTP请求以JavaScript的形式传递给Foxx控制器,并在控制器返回后立即发送响应。即使您可以使用setTimeout,您正在使用的外部资源(甚至是#34;内部"类似于文档集合和事务的资源)在延迟代码执行时可能已经消失

因此,request模块提供的org/arangodb/request函数也完全同步。它不是返回一个promise或进行回调,而是直接返回传入的响应数据。在npm上它也明确地request相同的模块,而是基于该模块的API的同步实现,以便在Node.js之外实现其API。 (例如,不包括流并返回远程响应而不是回调)。

如果你来自Node.js / io.js背景,这可能会有误,因为非阻塞IO可以实现更高的吞吐量,但请记住,ArangoDB和Node.js的设计目标是非常不同的。 Node.js是围绕流和网络连接构建的。 ArangoDB是作为持久性数据存储而构建的,它必须处理事务和锁定。

如果您很可能出现严重的网络延迟,或者外部API的响应对客户端响应不重要,那么直接从Foxx控制器访问外部API可能不是最佳选择。这就是Foxx队列的用途。交易电子邮件就是一个很好的例子。

虽然Foxx非常通用,但其主要关注点是允许您将大部分应用程序(尤其是靠近数据运行的逻辑)直接移动到数据库中。对于中小规模的项目,您可以放弃进行外部API调用入站。但是,如果您的应用程序主要关注通过网络与其他服务进行通信,那么在数据库中运行该代码可能不是最佳解决方案。

幸运的是ArangoDB可以很好地与其他人一起使用,因此如果您发现它在高负载下成为性能瓶颈,那么很容易将您的网络密集型代码移出Foxx。 Foxx并没有消除对应用程序服务器的需求,但它可以大大降低其复杂性。


作为对Brian回答的修正:遗憾的是,承诺不会让您在同步环境中编写异步代码。 Promises/A+ spec将promises定义为必须异步执行。如果它们不受原生支持,它们仍然必须建立在现有功能之上,例如setTimeoutprocess.nextTick,这两种功能都不是ArangoDB实现的。