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"}}]}]}]}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章