14
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

使いたい!ホットコードローディング

Last updated at Posted at 2015-12-22

Erlangといえば、まずが思い出したのはなんだろう?OTPとか、アクターモデルとか、パターンマッチとか、Erlangerにとってどちらも日々仕事の中で当たり前の概念になりましたよね。でもその中にはなんとかひとつ神秘な場所が存在するじゃない?暗くて危ない、都市伝説のような、それはホットコードローディングである。

Erlang地獄、そして最下層?

有名な Erlang 教科書『Learn you some Erlang for great good』の中で、ホットコードローディングについてこう書かれています

これからOTPの中で最も複雑で、理解しがたく、正しく動作させることが難しく、時間もかかる部分の内の1つについて話そうとしています。 事実、すべての手順(以下relupと呼びます)を避け、単純にVMを再起動し新しいアプリケーションを起動することで更新ができるなら、そちらを選ぶことをおすすめします。 relupは「殺るか殺られるか」のツールの1つです。 選択肢がほとんど無いときに使うものです。

ーー「25. プロセスの冒険でレベルを上げる」

怖そう!

確かに、Erlangの公式ドキュメントを覗けてみると、ホットコードローディング関連するトピックたくさんありそう

そして、ゴーゴルで検索したら、幾つのポストも出てくる:

オープンソースツールや使用例なども:

qiita にも:

でもやはり最初から把握したい、どこから初めていいのかをはっきりわかってほしい。だから今度は自分もホットコードローディングについてをちょっと説明します。もし少しでも参考になったら幸いです。

Hot and Cold

まず、Hot じゃなくて、一番慣れている Cold をみましょう

cold-upgrade.png

システムをstopして、それで必要な変更をしてから、もう一度うゼロからシステムをstartする。状態は保たられません。

Hotの場合はこうです

hot-upgrade.png

start/stopの代わりに、システムを稼働しているままで、直接状態を変換して、モジュールも置き換えます。

かっこいいじゃないこれ、Hotだよ。でも具体的にはどういう過程なのかな。

Erlang リリースの構造

Erlang、あるいはOTPの中の基本作用単位はアプリケーションとなります。それぞれのアプリケーションを組み合わせて、reltool (今はrelxが流行り)を利用して配布できるリリースを生成する。

release.png

この図を見ると、リリースは実はOSのようなものですね。Erlang自身のアプリケーションも、自分が書いたのアプリケーションも一緒にこのリリースいます。

appupとrelup

リリースのアップグレードって、実はアプリケーションのアップグレードです。しかもアプリケーションごとに異なる手順があります。ここでは appup の出番になりました。

appup.png

それで、appupを集めてrelupにするのはsystoolsです。このrelupはrelease_handlerに渡されって、やっとリリースはアップグレードできます。

relup.png

まとめ

こう見て意外と普通であたりまえの設計じゃない?

実は一番複雑なのはそのappupですね。なぜかといって、バージョンごとにアップグレードの手順も違いでしょう。汎用的な歩法まずはないと思います。詳しくはここで触れませんけど、上記したツールとポストをご参考してください。

とにかく、今日から使い始めよう、ホットコードローディング

14
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?