Chr*_*ler 5 javascript arangodb foxx
为什么新的JavaScript模块请求同步?它应该只用在作业队列中吗?
有没有办法在ArangoDB中发出异步http(s)请求?
完全披露:我是ArangoDB开发团队的一员,主要负责Foxx和所有JavaScript.我也是编写org/arangodb/request模块的人.
ArangoDB是一个与Node.js不同的环境,尽管有许多相似之处(例如使用V8 JavaScript引擎).与Node.js(或浏览器)不同,ArangoDB使用基于线程的并发模型,并且没有事件循环.但是线程不会在JavaScript中公开(实际上在V8中,每个线程都是完全隔离的),所以通常你甚至不必考虑它们.
在浏览器和Node.js函数中setTimeout,通过事件循环延迟代码执行(直到经过一定的时间或直到外部事件发生).
在ArangoDB中,代码总是线性执行.例如,传入的HTTP请求以JavaScript的形式传递给Foxx控制器,并在控制器返回后立即发送响应.即使您可以使用setTimeout,您正在使用的外部资源(甚至是"内部"资源,如文档集合和事务)在延迟代码执行时可能已经消失.
因此,模块request提供的功能org/arangodb/request也完全同步.它不是返回一个promise或进行回调,而是直接返回传入的响应数据.它也绝对不是与requestnpm 相同的模块,而是基于该模块的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答案的修正:遗憾的是,承诺不会让你在同步环境中编写异步代码.的承诺/ A +规范承诺定义为具有要异步执行的.如果他们不是原生支持,他们仍然要对现有的类似功能上方内置setTimeout或者process.nextTick,两者都不ArangoDB工具.
| 归档时间: |
|
| 查看次数: |
451 次 |
| 最近记录: |