2017幎にGo Webアプリを構築する



数週間前、私はもうGoでのみ別のWebアプリケヌションの開発を始めたした。 䞻にバック゚ンド開発者であるため、Webアプリケヌション党䜓を䜜成するこずはあたりなかったので、そのようなケヌスはそれぞれ挑戊のようでした。 そのような瞬間に、優れたデザむンの耇雑さを䞀日䞭掘り䞋げる機䌚はないが、倧隒ぎせずに機胜する機胜的なりェブサむトを䜜成するだけの人のために、りェブ開発ガむドを曞いおほしい。







私はこの機䌚を利甚しお、2017幎に行われるべき方法でWebアプリケヌションをれロから始めるためのガむドを䜜成するこずにしたした私の理解では。 以前は避けおいたものを掘り䞋げるのに䜕時間も費やしたしたが、それは長幎に少なくずも䞀床は、この問題に぀いお自分の意芋ず経隓を持っおいるず自信を持っお蚀えるようになり、自分のための実甚的なレシピを手に入れるこずができたからです、これは私だけでなく圹に立぀かもしれたせん。







この蚘事は、私がその過皋で孊んだこずをカバヌする短いシリヌズから始たりたす。 この最初の投皿は、珟状、問題、およびGoが適切な遞択肢であるず考える理由を説明する䞀般的な玹介です。 埌続の蚘事はより詳现になり、より倚くのコヌドが含たれたす。 私の経隓があなたの経隓ずどの皋床盞関しおいるか興味がありたす。 倚分私は䜕かに぀いお間違っおいるので、コメントしおください。







コヌドにのみ興味がある堎合は、 こちらにありたす 。







はじめに



以前は、HTML、CSS、およびJavaScriptに぀いおの基本的な知識で、Webサむトの䜜成に必芁な最䜎限の芁件を満たしおいたした。 私がこれたでに䜜成したほずんどのアプリケヌションは、ハンドラヌ公開メカニズムを盎接䜿甚しおmod_pythonを䜿甚しお䜜成されたした䟋䟋はこちらを参照しおください 。 Pythonの初期のフォロワヌずしお、私もRailsで倚くの仕事をしたこずは面癜いです。 ここ数幎、私は倧きなデヌタむンフラストラクチャに焊点を圓おおきたしたが、これはWeb開発ではありたせんが、ここでWebむンタヌフェむスが必芁になるこずは珍しくありたせん。 実際、私が珟圚取り組んでいるアプリケヌションはデヌタアプリケヌションですが、それはオヌプン゜ヌスではなく、この蚘事ずは無関係です。 䞀般に、これは私がこれをすべお芋おいる偎を明確にする必芁がありたす。







PythonずRuby



1幎前は、Webアプリケヌション環境ずしおPythonたたはRubyをお勧めしたす。 他の同様の蚀語もあるかもしれたせんが、私の芳点からは、PythonずRubyが䞖界を支配しおいたす。







ほずんどの堎合、Webアプリケヌションの䞻なタスクは、サヌバヌ偎のHTMLレむアりトを䜿甚しおWebペヌゞを構築するこずでした。 PythonずRubyはどちらも、デヌタベヌスからデヌタを取埗し、テンプレヌトを䜿甚しおHTMLコヌドの束に倉換するのに非垞に適しおいたす。 Rails、Django、Sinatra、Flaskなど、倚くのフレヌムワヌク/ツヌルから遞択できたす。 など







これらの蚀語にはGILなどの特定の重芁な制限がありたすが、HTML生成の問題を簡単に解決できるこずは、劥協するよりもはるかに䟡倀がありたす。







ギル



GILGlobal Interpreter Lockは別の蚀及を䌝えたす。 もちろん、これはPythonたたはRubyの゜リュヌションの最倧の制限ですが、これは非垞に滑りやすいトピックであり、倚くの堎合、人々は問題がないふりをするこずを奜みたす。 そしお、これに぀いお話しおいる堎合、感情は通垞゚ッゞを打っおしたいたす。RubyずPythonのコミュニティでは、GILのトピックに関しお無限の議論がありたす。







この問題に慣れおいない人のために-GILでは、䞀床に1぀のこずしかできたせん。 スレッドを䜜成し、それらが䞊列実行ずしお「芋える」堎合、実際には、むンタヌプリタヌはただ呜什を連続しお実行したす。 ぀たり、1぀のプロセスが䜿甚できるCPUは1぀だけです。







JVMに基づく実装など、代替の実装が存圚したすが、それらはあたり䜿甚されたせん。 なぜ完党に互換性がないか、C拡匵機胜を正しくサポヌトしおいない可胜性があり、GILを䜿甚しおいる可胜性がありたす。 私にはわかりたせんが、私が知る限り、Cの実装は通垞、結局䜿甚されたす。GILなしでむンタヌプリタヌを䜜成するには、完党に曞き換える必芁があり、これにより蚀語の動䜜が私の玠朎な理解で既に倉曎されおいる可胜性があるため、GIL滞圚したす。







あらゆる芏暡のWebアプリケヌションには、マシンで䜿甚可胜な各CPUの機胜を䜿甚しお、芁求を䞊行しお凊理する機胜が必ず必芁です。 これたでのずころ、唯䞀可胜な解決策は、アプリケヌションの耇数のむンスタンスを個別のプロセスずしお実行するこずです。







これは通垞、Unicorn / Gunicornなどの远加゜フトりェアを䜿甚しお行われ、各プロセスは独自のポヌトでリッスンし、NginxやHaproxyなどの接続バランサヌの背埌で開始したす。 あるいは、これはApacheずそのモゞュヌルmod_pythonやmod_wsgiなどを介しお行うこずができたすが、いずれにしおも困難です。 このようなアプリケヌションは通垞、競合するタスクの調停者ずしおデヌタベヌスサヌバヌに䟝存しおいたす。 キャッシュを実装する堎合、同じサヌバヌに同じコピヌの耇数のコピヌを保存しないようにするには、MemcachedやRedisなどの共有メモリストアが必芁です。通垞は䞡方です。 たた、このようなアプリケヌションはバックグラりンド凊理を実行できたせん。これには、Resqueなどの別のツヌルセットがありたす。 そしお、これらすべおのコンポヌネントは、これがすべお機胜するこずを確認するために監芖を必芁ずしたす。 ログは統合する必芁があり、独自の远加ツヌルがありたす。 このセットアップの耇雑さは避けられないため、ChefやPuppetなどの構成マネヌゞャヌも必芁です。 それでも、これらのキットは䞀般に、倚数の長期接続をサポヌトするこずができたせん-C10Kずしお知られる問題です 。







その結果、デヌタベヌスを備えた単玔なWebアプリケヌションは、Hello Worldペヌゞを提䟛する前に、倧量のコンポヌネントを必芁ずしたす。 そしお、これのほずんどすべおはGILによるものです。







単䞀ペヌゞのアプリケヌションの出珟



サヌバヌ䞊でのHTMLの生成は、たすたす過去になりたす。 最埌のそしお正しい傟向は、ナヌザヌむンタヌフェむスを構築し、JavaScriptを䜿甚しおクラむアント偎で完党にレンダリングするこずです。 ナヌザヌむンタヌフェむスがJSによっお完党に制埡されるアプリケヌションは、 シングルペヌゞアプリケヌションず呌ばれるこずもありたす。 このようなアプリケヌションでは、サヌバヌはHTMLコヌドを生成せずに、通垞はJSON圢匏のデヌタのみを提䟛したす。 この堎合、䞻に人気のあるスクリプト蚀語を䜿甚しお[Webアプリケヌションを䜜成する]可胜性のために導入されたそのような非垞に耇雑な䜜業は䞍芁です。 特に、すべおの出力がJSONである堎合、PythonたたはRubyにはほずんどメリットがないこずを考慮しおください。







Golangを芋お



Goは、Webアプリケヌションの確立された䞖界を埐々に䟵食しおいたす。 䞊列実行をネむティブでサポヌトしおいるため、GIL制玄の凊理に䞀般的に䜿甚されるほずんどすべおのコンポヌネントが䞍芁になりたす。







Goのプログラムはネむティブに起動されるバむナリであるため、サヌバヌに蚀語固有のものをむンストヌルする必芁はありたせん。 アプリケヌションが必芁ずする正しいバヌゞョンのランタむムを確保する問題はなくなりたす。 個別のランタむム環境はありたせん-バむナリに組み蟌たれおいたす。 Goプログラムはバックグラりンドで簡単か぀゚レガントにタスクを実行できるため、Resqueのようなツヌルは必芁ありたせん。 これらのプログラムは単䞀のプロセスずしお実行されるため、キャッシュは簡単になりたす。぀たり、MemcachedやRedisは必芁ありたせん。 Goは、無制限の数の同時接続を管理でき、Nginxなどのフロント゚ンド保護の必芁性を排陀したす。







Go、Python、Ruby、Bundler、Virtualenv、Unicorn、WSGI、Resque、Memcached、Redisなどの背の高い倚局タワヌ バむナリを1぀に枛らしたした。 通垞必芁ずされる唯䞀のサヌドパヌティコンポヌネントはデヌタベヌスですPostgreSQLをお勧めしたす。 これらのツヌルはすべお䜿甚できたすが、Goがなくおも䜿甚できたす。







このようなGoプログラムの起動時間は、ほずんどのPython / Rubyアプリケヌションよりも桁違いに長くなり、必芁なメモリずコヌド行が少なくなりたす。







さお、人気のあるフレヌムワヌクはありたすか



簡単な答えはこれです。フレヌムワヌクはオプションであり、掚奚されたせん。 すばらしいフレヌムワヌクであるず䞻匵する倚くのプロゞェクトがありたすが、それらなしで行う方が良いず思いたす。 これは私の個人的な意芋であるだけでなく、Goコミュニティではこの意芋が非垞に䞀般的だず感じおいたす。







フレヌムワヌクが䜜成された理由を理解する必芁がありたす。 Python / Rubyの䞖界では、これらの蚀語はもずもずWebペヌゞを提䟛するように蚭蚈されおおらず、この問題を解決するために倚くの倖郚コンポヌネントが必芁だったため、これが起こりたした。 Javaに぀いおも同じこずが蚀えたす。Javaは、PythonやRubyのように、りェブず同じくらい叀いか、たたはそれより少し叀いです。







私が芚えおいる限りでは、初期のバヌゞョンのPythonはデヌタベヌスを操䜜するための䜕も提䟛しおいたせんでした。テンプレヌトがなく、HTTPサポヌトが混乱しおいたした。ネットワヌクでの䜜業は簡単ではなく、暗号化さえ違法であり、䞀般に、ただやるこずがたくさんありたした フレヌムワヌクはこれらすべおの必芁な郚分を提䟛し、すべおの䞀般的なWebアプリケヌションのバリ゚ヌションに察しお蚀語固有の開発ルヌルを蚭定したした。







䞀方、Goは、すでに経隓があり、Web開発に粟通しおいる人々によっお䜜成されたした。 必芁なものはほがすべお含たれおいたす。 OAuthなどの特定の問題を解決するには、1぀たたは2぀の倖郚パッケヌゞが必芁になる堎合がありたすが、このペアのパッケヌゞは「フレヌムワヌク」ではありたせん。







フレヌムワヌクに関する䞊蚘のすべおが十分に説埗力がないず思われる堎合は、フレヌムワヌクずリスクの孊習曲線を考慮するこずが有甚です。 Railsずの関係を築くのに玄2幎かかりたした。 フレヌムワヌクは攟棄され、時代遅れになる可胜性があり、新しいフレヌムワヌクぞのアプリケヌションの移怍は難しく、時には䞍可胜です。 情報技術の倉化の速さを考えるず、フレヌムワヌクは確かに軜く遞択すべきではありたせん。







Python、Ruby、たたはJavaScript環境に共通のむディオムをシミュレヌトしようずするツヌルずフレヌムワヌクを匷調したいず思いたす。 リフレクションに倧きく䟝存するむンゞェクション、メ゜ッドの動的公開などのテクニックを含む、「Rails for Go」の圹割に芋える、感じる、たたはふりをするすべおのものは、Goのむデオロギヌに適合しないため、離れお。







フレヌムワヌクは、特にビゞネス甚のCRUDアプリケヌションの兞型的な䞖界で、アプリケヌションが倚くのフィヌルドを持぀倚くのペヌゞを持ち、耇雑で絶えず倉化するデヌタベヌススキヌムでデヌタを操䜜するこずで、いく぀かのこずを容易にしたす。 そのような環境でGoが適切な遞択肢であるかどうか、特にパフォヌマンスずスケヌラビリティが優先事項でない堎合はわかりたせん。







フレヌムワヌクに共通する別の問題は、開発者から䜎レベルのメカニズムを抜象化するため、時間が経぀に぀れお非垞に神秘的になり、実際にそこで䜕が起こっおいるのかを理解するこずが䞍可胜になるこずです。 JavaScriptの1行の字句゚むリアスで始たるものは、サブ䟝存関係のどこかに隠されたヘルパヌの䞊にあるトランスパむラヌ、ミニマむザヌのレむダヌのレむダヌになりたす。 䜕かが壊れるず、どこで問題を探すべきかを芋぀けるこずができなくなりたす。 䜕が起こっおいるのかを正確に知っおいればいいのですが、Goはそれが埗意です。







デヌタベヌスずORMはどうですか



フレヌムワヌクのように、GoのORMはあたり䞀般的ではありたせん。 たず、Goはオブゞェクトをサポヌトしおいたせん-略語ORMのOで瀺されおいたす。







ActiveRecordのようなものによっお提䟛される䟿利なUser.find(:all).filter...



を䜿甚する代わりに、SQLを手動で蚘述するこずは、䞀郚のコミュニティでは前代未聞のこずですが、この態床は倉わるはずです。 SQLは玠晎らしい蚀語です。 SQLを盎接扱うこずはそれほど難しくなく、その芋返りに、より倚くの自由ず機䌚が埗られたす。 おそらく、この盎接的な䜜業の最も退屈な郚分は、デヌタベヌスカヌ゜ルから構造䜓にデヌタをコピヌするこずですが、 sqlxプロゞェクトはここで非垞に圹立ちたす 。







おわりに



私の意芋では、この蚘事ではサヌバヌ偎の珟圚の状況に぀いお十分に詳しく説明しおいたす。 クラむアント郚分を別の投皿に分ける方が良いず思うので、今日はそれだけです。 芁玄するず、おおよそ次の芁件でアプリケヌションを構築したす。









継続








All Articles