はじめに
Webアプリケーションを無料で手軽に動かす時にHerokuを使いますよね?
ただ無料で使う場合、アプリケーションを30分以上放置する(リクエストがない)と、サーバがスリープしてしまいます。
スリープ後にアプリケーションにアクセスすると、レスポンスが返ってくるまでに時間がかかってしまいます。そこで、起動時間を短縮するために、最近注目されているGraalVMとGraalVM上でJavaのWebアプリケーションを動かすことができるQuarkusを使ってみました。
今回はQuarkusをHerokuで動かす方法と、SpringBootとの起動時間の比較を行ってみたいと思います。
前提条件
- Herokuのアカウントを持っていること
Quarkusアプリケーションの用意
アプリケーションの作成
以下の記事を参考にアプリケーションの作成を行ってください。
Dockerファイル作成
今回はDockerレジストリにHerokuのコンテナレジストリを使います。
以下のファイルを作成してください。
src/main/docker/Dockerfile.web
FROM registry.fedoraproject.org/fedora-minimal
WORKDIR /work/
COPY *-runner /work/application
RUN chmod 775 /work
EXPOSE 8080
CMD ["./application", "-Dquarkus.http.host=0.0.0.0", "-Dquarkus.http.port=${PORT}"]
-Dquarkus.http.port=${PORT}
はHerokuで指定されたポートで起動するために必要です。これがないと起動できません。
ちなみに${PORT}の部分を変更することで、Quarkusアプリの起動ポートを変更できます。
Herokuコンテナにログイン
heroku container:login
Heroku上にアプリケーションを作成
heroku create <アプリケーション名>
以降はプロジェクトルートで行ってください。
Dockerレジストリにプッシュ
heroku container:push -R -a <アプリケーション名>
Docker起動
heroku container:release web -a <アプリケーション名>
動作確認
curl https://<アプリケーション名>.herokuapp.com/hello
helloが出力されることを確認します。
SpringBootアプリケーションの用意
アプリケーションの作成
RestController
@SpringBootApplication
@RestController
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
@RequestMapping("hello")
public String home() {
return "hello";
}
}
Dockerファイルの作成
Dockerfile
FROM openjdk:8-jdk-alpine
VOLUME /tmp
COPY target/app.jar app.jar
CMD ["java","-jar","app.jar","--server.port=${PORT}"]
以降の手順はQuarkusと同様のため割愛します。
スリープ後の起動時間を計測
以下のコマンドを実行し計測してみます。
Quarkusアプリケーションの計測
curl https://<Quarkusアプリケーション名>.herokuapp.com/hello -o /dev/null -w "%{time_starttransfer}\n" -s
7.038011
SpringBootアプリケーションの計測
curl https://<SpringBootアプリケーション名>.herokuapp.com/hello -o /dev/null -w "%{time_starttransfer}\n" -s
15.208555
QuarkusはSpringBootの1/2の時間で起動するという結果になりました