跳至內容
GitHub 儲存庫 論壇 RSS 新聞提要

使用 Crystal 自動化智慧建築

PlaceOS 如何創建和管理協調一致的環境

Stephen von Takach Dukai Martin Pettinati

PlaceOS 提供了一個平台,允許實體和數位之間的無縫整合。然後他們將一切自動化,在傳統上保守的設施管理領域中創建最先進的協調一致的生態系統。

我們與 Place 的工程主管 Stephen Von Takach Dukai 坐下來,談論他們使用 Crystal 的經驗。

您目前使用 Crystal 進行哪些專案?它們是否都已在生產環境中?它們是面向客戶還是內部工具?

實際上,我們所有後端都使用 Crystal 語言。我們所做的大部分事情都在生產環境中運行,包括面向客戶和內部工具。我們構建的所有服務都是 Crystal,只有一個剩餘的 Ruby 服務。

我們也是開源的忠實擁護者,因此您可以在以下位置找到我們的作品:

  • spider-gazelle - 我們認為可重用且對社群有益的 Shard

  • PlaceOS - 我們的核心平台,主要對合作夥伴組織有用

  • place-labs - 主要支援 PlaceOS 的 Shard

此外,我們的一些 SaSS/雲端平台軟體,包括平台管理和計費軟體,是封閉原始碼的 — 但它們也都是使用 Crystal 語言。

您是如何了解該語言的?以及在選擇它作為您技術堆疊時考慮了哪些因素?您評估了哪些替代方案?以及您還在使用哪些其他語言?

我想我們第一次注意到 Crystal 是在 Sidekiq 的創建者 Mike Perham 發布 Crystal 語言客戶端時。

我們一直在使用 Ruby 作為我們的平台,並且遇到了可擴展性的限制。最初我們選擇 Ruby 是因為它是一種非常富表現力的語言,而且我們有一些 Rails 的經驗。但是,我們最終不得不基於 Libuv 構建自己的 IO 反應器,以獲得我們所需的效能。Ruby 於 1996 年發布,這意味著它的設計早於 epoll 等高性能 IO 的內容,後者於 2002 年首次亮相。

實際上,唯一其他接近滿足我們需求的語言是 Go-lang,但從 Ruby 過來的我們覺得 Crystal 對我們的開發人員來說是一個更容易的過渡。事實上,我認為我們不可能用 Go-lang 取得成功。諸如巨集和泛型等 Crystal 功能從一開始就對成功至關重要。

我們使用的另一種語言是 TypeScript,因為我們的前端是基於 Angular 框架構建的。

使用 Crystal 開發有哪些優勢,以及有哪些問題?

從 Ruby 過來,我個人覺得 Crystal 讓人耳目一新。我最初從 C++ 和 C# 轉到 Ruby,作為我每天使用的語言,當時也有類似的感覺。

使用 Ruby on Rails 的生產力感覺高得多,我可以快速行動並更有創造力。但是,最近,特別是當解決方案變得越來越大和複雜時,Ruby 感覺像阿基里斯的腳踝:難以重現的隨機錯誤,以及在意外程式碼路徑中的意外物件,確實耗費了開發人員的時間。

Crystal 解決了 Ruby 中大多數讓人感到錯誤的問題。類型和編譯器的智慧功能是顯而易見的第一件事,在我們涉足 Crystal 之後,我們絕對在編寫更好的 Ruby 程式碼。但我們也發現 Crystal 工具非常棒,格式化程式、Ameba 等程式碼檢查器、測試工具、利用 LLVM、最小的 Docker 容器和社群,所有這些都有助於我們做出決定。

當時最大的問題可能是缺乏成熟的 Shard,但這只是意味著我們可以塑造缺失的部分來滿足我們的需求,並且移植 Ruby Gem 通常不是什麼大問題。坦白說,令人驚訝的是,僅僅因為 Crystal 編譯器,我們在移植的每個 gem 中都發現了多少錯誤。

您認為使用該語言對您自己的營運有什麼好處?對您的最終客戶又有什麼好處?

對我們的好處是 Ruby 的開發人員生產力,加上我們對發布內容的信心增加,以及減少對效能的關注。這為客戶帶來更高品質的應用程式,並為我們帶來更乾淨的程式碼庫。

其中一個例子是我們構建的 Web 框架,Spider-Gazelle。它最初是作為 Rails 克隆版構建的,現在利用 Crystal 的魔力來產生 OpenAPI 文件,使其比 Rails 更有用且更快。

API 文件對開發人員來說很耗時,因此這提高了我們的開發人員生產力,文件更準確(在許多情況下,現在存在)並且與 Ruby 相比,我們的計算支出更低。

您認為 Crystal 最適合解決哪種問題?

一個很棒的用例是可移植的 Linux 可執行檔。我們開發了一項可以部署在邊緣的服務(通常是客戶大樓中的網路交換器),並且這個邊緣處理器會下載靜態連結的驅動程式,這些驅動程式是使用 musl libc 構建的 Crystal 可執行檔。

對我們來說,Crystal 是一個完美的 Web 服務平台,適用於您可能使用 Ruby、Python 或 Go-lang 來執行的絕大多數事情。我們正在使用它來開發各種形狀和大小的微服務,並為 Docker 和 k8s 部署提供 x86_64 和 ARM64 支援。

隨著越來越多的開發人員開始使用該語言,並且 Shard 被構建出來,我可以想像 Crystal 將超越 Ruby 和 Python,成為首選語言。它同時具有 Go-lang 和 Ruby 的優點,這是一個非常強大的倍增器。

Photo of Stephen von Takach Dukai

Stephen von Takach Dukai,Place 工程主管