ノヌドからクリスタルぞの旅

Duoは長幎にわたっおNodeをメむンプラットフォヌムずしお䜿甚しおきたした。 しかし、最近、圌らは非垞に新しいCrystal蚀語で実隓しおおり、ただ完党には圢成されおいたせん。 圌らによれば、圌らがそれをやればやるほど、圌らはそれに執着するようになりたした。



本日は、NodeおよびCrystalプラットフォヌムの長所ず短所、およびDuoでたすたす倚くのサヌバヌプロゞェクトがCrystalに移行される理由に぀いおの翻蚳を翻蚳したいず思いたす。







ノヌド



▍期埅



数幎前にノヌドに切り替えたした。 圓時私たちは少数の開発者を抱える小さな䌚瀟であり、埓業員はできるだけ倚才である必芁がありたした。 開発者がフロント゚ンドたたはバック゚ンドに特化できるようにするこずは、私たちにずっお達成䞍可胜な莅沢でした。 サヌバヌたたはアプリケヌションのクラむアント郚分で倚くの䜜業が行われた堎合、専門分野に関係なく、問題に察凊できる人が必芁でした。



Nodeは私たちにずっお完党に明癜な遞択肢のように思えたした。 JavaScriptを知っおいる開発者を採甚した堎合、これは圌がクラむアントプロゞェクトずサヌバヌプロゞェクトの䞡方で䜜業できるこずを意味しおいたした。 ツヌル、構文、䟝存関係は重耇し、すべおのタスクはJavaScriptを䜿甚するため、スキルが向䞊したす。



▍珟実



サヌバヌコヌドずクラむアントコヌドの目暙はたったく異なりたす。これらのタむプのコヌドには、非垞に異なる䜜業方法の知識が必芁です。 通垞、クラむアントコヌドは、ナヌザヌずの察話、むンタヌフェむスの曎新、サヌバヌからのデヌタ芁求の実行です。 開発者は通垞、webpackたたはbrowserifyを䜿甚しおコヌドをパッケヌゞ化し、Reactでむンタヌフェむスを開発し、CSSフレヌムワヌクを䜿甚しおペヌゞレむアりトを簡玠化したした。



サヌバヌ䞊で、プログラマはデヌタベヌスぞのSQLク゚リ、ORM、ファむルの読み取りず曞き蟌みを凊理し、サヌドパヌティAPIずの盞互䜜甚を敎理したす。 サヌバヌ䞊のデヌタストリヌムは、芁求/応答モデルに埓いたす。 リク゚スト間で、すべおのタスクが回答を提䟛する必芁があり、これはすべお特定の方法で実行する必芁がありたす。 特定のステップが前のステップで埗られた結果に䟝存しおいる堎合、察応するプロセスを順番に実行する必芁がありたす。そうでない堎合は、䞊行しお実行できたす。



▍暙準的な非同期性



Nodeは、各タスクを非同期で実行するように蚭蚈されおいたす。 ぀たり、5぀のタスクを完了するようにNodeに䟝頌するず、圌はこれをすべお同時に実行しようずしたす。 過去数幎間、玄束はこの仕事のモデルをサポヌトする䞻な手段でした。 䞀蚀で蚀えば、Promiseを䜿甚するず、プログラマは非同期タスクのセットを連鎖できたす。非同期タスクは、次々に実行される䞀連のステップです。



サヌバヌでは、䞊列タスクの暙準的な䜿甚は非垞に効果的なアむデアのように思えるかもしれたせん。 実際には、私たちが盎面しおいるほずんどのタスクに぀いお、以前のタスクから取埗したデヌタが必芁です。 タスクを䞊行しお実行できたずしおも、システムリ゜ヌスはすぐに䜿い果たされる可胜性がありたす。぀たり、デヌタベヌスに察する倚数の䞊行ク゚リの実行により、接続のプヌルが䜿い果たされ、同時にサヌビスを提䟛できるナヌザヌの数が枛りたす。



Nodeを長幎䜿甚しお、玄束からチェヌンを䜜成するこずは私たちの暙準になりたした。 蚘述されたコヌドの半分は、非同期タスクを順次解決されるタスクに倉えるこずを目的ずしおいたした。 これらの䞀連の玄束は、テストやデバッグが難しく、コヌドが特にわかりにくいわけではありたせん。 タスクずサブタスクが実行される順序でさえ、コヌドを単に芋るだけでは理解しにくいこずがよくありたす。



Nodeの䜜成者であるRoal Dahlは、この状況を非垞にうたく説明し、むンタビュヌでNodeずGoを比范したした 。



しかし、このシステムがプログラマヌに提䟛するむンタヌフェヌスはブロックされおおり、実際、これはより成功したプログラミングモデルだず思いたす。 ブロッキングアプロヌチを䜿甚するず、倚くの状況で、実行されたアクションの本質を確認する方がはるかに優れおいたす。 䞀連のアクションが倚数ある堎合、システムに次のようなこずを䌝える機胜は非垞に䟿利です。「タスクAを解決し、答えを埅っお、゚ラヌを出しおください。 問題Bを解決するか、回答を埅぀か、゚ラヌを返したす。 Nodeでは、関数呌び出し間で絶えず「ゞャンプ」する必芁があるため、これを達成するこずははるかに困難です。



yn動的タむプ



JavaScriptで定期的にプログラムしおいる人はだれでも、遅かれ早かれ「undefined is not object」ずいう゚ラヌに慣れるでしょう。 この゚ラヌは、オブゞェクトず芋なすが、null倀が曞き蟌たれおいる倉数のメ゜ッドたたはプロパティにアクセスしようずするず発生したす。 コヌドの非同期セクション間で転送されるデヌタを制埡するだけでは十分ではありたせん。たた、アプリケヌションコヌドの任意の堎所の型で䜕が起こっおいるかを認識する必芁がありたす。 アプリケヌションが1぀のプロセスからデヌタを受信しお​​別のプロセスに枡すたびに、クラッシュが発生する堎合がありたす。 すべおの可胜な倀を凊理する可胜性を提䟛しない堎合、サヌバヌぱラヌをスロヌするか、さらに悪いこずに、予期しないこずを行いたす。



クリスタル



Nodeで䜜業しながら、Python、PHP、Ruby、Goなど、他の倚くの蚀語ずプラットフォヌムを調べたした。 原則ずしお、それらはNodeよりも遅いか、開発目的にはそれほど䟿利ではありたせんでした。 速床ず構文は、特定の制限たでしか最適化できない蚀語の2぀の芁玠です。



その埌、昚幎、Crystal蚀語に関する蚘事を読みたした。 これは、LLVMを介しおマシンコヌドにコンパむルされる新䞖代の蚀語のものです。 その構文はRubyに䌌おいたす私は気に入っおいたすが、Goず同じくらい高速に動䜜したすそしおこの獣は速床を取りたせん。



クリスタルはただ非垞に若いですが、コンテンツ管理システムの䞀郚のサヌバヌ郚分をクリスタル䞊でやり盎すこずにしたした。 うたくいきたした。 仕事䞭に私が芋぀けたものは次のずおりです。





Crystalでのプログラミングが倧奜きだったので、CMSのバック゚ンド党䜓をこの蚀語で曞き盎したした。 そのAPIはNodeベヌスのCMSず互換性があるため、比范的少ない劎力でWebサむトを新しいシステムに転送したり、叀いシステムに戻したりできたす。 Crystalはただ若いプロゞェクトであり、保険が必芁なので、これは重芁です。



DuoCMSをCrystalに完党に曞き換えた埌、実皌働環境でテストする必芁がありたした。 実際、この資料のオリゞナルは、Crystalで実行されるサむトに投皿されおいたす。



NodeNodeずCrystalのコヌド比范



比范のために、以䞋は、CrystalおよびNodeで蚘述されたコントロヌラヌコヌドのわずかに簡略化されたバヌゞョンです。



これがNode䞊のコントロヌラヌですExpressフレヌムワヌクを䜿甚。



const express = require('express') const app = express() const bodyParser = require('body-parser') const UserService = require('user-service') app.use(bodyParser.json()) app.get('/', function (req, res) {  res.send('Hello World!') }) app.post('/api/users', function (req, res) {  if(request.body){    UserService.save(request.body)    .then(function(){      res.send('user saved')    })    .catch(function(err){      res.send(err)    })  }else{    res.send("no user provided")  } }) app.listen(3000, function () {  console.log('Example app listening on port 3000!') })
      
      





これがCrystal䞊のコントロヌラヌですKemalフレヌムワヌクを䜿甚。



 require "kemal" require "user" require "user-service" get "/" do "Hello World!" end post "/api/users" do |ctx| if (json = ctx.request.body)   user = User.from_json(json)   UserService.new.save(user)   "user saved" else   "no user provided" end end Kemal.run
      
      





これら2぀の䟋の構造が非垞に䌌おいるこずは簡単にわかりたす。 ただし、Promiseが䞍芁になるず、コヌドの合蚈量は枛少したした。 より倧きなアプリケヌションを䜜成する堎合、これは著しく匷力です。 DuoCMS 5サヌバヌコヌドは、玄15,609行のJavaScriptで構成されおいたす。 DuoCMS 6コヌドは、10,186行近くです。 DuoCMS 6には珟圚、実装に必芁なコヌドが30少ない、より倚くの機胜がありたす。 同時に、玄束がないため、このコヌドは読みやすく、保守しやすいです。



Crystalには䜕が欠けおいたすか



開発者は、Crystalの珟圚のリリヌスをアルファバヌゞョンず呌びたす。 ここで、生産甚に蚭蚈されたはるかに耇雑でないフレヌムワヌクを䜿甚しなければならなかったこずを蚀わなければなりたせん。 最悪のシナリオでは、Crystalは珟圚ベヌタ版です。 ただし、開発者の泚意は理解できたす。 アルファ版に぀いお話したす。これにより、操䜜、倉曎、APIの砎壊などの䜙地が䞎えられたす。



Crystalを玄1幎間䜿甚しおいたすが、プロゞェクトの開発ず、これがただアルファ版であるずいう事実のために、わずかな倉曎にしか遭遇しおいたせん。 フロント゚ンドでReactを曎新する際にさらに問題が発生したした。 さらに、CrystalはCrystalで曞かれおいるず蚀っおおく䟡倀がありたす。぀たり、動䜜しないこずが刀明した堎合は、蚀語ず暙準ラむブラリで修正を行うこずができたす私はそうしたした。



珟時点では、Crystalの䞻な欠萜機胜には次のものがありたす。





私たちにずっお、これらの欠点はどれもクリスタルを攟棄する理由ではありたせんでした。 私たちが䜿甚するラむブラリに欠けおいる機胜を実装する远加を行う必芁がありたしたが、これはNodeで䜜業しおいるずきにも起こりたした。 最埌に、クリスタルにずおも満足しおいるず蚀えたす。



たずめ



クリスタルを詊しおみたせんか はい、そうです 事は本圓に玠晎らしいです。 Crystalでプログラムするのは良いこずです。コヌドは読みやすく、線集も簡単です。 ちなみに、Crystalを䜿甚しおこの蚀語の開発に貢献する人が倚ければ倚いほど、その蚀語は良くなりたす。 すべおを自分の目で芋たいですか むンストヌル手順は次のずおりです。 こちらがプロゞェクトサむトです。 そしお、これはCrystalチャットです 。もしあれば、@ criswardに私を曞いおください。



Crystalを実皌働環境で䜿甚するかどうかを尋ねる堎合は、それが必芁です。 個人的には、実甚に適したものを䜜る唯䞀の方法は、倱敗が蚱容される問題でそれを詊しおから、埐々に倧きなプロゞェクトでこれに切り替えるこずだず思いたす。 たずえば、非垞にトラフィックの倚いプロゞェクトや重芁な゚リアで、クリスタルをどこでも䜿甚しおいたせん。 すべおのサむトを監芖し、定期的にバックアップしたす。さらに、Crystalに䜕かが発生した堎合に備えお、Nodeは垞に手元にありたす。



芪愛なる読者 プロゞェクトでCrystalを詊す予定はありたすか



All Articles