在PagerDuty中使用的Elixir
这篇文章是关于PagerDuty公司采用Elixir时,Cees de Groot先生谈到的 “Elixir at PagerDuty” 的翻译。
尽管有些地方的翻译可能不太准确,若有需要,希望能收到编辑请求。
当PagerDuty刚刚启动时,开发速度非常重要。因此,我们选择Rails作为PagerDuty的首选是毫不奇怪的。不久之后,由于需要扩展规模,选择了Scala。
然而,Ruby和Scala之间在语言本身的外观和社区重视的方面存在着重大差异,总而言之它们是完全不同的东西。
在Ruby社区,尤其是Rails子社区中,开发者的体验被视为最重要的事情。而在Scala中,更加注重学术和形式化的根源,更加重视正确性。
我们被困扰在如何弥补这个技术栈的差异的问题上。
由于Ruby和Scala之间的差异太大,因此我们无法确定Scala是否能够解决我们的主要问题,但我们需要具备比Rails更出色的性能和可扩展性的解决方案。
我对最初的Scala代码基础并不太满意,因为我发现编写清晰并且支持变更的Scala代码是困难的,而且其扩展性比我预期的更加困难。
当我在2015年思考了以上的问题时,我选择了跳入古老的极限编程方法——系统的隐喻(System Metaphor)。
我曾在通信行业工作,但把PagerDuty视为某种开关并不算错。
有东西进来,根据某些规则和逻辑离开。
无论用什么类比,都可以想象出它的作用,但对我来说,这个运作的比喻已足够。
在通信行业中,提到编程语言,毫无疑问地可以说是 Erlang。以前我曾经接触过 Erlang,但并没有太好的印象。在我的工作中,并没有太多适用于所涉及系统的地方。
然而,本次似乎仍然保留了适用于基于Prolog的语言(混合大写和小写的语言)的部分。
我当时暂时将那个想法放在一边,专注于工作,直到一个月或两个月后开始学习 Elixir 之前,我都忘记了它。
当再次开始时,我觉得这真是太有趣了!有人正在使用Ruby/Rails进行开发,并且构建在Erlang虚拟机上,它拥有现代化、快速、高级的特点,还有Lisp/Scheme风格的宏,对用户来说很好用(甚至比博士研究生还好用)。
毫无疑问,它迅速成为了我今年必学的语言列表中的首选,我开始阅读文件并尝试运行示例代码。
我很满意,甚至超过了期望,表现出了非常出色的实施和开发速度。
而且最重要的是,使用Elixir进行开发非常有趣。
每当我涉及Elixir时,我就觉得Scala不再是必需的,对于Ruby开发人员来说是一个很好的选择,它更快,更有乐趣,所以我开始寻找一个试点项目。
Elixir的引入
言語的引入是一项棘手的任务。由于引入新语言需要极高的成本,因此要说服人们接受它是非常困难的。尽管可能有些矛盾,但说服他人的好方法是实际尝试并观察事情的发展。
因此,飞行员版本必须是具有关键任务且复杂的,但仍然足够受限以便能够迅速重新执行的古老语言。
当我们的团队想要在Rails流的方法中使用事务与Kafka进行交互时,我们迎来了一个机会。
为了简化MySQL事务的重型Rails应用程序的启动,我们需要一个系统,它可以参考数据库表中的Kafka消息并将其发送到Kafka。
我知道这种方法并不是与Kafka进行交互的最佳方式,但是这种方法可以将Kafka消息简单地作为ActiveRecord事务的一部分进行处理。
我简化了与Kafka周边现有代码和回滚中可能发生的副作用相关的代码。
我们决定将此项目作为试点版本开始。这是非常重要的价值,并且最初计划的Kafka消息存在于关键路径上,但这个项目是自包含的,与Scala相比,当项目失败时重新开始更容易。
罕见情况下,我们找到了一个完全适用于新语言的试运行项目。
我们经常在开始正式进行几周后遇到需要调整和改进的服务,但在Elixir中从未遇到过这样的情况。
毋庸置疑,公司不会决定“好吧,让我们全部用Elixir重新编写!”这样的事情,但这是第一步,非常重要。
我們推廣 Elixir 並幫助其他團隊克服困難。雖然進展緩慢,但慢慢開始普及。
同時に,開始招聘喜歡Elixir的人,並且舉辦多倫多的Elixir Meetup等活動,與本地社群建立了聯繫。雖然進展緩慢,但各種團隊確定地開始採用Elixir。
现在有一些团队正在使用Elixir进行全部开发,或者刚刚开始采用Elixir的团队,还有一些团队正在等待尝试“用Elixir来做试试看”的机会。
Elixir以其特性而言,首先是可以正常运行的,并且运行在一个强大的平台上,代码易于理解,社区持有正当的立场,与Rails黑魔法态度相反,并且整体上足够小巧简洁,可以作为一个可选的方案。
现在几乎没有PagerDuty的流量接触不到Elixir代码的情况了。
今年我们计划将一些重要功能替换为Elixir,我们相信PagerDuty可以处理的流量Elixir也能处理。
最初的试播版到全面生产为止的过程是顺利的,但我们中的一些人希望有一天能够用Elixir完全替代它。
在撰写 Elixir 文章过程中,得到社群领导的帮助是不言而喻的。非常感谢 Elixir 的创造者 Jose,以及这种语言文化。
Elixir是一个友善而令人印象深刻的社区之一,在Slack、Elixir论坛、Stack Overflow和IRC等平台上,人们彼此真诚、友善、乐于助人。
議論になることはめったになく、進化は非常に速いです。それだけで、Elixirを学ぶ価値があります。