Rust不适合开发Web API

{"type":"doc","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"Rust是一门神奇的编程语言,有非常好的CLI工具,比如"},{"type":"link","attrs":{"href":"https:\/\/github.com\/BurntSushi\/ripgrep","title":null,"type":null},"content":[{"type":"text","text":"ripgrep"}],"marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}]},{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"和"},{"type":"link","attrs":{"href":"https:\/\/github.com\/ogham\/exa","title":null,"type":null},"content":[{"type":"text","text":"exa"}],"marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}]},{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"。像Cloudflare这样的公司正在使用并"},{"type":"link","attrs":{"href":"https:\/\/blog.cloudflare.com\/tag\/rust\/","title":null,"type":null},"content":[{"type":"text","text":"鼓励人们写Rust"}],"marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}]},{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"来运行微服务。Rust编写的软件可能比C++或C更安全、更小、更简洁。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"如果我正在编写一个地理编码器、一个路由引擎、一个实时消息平台、一个数据库或一个CLI工具,Rust最合适。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"但去年,我试图用Rust写一个传统网站的纯API服务,Rust就不合适了。"}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"缺失很多小功能"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"Rust有大量的Web服务框架、数据库连接器和解析器。但搭建身份验证服务方面只有非常低层次的组件。Node.js有"},{"type":"link","attrs":{"href":"http:\/\/www.passportjs.org","title":null,"type":null},"content":[{"type":"text","text":"passport.js"}],"marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}]},{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":",Rails有"},{"type":"link","attrs":{"href":"https:\/\/github.com\/heartcombo\/devise","title":null,"type":null},"content":[{"type":"text","text":"devise"}],"marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}]},{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":",Django有"},{"type":"link","attrs":{"href":"https:\/\/developer.mozilla.org\/zh-CN\/docs\/Learn\/Server-side\/Django\/Authentication","title":null,"type":null},"content":[{"type":"text","text":"开箱即用的身份验证模型"}],"marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}]},{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":",在Rust中,你需要学习如何将共享Vec转换到底层加密库才能构建这个系统("},{"type":"text","marks":[{"type":"color","attrs":{"color":"#a5a5a5","name":"user"}}],"text":"译者注,Vec是一个动态数组,只会自动增长而不会自动收缩。区别于Array,Vec具有动态的添加和删除元素的能力,并且能够以O(1)的效率进行随机访问。Vec的所有内容项都是生成在堆空间上的,可以轻易的将Vec移出一个栈而不用担心内存拷贝影响执行效率,毕竟只是拷贝栈上的指针"},{"type":"text","text":")。有些库试图解决这个问题,比如"},{"type":"link","attrs":{"href":"https:\/\/github.com\/breard-r\/libreauth","title":null,"type":null},"content":[{"type":"text","text":"libreauth"}]},{"type":"text","text":",但它才刚刚开始开发。还有很多类似的Web框架问题。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"SDK呢?在主流编程语言中,你可以通过一个官方库来接入Google云服务、AWS或Stripe。这些官方库大都很棒。例如,"},{"type":"link","attrs":{"href":"https:\/\/aws.amazon.com\/sdk-for-javascript","title":null,"type":null},"content":[{"type":"text","text":"aws-sdk-js"}],"marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}]},{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"和"},{"type":"link","attrs":{"href":"https:\/\/stripe.com\/docs\/libraries","title":null,"type":null},"content":[{"type":"text","text":"Stripe"}],"marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}]},{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"库的设计和维护得非常好。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"Rust就不这样,只有少许第三方库,但以这些服务的开发速度,它们真的能够提供高质量的体验吗?"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"有人会说好吧,X编程语言太好了,你可以在周末自己写一个SDK!我必须回答,不。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"Rust的生态系统在其它领域非常丰富。用于构建CLI、管理并发性、使用二进制数据和底层解析器的crates令人印象深刻,非常棒。"}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"Rust编译器比以前快,但仍然很慢"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"我一直在看"},{"type":"link","attrs":{"href":"https:\/\/blog.mozilla.org\/nnethercote\/2020\/09\/08\/how-to-speed-up-the-rust-compiler-one-last-time","title":null,"type":null},"content":[{"type":"text","text":"Nicholas Nethercote"}],"marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}]},{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"的博客,描述了Rust团队如何优化编译器,让它更快!"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"但与其它编程语言相比,用它构建网站会很慢。它比编译型编程语言Go慢得多,也比解释型编程语言JavaScript、Ruby和Python等慢得多。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"一旦代码被编译,一切就变得非常棒了!但在我的情况下,甚至基本API功能都不完整,一个不复杂的系统——居然花了10多分钟来编译。"},{"type":"link","attrs":{"href":"https:\/\/cloud.google.com\/cloud-build","title":null,"type":null},"content":[{"type":"text","text":"Google代码构建"}],"marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}]},{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"的硬件配置很差,每次都会超时,我啥都编译不了。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"只要不重建缓存依赖项,缓存就有意义。也许"},{"type":"link","attrs":{"href":"https:\/\/blog.kodewerx.org\/2020\/06\/the-rust-compiler-isnt-slow-we-are.html","title":null,"type":null},"content":[{"type":"text","text":"减少依赖"}],"marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}]},{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"会加快Rust项目编译。但就像"},{"type":"link","attrs":{"href":"https:\/\/serde.rs\/","title":null,"type":null},"content":[{"type":"text","text":"serde"}],"marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}]},{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":",几乎所有人都使用的JSON和其它序列化\/反序列化程序占用了大量的编译时间。我们是否应该用编译速度更快但缺乏大量文档和生态系统支持的东西来取代serde?这种取舍非常糟糕。"}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"Rust很复杂"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"Rust让你从代码维度进行思考,这对系统编程来说非常重要。它让你思考如何共享或复制内存,思考真实但不太可能的小概率事件,并确保妥善处理它们,帮你编写各种各样的高效代码。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"这些担忧都是合理的,但是对于大多数Web应用程序来说,它们并不是最重要的关注点,以流行的惯性思考会导致不正确的假设。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"就拿Rust的安全性来说吧。这是它宣传语中的重要部分,这是绝对正确的:Rust的承诺安全和底层两者兼而有之——它可以在没有垃圾收集器的情况下工作,同时防止基于内存的漏洞。当你读到“安全”的时候,想想Rust的竞争对手C吧。C语言中的代码可以引用任意内存,很容易溢出和出错。Rust代码可以和C代码一样快,但是可以保护内存访问,而不需要垃圾收集器或某种运行时检查。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"但是Rust的内存规则并不比Node.js或Python更安全,用Rust编写的Web应用程序在系统上不会比Python或Ruby应用程序安全。带有垃圾收集器的高级编程语言通常为避免这类漏洞利用和错误而付出性能损失。不能在JavaScript中引用未初始化的内存,因为JavaScript中不进行内存间的引用。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"旁注:这是在描述Node.js和其它系统的设计目标——它们确实偶尔会有bug。Node.js的缓存对象,就值得读一读。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"你要是"},{"type":"link","attrs":{"href":"https:\/\/deavid.wordpress.com\/2020\/01\/18\/actix-web-is-dead-about-unsafe-rust\/","title":null,"type":null},"content":[{"type":"text","text":"问一些人"}],"marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}]},{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":",他们会说如果使用不安全的代码,Rust相比带有内存回收的编程语言是不安全的——包括最流行的Web框架Actix(译者注,"},{"type":"text","marks":[{"type":"color","attrs":{"color":"#a5a5a5","name":"user"}}],"text":"Actix是Rust的Actor异步并发框架,基于Tokio和Future,开箱具有异步非阻塞事件驱动并发能力,其实现低层级Actor模型来提供无锁并发模型,而且同时提供同步Actor,具有快速、可靠,易可扩展"},{"type":"link","attrs":{"href":"https:\/\/actix.rs\/","title":null,"type":null},"content":[{"type":"text","text":"https:\/\/actix.rs\/"}]},{"type":"text","text":"),因为"},{"type":"link","attrs":{"href":"https:\/\/doc.rust-lang.org\/book\/ch19-01-unsafe-rust.html","title":null,"type":null},"content":[{"type":"text","text":"不安全代码允许原始指针的延迟"}]},{"type":"text","text":"。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"如果你正在写一个视频游戏,暂停执行垃圾收集是不好的。如果你在编写微控制器代码,任何内存“开销”或浪费都是非常糟糕的。但是大多数Web应用程序可以节省一点内存开销来换取生产性能。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"Rust的其它属性面对的争议几乎一样。它的并发特性是太神奇了,如果你在做一些复杂的事情,需要快速响应,这当然很棒。但如果情况不是这样呢?至少可以说,Rust的异步生态系统面临着很大挑战:各种不相关的领域中有着不同的异步实现,比如"},{"type":"link","attrs":{"href":"https:\/\/tokio.rs\/","title":null,"type":null},"content":[{"type":"text","text":"tokio"}],"marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}]},{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"相比较之下,Python的Tornado和Twisted异步实现的很奇怪,Node.js异步实现的很好,但语法都很丑陋。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"我确信,Rust的异步将会稳定和统一,未来会更容易操作,但我现在就要用啊。"}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"Rust生态系统不是以Web为中心的"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"很多人正在学Rust,用Rust编写CLI应用程序或底层代码,并且玩得非常开心。使用Rust编写普通Web应用程序的人明显少很多。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"这是技术选择中的重要部分:是否有人在使用该工具?他们大致在同一个领域吗?不幸的是,Rust生态系统中许多令人难以置信的令人兴奋的工作与Web应用服务器无关。的确存在一些很有前途的Web框架——甚至更高层次的框架,但毫无疑问,它们市场很小。即使是主要的Web框架Actix也只有几个顶尖贡献者。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"如果Rust以目前的速度增长,那么社区中的Web部分将达到一个临界值,但我认为没有足够多的人使用Rust作为网站的实用工具。与其它社区相比,有很多公司致力于使用现有的工具来构建Web应用程序,这些工具不是最前沿的,但足够将成熟技术与新技术区分开来。"}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"Juniper的N+1次查询"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"这一部分不仅仅是Rust,它还涉及GraphQL生态系统,Rust参与这个生态系统就是一个例子。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"link","attrs":{"href":"https:\/\/www.infoq.com\/articles\/N-Plus-1\/","title":null,"type":null},"content":[{"type":"text","text":"N+1问题"}],"marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}]},{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"是每个构建Web应用程序的人都应该知道的。要点是:你有一页照片(一次查询),你要显示每张照片的作者,会有多少次查询:1,合并照片和作者,或者在检索照片后对每张照片进行查询以获取作者?或者两次,第二次查询ids中的user.id,一次获取所有作者,然后重新设置他们的照片属性。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"N+1查询通常优先使用数据库解决:比如将N+1查询改为单个查询,会带来明显的性能优化。我们有很多方法来尝试和解决这些问题:你可以编写SQL,并尝试使用CTE和JOIN在单个查询中完成大量工作,就像我们在Observable中所做的那样,或者使用像ActiveRecord这样的ORM层将N+1查询转换为可预测查询的快速方法。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"Juniper是一个用于Rust应用程序的GraphQL服务。GraphQL基本上都是由前端应用程序定义查询,而不是后端。给它一系列可以查询的东西,然后应用程序(React或其它)将任意查询发送到后端。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"这会让后端变得复杂。任何SQL级别的优化都不可能做到——你的服务器正在编写动态SQL,优化只能依赖GraphQL服务,但它不会总是有效。例如:Juniper默认情况下执行的是N+1查询,解决方案"},{"type":"link","attrs":{"href":"https:\/\/graphql-rust.github.io\/juniper\/master\/advanced\/dataloaders.html","title":null,"type":null},"content":[{"type":"text","text":"dataloader"}],"marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}]},{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"还比较粗糙且需要单独维护。因此,最终您将拥有一个非常快的应用程序层,但它所有的时间都花在了极其低效的数据库查询上。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"总之,GraphQL与NoSQL数据库配合使用效果非常好,它可以快速为这些类型的请求提供服务。我确信Facebook内部有一些特定的数据库与GraphQL结合在一起使用效果非常棒,但业内其他企业则非常依赖Postgres和同类产品。"}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"一些注意事项"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"首先,本文提到的问题并不针对在通用场景使用Rust,只针对将Rust用于特定目标和生态系统,简单说就是Web API。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"注意事项1:一般情况下,你可以用任何编程语言搭建网站,还记得基于"},{"type":"link","attrs":{"href":"https:\/\/github.com\/OkCupid\/okws","title":null,"type":null},"content":[{"type":"text","text":"C++实现"}],"marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}]},{"type":"link","attrs":{"href":"https:\/\/github.com\/OkCupid\/okws","title":null,"type":null},"content":[{"type":"text","text":"的"}],"marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}]},{"type":"link","attrs":{"href":"https:\/\/github.com\/OkCupid\/okws","title":null,"type":null},"content":[{"type":"text","text":"OkCupid"}],"marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}]},{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"吗?(译者注,"},{"type":"text","marks":[{"type":"color","attrs":{"color":"#a5a5a5","name":"user"}}],"text":"OkCupid是美国一个大型线上交友网站"},{"type":"text","text":")还有一个非常流行的"},{"type":"link","attrs":{"href":"https:\/\/www.costarastrology.com","title":null,"type":null},"content":[{"type":"text","text":"星象应用程序,Co-star"}]},{"type":"text","text":",它全部是用Haskell编写的。如果你擅长其它编程语言,或者可以招聘到擅长这些编程语言的工程师,你一样可以取得成功。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"注意事项2:我试图构建的是重"},{"type":"link","attrs":{"href":"https:\/\/en.wikipedia.org\/wiki\/Create,_read,_update_and_delete","title":null,"type":null},"content":[{"type":"text","text":"CRUD(增删改查)"}],"marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}]},{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"的Web应用程序API。它可能不算是一个Web“服务”——主要是快速、无数次地执行同一个操作,而是一个Web“应用程序”——执行了许多不同的操作,包含了相当多的业务逻辑。如果你要开发的东西跟我在做的不一样,那我的建议可能就不适合你。如果你需要的是快速执行一两个操作,比如你正在写一个支付网关或语音消息应用程序,那Rust可能效果还是不错的。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"注意事项3:这篇文章写于2021年1月,如果接下来社区继续发展,Rust将得到持续的改进,会变得更好并更易于Web应用程序开发。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"总而言之,我真的很喜欢使用Rust,这是一门美丽的编程语言,有很多很酷的想法。希望很快,Rust会成为能用来构建我想做的东西的最合适的工具。不过,现在我想做的很多东西都要采用不同特性的编程语言才能更好地运行。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}},{"type":"strong"}],"text":"英文原文链接:"},{"type":"link","attrs":{"href":"https:\/\/macwright.com\/2021\/01\/15\/rust.html","title":null,"type":null},"content":[{"type":"text","text":"https:\/\/macwright.com\/2021\/01\/15\/rust.html"}],"marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}]}]}]}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章