这是目前我所知道的唯一方式.理解它Scala使用Java虚拟机.我以为Jruby也是.Twitter将其中间件转换为Scala.他们可以做同样的事情并使用Jruby吗?
他们是否可以从Jruby开始,而不是因为他们的缩放问题导致他们首先从Ruby迁移到Scala?我不明白Jruby是什么?我假设因为Jruby可以使用Java,它会缩放到Ruby不会的地方.
在这种情况下,这一切都归结为静态与动态类型吗?
Scala是"可扩展的",因为图书馆可以通过某种方式改进语言,使扩展看起来像是语言的一部分.这就是为什么演员看起来像语言的一部分,或者为什么BigInt看起来像语言的一部分.
这也适用于大多数其他JVM语言.它不适用于Java,因为它对运算符的基本类型(Int,Boolean等)有特殊处理,繁琐的语法清楚地说明了语言中构建的内容以及库是什么等.
现在,Scala比JVM上的动态语言更具性能,因为JVM不支持它们.JVM上的动态语言必须采用反射,这非常慢.
不,不是真的.并不是说JVM在某种程度上是神奇的,并且通过它的神奇力量使事物变得规模化; Scala作为一种语言,其架构旨在帮助人们编写可扩展的系统.它位于JVM之上几乎是偶然的.
我真的不认为语言是这里最大的问题.Twitter变得非常快,总是会导致代码混乱.如果你进行重写,最好选择另一种语言 - 禁止你再次构建自己的错误和/或"重用某些部分".此外,Ruby并不是真正意味着Twitter后端所做的那种繁重的数据处理.前端仍然是Ruby,所以他们仍然使用它.
你必须分出不同的缩放含义:
扩展可以通过硬件按比例增加处理的每秒请求数量
在扩展代码库方面进行扩展,而不会成为纠结的混乱
Scala在第一点上有所帮助,因为它编译为与Java非常相似的Java字节码,因此通常具有与Java相同的性能.我说"通常",因为Scala有些情况下惯用Scala会导致大量的拳击发生在惯用Java不会发生的情况下(这将在Scala 2.8中更改).
性能当然与缩放不同.用JRuby编写的等效代码也可以扩展,但是线的斜率会更陡峭 - 你需要更多的硬件来处理相同数量的请求,但是线的形状是相同的.但是从更实际的角度表现会有帮助,因为你很少能相对于规模在完全线性的方式来增加核心或特别是服务器,并具有更好的性能会降低上,你必须添加容量的速度.
Scala有助于第二点,因为它有一个富有表现力的编译时强制类型系统,并且它提供了许多其他方法来管理代码的复杂性,例如mixins.你可以用任何语言编写意大利面条的代码,但Scala编译器会告诉你一些面条被打破时,同时使用JRuby你必须仅仅依靠测试.我个人发现,对我而言,Python在大约1000个密切相关的LOC上发生故障,而且我必须重构以大幅减少LOC或使结构更加模块化.当然,无论你的语言是什么,这种重构都是一个好主意,但有时复杂性是固有的.在任何语言中处理大量紧密耦合的LOC并不容易,但在Scala中比在Python中更容易,我认为类比也扩展到Ruby/JRuby.