内部信息源与外部信息源搜索引擎优化方法的异同(Grammarly如何在生产中运行Lisp以及开发环境中的错误)
优采云 发布时间: 2022-03-29 16:06内部信息源与外部信息源搜索引擎优化方法的异同(Grammarly如何在生产中运行Lisp以及开发环境中的错误)
Grammarly 是一款应用程序,数百万人使用它来检查他们的电子邮件、论文、笔记等的语法。
该产品建立在核心语法引擎之上,每秒可处理一千多个句子,具有水平可扩展性,并且已在生产中可靠地服务了近三年。
该引擎是用 Common Lisp 编写的,博客 文章 描述了 Grammarly 如何在生产环境中运行 Lisp 以及他们在此过程中遇到的一些棘手错误。
Lisp 是用于构建生产系统的非常有用的语言。事实上,那里有许多 Lisp 系统:当您在 Hipmunk 上搜索车票或乘坐伦敦的地铁时,就会调用 Lisp 程序。
我们的 Lisp 服务在概念上是一个经典的人工智能应用程序,它基于语言学家和研究人员创造的大量知识进行操作。它主要是一个 CPU 密集型程序,是我们网络中最大的计算资源消费者之一。
我们在部署到 AWS 的库存 Linux 映像上运行这些服务。我们在大多数开发人员机器上使用 SBCL 进行生产部署和 CCL。
Lisp 的优点之一是您可以从几个具有不同优点和缺点的成熟实现中进行选择:在我们的案例中,我们针对服务器上的处理速度和开发环境中的编译速度进行了优化(因为对我们重要的部分将被描述在后面的部分)。
在 Grammarly,我们使用多种编程语言来开发我们的服务:除了 JVM 语言和 JavaScript,我们还使用 Erlang、Python 和 Go 进行开发。适当的服务包装使我们能够使用最有意义的任何语言和平台。维护是有代价的,但我们重视选择和自由,而不是规则和程序。
我们还尝试依赖简单的与语言无关的基础设施工具。这种方法使我们免于将这个技术动物园集成到我们的平台中的很多麻烦。
关于 Lisp 的常见抱怨之一是生态系统中没有库。如您所见,此示例中仅使用五个库用于编码、压缩、获取 Unix 时间和套接字连接:
(defun graylog (message &key level backtrace file line-no)
(let ((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
:timestamp (local-time:timestamp-to-unix (local-time:now))
:level level
:file file
:line line-no
})
:encoding :utf-8)
'salza2:zlib-compressor)))
(usocket:socket-send (usocket:socket-connect
*graylog-host* *graylog-port*
:protocol :datagram :element-type '(unsigned-byte 8))
msg (length msg))))
我们在 Grammarly 平台中尝试遵循的另一个原则是最大限度地解耦不同的服务,以确保横向可扩展性和操作独立性。这样,我们就不需要在核心服务的关键路径上与数据库进行交互了。但是,我们确实使用 MySQL、Postgres、Redis 和 Mongo 进行内部存储,并且我们已经使用 CLSQL、postmodern、cl-redis 和 cl-mongo 从 Lisp 端成功地访问了它们。
我们依靠 Quicklisp 来管理外部依赖项,并使用一个简单的系统将库源代码与我们的内部库或分叉项目捆绑在一起。Quicklisp 存储库有超过一千个 Lisp 库 - 这不是一个令人兴奋的数字,但足以满足我们所有的生产需求。
对于部署到生产,我们使用通用堆栈:应用程序由 Jenkins 测试和捆绑,由 Rundeck 放在服务器上,并由 Upstart 作为常规 Unix 进程在那里运行。
总的来说,我们将 Lisp 应用程序集成到云世界中所面临的问题与我们使用许多其他技术所面临的问题并没有根本的不同。
更多点击标题