在Grammarly的生產環境中執行Lisp
Grammarly 是一個應用程式,數百萬人使用它來檢查他們的電子郵件、論文、筆記等的語法。
該產品建立在核心語法引擎之上,每秒可處理一千多個句子,可水平擴充套件,並且已在生產中可靠地服務了近三年。
該引擎是用Common Lisp 編寫的,部落格文章介紹了 Grammarly 如何在生產中執行 Lisp 以及他們在這樣做時遇到的一些棘手的錯誤。
Lisp 是一種用於構建生產系統的非常實用的語言。事實上,那裡有許多 Lisp 系統:當你在 Hipmunk 上搜尋機票或在倫敦乘坐地鐵時,就會呼叫 Lisp 程式。
我們的 Lisp 服務在概念上是一個經典的 AI 應用程式,它基於語言學家和研究人員建立的大量知識進行操作。它主要是一個 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 應用程式整合到雲世界中所面臨的問題與我們在使用許多其他技術時遇到的問題並沒有根本不同。
更多點選標題
相關文章
- 生產環境使用10053分析Oracle的執行計劃Oracle
- windows下搭建lisp環境WindowsLisp
- Dubbo Mesh 在閒魚生產環境中的落地實踐
- 8.4.9 在truffle環境中執行外部指令碼指令碼
- Laravel記錄執行的SQL到日誌(開發環境和生產環境都用得上)LaravelSQL開發環境
- 生產環境中MySQL複製的搭建KPMySql
- Nuxt.js中配置生產環境和開發環境APIUXJS開發環境API
- ClickHouse生產環境部署
- 生產環境 壓測
- 使用 Webpack 進行生產環境配置(附 Demo)Web
- 大資料執行環境的執行大資料
- Vim在圖形環境下全屏產生黑邊
- VSCode for Mac 搭建 Common Lisp 開發環境VSCodeMacLisp開發環境
- SQLServer高可用方案在企業生產環境的實踐SQLServer
- VScode中配置C++執行環境VSCodeC++
- 專案開發中,如何使用eolinker進行環境管理:開發、測試和生產環境
- SpringBoot使用非同步執行緒池實現生產環境批量資料推送Spring Boot非同步執行緒
- webpack開發模式和生產模式設定及不同環境指令碼執行Web模式指令碼
- Vue生產環境除錯的方法Vue除錯
- 生產環境的 ElasticSearch 安裝指南Elasticsearch
- 用 Spring 區分開發環境、測試環境、生產環境Spring開發環境
- 簡單安裝PHP在Linux下的執行環境PHPLinux
- JavaScript執行環境與執行棧JavaScript
- webpack4生產環境和開發環境的對比Web開發環境
- 記一次生產環境tomcat執行緒數打滿情況分析Tomcat執行緒
- linux執行環境&命令Linux
- openGauss-執行環境
- laradock swoole 執行環境
- 在叢集環境中執行的Spring計劃排程任務 - Stack OverflowSpring
- 如何讓Python指令碼成為在Windows環境中執行的exe檔案Python指令碼Windows
- Yarn生產環境核心引數Yarn
- Webpack(開發、生產環境配置)Web
- 生產環境BigDecimal用錯了,已哭暈在廁所。。。Decimal
- kafka生產環境規劃-kafka 商業環境實戰Kafka
- windows terminal 中執行 miniconda 和 pip 的虛擬環境Windows
- 生產環境中如何切換MySQL儲存引擎GAMySql儲存引擎
- 作業系統的執行環境作業系統
- 你生產環境的 Composer 是這樣嗎?