2020年4月21日火曜日

Rust提高处理速度:转到Rust语言改变,玩家聊天App Discord的挑战

https://www.atmarkit.co.jp/ait/articles/2002/10/news038.html

共用。



Discord是一款面向游戏玩家的聊天应用,但其底层服务之一的Read States却暴露出了速度不够快的问题。 开发团队试图通过进一步完善现有的代码来应对。 然而,当在Rust语言中重新实现时,性能甚至在优化之前就已经得到了改善。 我不知道为什么。 开发团队解释了为什么.发布于2020年2月10日上午11:40分,我们在围棋中实施的 "阅读国家 "服务并没有充分解决高速的要求。 虽然平均运行速度很快,但平均每隔几分钟就会有一次快速的响应时间,这让用户体验大打折扣。 经调查,发现这是由于Go的核心功能、内存模型和垃圾回收器(GC)造成的。



 在Discord中,有数十亿个读取状态,而Discord用来存储读取状态信息的数据结构如下图所示,称为 "读取状态"。 这是因为每个用户和通道组合都需要一个读取状态。 每个阅读州都有若干个计数器。 例如,其中一个计数器代表了用户在频道中被提及的次数。

 零散地更新这些计数器是不一致的。 我必须要更新Atomic。 必须更频繁地将其重置为0。

 每个读取状态服务器都有一个LRU(Least Recently Used)的读取状态缓存,以便更快地更新原子计数器。 每个缓存都包含数百万的用户和数千万的阅读状态。 而且缓存每秒更新数十万次。

 为了确保数据的持久性,Discord用分布式数据库管理系统Apache Cassandra集群来补充缓存。 当缓存键被驱逐时(去除不必要的数据),读取状态被提交到数据库中。 另外,我在更新Read State的时候,总是把30秒的数据库提交。 因此,数据库每秒要写上几万次。

为什么Rust的速度这么快?
 Rust不需要垃圾回收。 这也是该公司希望在Rust中实现Read States服务的原因;有了Rust,你就不会看到在Go中实现该服务时出现的平均响应时间激增。

 Rust在内存管理方面采取了一种相对独特的方法,拥抱 "内存所有权 "的思想。 由于内存是专有的,它可以跟踪内存区域的读写权限,只要不再需要内存区域,就会立即释放;由于Rust在编译时就强制执行内存规则,所以几乎不可能出现内存bug;不需要像C语言那样手动跟踪内存区域,编译器就能搞定一切。

虽然 "异步Rust "没有那么完整,但社区帮助
 在Rust的Read States服务重新实现时,稳定版的Rust还没有足够的异步支持。 但对于网络服务来说,异步编程是必须的。 有一些社区库启用了异步Rust,但它们需要复杂的程序,当出现问题时,错误信息很难理解。

 所幸的是,Rust团队一直在勤奋地让异步编程变得更简单,现在Rust的年夜号频道上有了一个不稳定的版本,具有增强的异步编程功能。

 Discord实施了夜间发布,并与Rust团队合作解决出现的问题。 因此,目前Rust的稳定版支持异步Rust。


通过www.DeepL.com/Translator(免费版)翻译

0 コメント:

コメントを投稿