在Grammarly的生产中运行Lisp

2020-05-25 01:49:05

在Grammarly,我们业务的基础,我们的核心语法引擎,是用Common Lisp编写的。它目前每秒处理一千多个句子,可水平扩展,并且已经在生产中可靠地服务了近三年。我们注意到,关于如何将Lisp软件部署到现代云基础设施的说明非常少(如果有的话),所以我们认为分享我们的经验会是一个好主意。Lisp运行时和编程环境提供了几个独特的-尽管模糊的-功能来支持生产系统(对于不耐烦的人,这些功能将在最后一章中介绍)。

与流行的观点相反,Lisp是构建生产系统的一种非常实用的语言。事实上,市面上有很多Lisp系统:当您在希普蒙克搜索机票或在伦敦乘坐地铁时,系统会调用Lisp程序。

从概念上讲,我们的Lisp服务是一个经典的人工智能应用程序,它基于语言学家和研究人员创建的大量知识进行操作。它主要是一个CPU受限的程序,它是我们网络中计算资源的最大消费者之一。

我们在部署到AWS的现有Linux映像上运行这些服务。我们使用SBCL进行生产部署,在大多数开发人员的机器上使用CCL。Lisp的优点之一是您可以从几个具有不同优点和缺点的成熟实现中进行选择:在我们的示例中,我们针对服务器上的处理速度和开发环境中的编译速度进行了优化(这对我们至关重要的原因将在后面的小节中介绍)。

在Grammarly,我们使用许多编程语言来开发我们的服务:除了JVM语言和JavaScript之外,我们还使用Erlang、Python和Go进行开发。适当的服务封装使我们能够使用任何最有意义的语言和平台。维护是有成本的,但我们重视选择和自由,而不是规则和流程。

我们还尝试依赖简单的语言不可知的基础设施工具。这种方法省去了我们在平台中集成这个技术动物园的很多麻烦。例如,StatsD就是一个非常好的例子,它是一个非常简单、非常有用、非常容易使用的服务。另一个是Graylog2;它为日志记录提供了一个出色的标准规范,虽然CL中没有现成的库来使用它,但是从Lisp生态系统中已经可用的构建块组装起来真的很容易。(=。这就是所需的所有代码(其中大部分只是规范的“逐字”翻译):

(deun graylog(Message&;key level Backtrace file line-no)((msg(salza2:compress-data(babel:string-to-octets(json:encode-json-to-string#{:version";1.0";:Facility";lisp";用法:host*hostname*:|Short_Message|message:|full_message|backtrace:timeamp(local-time:time-amp-to-unix(local-time:now)):level level:file file:line line-no}):coding:utf-8)';salza2:zlib-compress))(usocket:socket-send(usocket:socket-connect*graylog-host**graylog-port*:protocol:datagram:datagram)(usocket:socket-connect*graylog-host**graylog-port*:protocol:datagram: