Erlangといえば、まずが思い出したのはなんだろう?OTPとか、アクターモデルとか、パターンマッチとか、Erlangerにとってどちらも日々仕事の中で当たり前の概念になりましたよね。でもその中にはなんとかひとつ神秘な場所が存在するじゃない?暗くて危ない、都市伝説のような、それはホットコードローディングである。
Erlang地獄、そして最下層?
有名な Erlang 教科書『Learn you some Erlang for great good』の中で、ホットコードローディングについてこう書かれています
これからOTPの中で最も複雑で、理解しがたく、正しく動作させることが難しく、時間もかかる部分の内の1つについて話そうとしています。 事実、すべての手順(以下relupと呼びます)を避け、単純にVMを再起動し新しいアプリケーションを起動することで更新ができるなら、そちらを選ぶことをおすすめします。 relupは「殺るか殺られるか」のツールの1つです。 選択肢がほとんど無いときに使うものです。
怖そう!
確かに、Erlangの公式ドキュメントを覗けてみると、ホットコードローディング関連するトピックたくさんありそう
そして、ゴーゴルで検索したら、幾つのポストも出てくる:
オープンソースツールや使用例なども:
qiita にも:
でもやはり最初から把握したい、どこから初めていいのかをはっきりわかってほしい。だから今度は自分もホットコードローディングについてをちょっと説明します。もし少しでも参考になったら幸いです。
Hot and Cold
まず、Hot じゃなくて、一番慣れている Cold をみましょう
システムをstop
して、それで必要な変更をしてから、もう一度うゼロからシステムをstart
する。状態は保たられません。
Hotの場合はこうです
start/stopの代わりに、システムを稼働しているままで、直接状態を変換して、モジュールも置き換えます。
かっこいいじゃないこれ、Hotだよ。でも具体的にはどういう過程なのかな。
Erlang リリースの構造
Erlang、あるいはOTPの中の基本作用単位はアプリケーションとなります。それぞれのアプリケーションを組み合わせて、reltool (今はrelxが流行り)を利用して配布できるリリースを生成する。
この図を見ると、リリースは実はOSのようなものですね。Erlang自身のアプリケーションも、自分が書いたのアプリケーションも一緒にこのリリースいます。
appupとrelup
リリースのアップグレードって、実はアプリケーションのアップグレードです。しかもアプリケーションごとに異なる手順があります。ここでは appup の出番になりました。
それで、appupを集めてrelupにするのはsystoolsです。このrelupはrelease_handlerに渡されって、やっとリリースはアップグレードできます。
まとめ
こう見て意外と普通であたりまえの設計じゃない?
実は一番複雑なのはそのappupですね。なぜかといって、バージョンごとにアップグレードの手順も違いでしょう。汎用的な歩法まずはないと思います。詳しくはここで触れませんけど、上記したツールとポストをご参考してください。
とにかく、今日から使い始めよう、ホットコードローディング