【Rust日报】 2019-05-18:使用 Rust 來加速 Elixir 服務1100萬用戶

finshir - 一种 Low&Slow 流量产生器

Low&Slow 是一种DDos攻击方法,利用产生大量的慢请求来保持住对服务器资源的消耗,从而影响正常请求的访问。finshir 就是这样一种用Rust写的工具。有两点高光:

  1. 使用了 may,对,就是黄旭东大佬的May协程库
  2. 可以配合 Tor 使用,实现匿名性

Repo

有下列特點 coroutines 驅動,底層、慢速、可自定義

Read more

rust 1.36.0 加入了Cargo流水線加速編譯技術

利用下圖的方式加速

代码语言:javascript
复制
[-libA----|--------]
          [-libB----|--------]
                             [-binary-----------]
0s        5s       10s       15s                25s

Cargo在内部构建了一个DAG来表示crate之间的依赖关系,通常需要等待crate依赖关系构建完成才会启动编译,但是现在对Cargo进行了优化,现在只要得到编译器为了开始下一次编译而生成的“元数据”即可开始编译,这就是所谓的「流水线(pipeline,就像工厂流水线一样,节省加工时间)」加速编译技术。

  • Reddit 讨论
  • Read More

serde-wasm-bindgen:让wasm-bindgen支持serde

cloudflare出品

serde-wasm-bindgen

貢獻你的新版 await 使用經驗

歡迎大家講一下自己的心得

Read more

rust製作者 Graydon Hoare 帶你重溫編譯器的歷史

Read more

使用Monomorphization節省一些編譯時間

作者舉例現在可以使用 #[momo] 讓轉型更簡單,編譯更快

Read more

使用 Rust 來加速 Elixir 服務1100萬用戶

discord過去一直使用erlang來做為主要服務的程式語言現在他們使用了rustler讓rust為 elixir 加速。去年他们的业务有了一项新的变化,就是更新会员列表的方式:只发送更新的部分,而不是给每个会员发送更新。这个变化给服务器端造成了一个大问题:我们需要一个能够容纳数十万个条目的数据结构,以特定的方式排序,可以接受和处理大量的变动,并且可以报告添加和删除事物的位置索引。

Elixir是一种函数式语言;它的数据结构是不可变的。这非常适合在编写elixir对代码进行正确性论证以及并可以享受的大量并发性。不可变数据结构的双刃剑是通过采用现有数据结构和操作以及创建全新数据结构来对变动建模。这意味着当有人加入服务器(内部称为公会)并拥有100,000名成员的成员列表时,他们必须构建一个包含100,001名成员的新列表。 BEAM VM非常快,并且每天都在变得更快。它试图在可能的情况下利用持久性数据结构,但在我们运营的规模上,这些大型列表无法足够快地更新。

因此团队在erlang和elixir提供的各种高性能数据结构中寻找解决办法,试过MapSet、List、OrderedSet到他们自己实现的SortedSet,终于找到了一个解决方案,但是在超过250,000名成员的公会时性能达到了上限。于是Discord团队准备尝试使用Rust来加速。

这不是Discord团队第一次使用Rust了,在他们的游戏商城里也大量用到了Rust,但Discord的核心服务是Elixir,主要是因为Elixir比较适合他们的场景。为了为Elixir加速,他们预留了一周时间使用Rustler(提供了安全的NIF绑定,方便为elixir编写rust扩展)进行概念验证,最终发现,Rust支持的NIF提供了巨大的性能优势,而无需牺牲易用性或内存(可以支持100w名成员)。

从此以后,Discord团队便快乐地享受着Rust带给他们的「快感」。Discord也开源了他们的SortedSet库,点击原文看更多详细。

  • Reddit 讨论
  • Read More
  • rustler

使用BinaryAST快速加载脚本

关于JavaScript二进制AST

随着网站变得越来越复杂,JavaScript源代码的数量不断增加。依赖于大型JavaScript代码库会导致网站启动缓慢 - 通常速度慢得令人无法接受。这是因为存在两个瓶颈:解析和字节码编译JavaScript。不幸的是,浏览器几乎达到了两种操作的效率峰值。

我们(Mozilla,Bloomberg,Facebook,CloudFlare)目前正致力于针对JavaScript的特定领域编码,称为“BinAST”(“JavaScript二进制AST”的缩写)。 JavaScript二进制AST旨在打破瓶颈。当前的高级原型已经在所有最常见的框架上显示了JS解析改进了30%-50%,只需更改格式,我们相信我们可以进一步提高这一改进。编码可以构建为webdev工具链的一部分,或者由代理或CDN注入,因此可以在不更改原始网站的情况下自动提高最终用户的性能。

此编码目前在JavaScript TC39标准化过程中。它可以与现有的压缩技术(gzip,brotli等)一起使用,目前有cloudflare的一个Rust实现:binjs-ref。

  • binjs-ref
  • Read More