ããã¯ããªã«ããããæžãããã®ïŒ
åã«ãSpring Bootã®Graceful Shutdownãè©ŠããŠã¿ãŸããã
Spring BootのGraceful Shutdownを試す - CLOVER🍀
Quarkusã§ãåæ§ã®ããšãã§ããã¿ãããªã®ã§ãè©ŠããŠã¿ãŸããã
Graceful Shutdown
Quarkusã®Graceful Shutdownã¯ããã¡ãã«èšèŒããããŸãã
Application Initialization and Termination / Graceful Shutdown
ã¢ããªã±ãŒã·ã§ã³ãçµäºãããããšããæã«ãå®è¡ããŠãããªã¯ãšã¹ããããã°æå®ãããã¿ã€ã ã¢ãŠããŸã§
åŸ
ã€ããšãã§ããŸãã
Graceful Shutdownã¯ããã©ã«ãã§ç¡å¹ã«ãªã£ãŠããŠãquarkus.shutdown.timeout
ãèšå®ããããšã§æå¹ã«ãªããŸãã
All Configuration Properties / quarkus.shutdown.timeout
ç¡å¹ã«ãªã£ãŠããå Žåã¯ãã¢ããªã±ãŒã·ã§ã³ã¯å³åº§æã«çµäºããŸãã
æå¹ã«ããæã®æ³šæç¹ãšããŠã¯ããªã¯ãšã¹ãã远跡ããããè¥å¹²ããã©ãŒãã³ã¹ã«ããã«ãã£ãçºçããããšã®ããã§ãã
ã¿ã€ã ã¢ãŠãã®æéã®åäœã¯ãjava.time.Duration
ã®åœ¢åŒã§æå®ã§ããŸãã10s
ãšãã§ããã
ã§ã¯ããã¡ãã䜿ã£ãŠãã£ãŠã¿ãŸãããã
ç°å¢
ä»åã®ç°å¢ã¯ããã¡ãã§ãã
$ java --version openjdk 11.0.11 2021-04-20 OpenJDK Runtime Environment (build 11.0.11+9-Ubuntu-0ubuntu2.20.04) OpenJDK 64-Bit Server VM (build 11.0.11+9-Ubuntu-0ubuntu2.20.04, mixed mode, sharing) $ mvn --version Apache Maven 3.8.3 (ff8e977a158738155dc465c6a97ffaf31982d739) Maven home: $HOME/.sdkman/candidates/maven/current Java version: 11.0.11, vendor: Ubuntu, runtime: /usr/lib/jvm/java-11-openjdk-amd64 Default locale: ja_JP, platform encoding: UTF-8 OS name: "linux", version: "5.4.0-88-generic", arch: "amd64", family: "unix"
ãããžã§ã¯ããäœæãã
ãŸãã¯ãããžã§ã¯ããäœæããŸããextensionã¯ãRESTEasy Reactiveã®ã¿ã«ããŠãããŸãããã
$ mvn io.quarkus.platform:quarkus-maven-plugin:2.3.0.Final:create \ -DprojectGroupId=org.littlewings \ -DprojectArtifactId=resteasy-graceful-shutdown \ -DprojectVersion=0.0.1-SNAPSHOT \ -Dextensions="resteasy-reactive"
äœææã®æ å ±ã
[INFO] --- quarkus-maven-plugin:2.3.0.Final:create (default-cli) @ standalone-pom --- [INFO] Looking for the newly published extensions in registry.quarkus.io [INFO] ----------- [INFO] selected extensions: - io.quarkus:quarkus-resteasy-reactive [INFO] applying codestarts... [INFO] ð java ðš maven ðŠ quarkus ð config-properties ð§ dockerfiles ð§ maven-wrapper ð resteasy-reactive-codestart
ãããžã§ã¯ãå ã«ç§»åã
$ cd resteasy-graceful-shutdown
çæããããœãŒã¹ã³ãŒãã¯ããã£ããåé€ããŠãããŸãã
$ rm src/main/java/org/littlewings/ReactiveGreetingResource.java src/test/java/org/littlewings/*.java
JAX-RSãªãœãŒã¹ã¯ã©ã¹ãäœæãã
åäœç¢ºèªçšã®ãJAX-RSãªãœãŒã¹ã¯ã©ã¹ãäœæããŸãã
src/main/java/org/littlewings/quarkus/resteasy/HelloResource.java
package org.littlewings.quarkus.resteasy; import java.time.Duration; import java.util.Optional; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; import io.smallrye.mutiny.Uni; import org.jboss.logging.Logger; import org.jboss.resteasy.reactive.RestQuery; @Path("hello") public class HelloResource { Logger logger = Logger.getLogger(HelloResource.class); @GET @Produces(MediaType.TEXT_PLAIN) public Uni<String> message(@RestQuery Optional<Integer> sleepTime) { int s = sleepTime.filter(v -> v > 0).orElse(10); logger.infof("accept, sleep time = %d sec", s); return Uni .createFrom() .item("Hello World!!") .onItem() .delayIt() .by(Duration.ofSeconds(s)); } }
/hello
ã§Hello World!!
ãè¿ãã€ã€ãã¹ãªãŒãããå®è£
ã«ããŠããŸããã¹ãªãŒãããæéã¯ããã©ã«ãã§10ç§ã§ã
QueryStringã§ãæå®ã§ããããã«ããŠããŸãã
ã¹ãªãŒãããšæžããŸããããSmallRye Mutinyã§é 延å¿çãããæ¹æ³ã¯ãã¡ããåèã«ããŠããŸãã
Graceful Shutdownç¡å¹ã§ç¢ºèªãã
ãŸãã¯ããã®ç¶æ ã§ããã±ãŒãžã³ã°ã
$ mvn package
èµ·åã
$ java -jar target/quarkus-app/quarkus-run.jar
確èªã
$ time curl localhost:8080/hello Hello World!! real 0m10.023s user 0m0.012s sys 0m0.000s
ã¬ã¹ãã³ã¹ãè¿ã£ãŠãããŸã§ã«ã10ç§ããããŸãã
å床ããªã¯ãšã¹ããæããŸãã
$ time curl localhost:8080/hello
ããã§ãã¬ã¹ãã³ã¹ãè¿ã£ãŠãããŸã§ã«kill
ããŠã¿ãŸãã
$ kill `ps -ef | grep 'java -jar' | grep -v grep | awk '{print $2}'`
curl
ã«ã¯ãã¬ã¹ãã³ã¹ãè¿ããã«çµäºããŸãã
$ time curl localhost:8080/hello curl: (52) Empty reply from server real 0m1.514s user 0m0.006s sys 0m0.005s
ãŸããã¢ããªã±ãŒã·ã§ã³ã¯å³åº§ã«åæ¢ããŸãã
2021-10-18 23:39:38,257 INFO [io.quarkus] (Shutdown thread) resteasy-graceful-shutdown stopped in 0.039s
Graceful Shutdownãæå¹ã«ãã
ã§ã¯ãGraceful Shutdownãæå¹ã«ããŠã¿ãŸããapplication.properties
ã«ãquarkus.shutdown.timeout
ãè¿œå ããŸãã
src/main/resources/application.properties
quarkus.shutdown.timeout=15s
quarkus.shutdown.timeout
ã«ããã©ã«ãå€ã¯ãããŸãããä»åã¯ã15ç§ã«æå®ããŸããã
ããã±ãŒãžã³ã°ããŠ
$ mvn package
èµ·åã
$ java -jar target/quarkus-app/quarkus-run.jar
ãšããããã確èªã
$ time curl localhost:8080/hello Hello World!! real 0m10.032s user 0m0.010s sys 0m0.007s
次ã«ããªã¯ãšã¹ããæããŠ
$ time curl localhost:8080/hello
kill
ã
$ kill `ps -ef | grep 'java -jar' | grep -v grep | awk '{print $2}'`
ãããšãã¢ããªã±ãŒã·ã§ã³åŽã§ã¯Graceful Shutdownãå§ãŸããŸãã
2021-10-18 23:58:57,575 INFO [io.qua.ver.htt.run.fil.GracefulShutdownFilter] (Shutdown thread) Waiting for HTTP requests to complete
curl
ã«ã¯ãã¬ã¹ãã³ã¹ãè¿ã£ãŠããŸãã
$ time curl localhost:8080/hello Hello World!! real 0m10.019s user 0m0.008s sys 0m0.005s
ãããŠãã¢ããªã±ãŒã·ã§ã³ãåæ¢ããŸãã
2021-10-18 23:59:04,977 INFO [io.qua.ver.htt.run.fil.GracefulShutdownFilter] (vert.x-eventloop-thread-13) All HTTP requests complete 2021-10-18 23:59:05,017 INFO [io.quarkus] (Shutdown thread) resteasy-graceful-shutdown stopped in 7.443s
ããã§ãGraceful Shutdownã§çŸåšåŠçããŠãããªã¯ãšã¹ããåŸ
ã£ãŠãããã¢ããªã±ãŒã·ã§ã³ãåæ¢ããããšã
確èªã§ããŸããã
次ã¯ãGraceful Shutdownã®ã¿ã€ã ã¢ãŠããŸã§ã«åŠçãçµãããªããªã¯ãšã¹ããæããŠã¿ãŸãã
ã¢ããªã±ãŒã·ã§ã³ãèµ·åã
$ java -jar target/quarkus-app/quarkus-run.jar
ãªã¯ãšã¹ãã2ã€æããŠãããŸãã
# 1 request $ time curl localhost:8080/hello # 2 request $ time curl localhost:8080/hello?sleepTime=30
çæ¹ã¯ãç¶äºæéã§ãã15ç§ãããé·ãã¹ãªãŒããããŸãïŒ30ç§ïŒã
ãããŠãkill
ããŠåæ¢ã
$ kill `ps -ef | grep 'java -jar' | grep -v grep | awk '{print $2}'`
Graceful Shutdownãå§ãŸããŸãã
2021-10-19 00:07:18,711 INFO [io.qua.ver.htt.run.fil.GracefulShutdownFilter] (Shutdown thread) Waiting for HTTP requests to complete
10ç§ã¹ãªãŒãã®æ¹ã¯ãã¬ã¹ãã³ã¹ãè¿ã£ãŠããŸãã
$ time curl localhost:8080/hello Hello World!! real 0m10.173s user 0m0.005s sys 0m0.005s
30ç§ã¹ãªãŒããããæ¹ã¯åŸ ã¡ããããã¢ããªã±ãŒã·ã§ã³åŽãã·ã£ããããŠã³ããŸãã
2021-10-19 00:07:33,713 ERROR [io.qua.run.shu.ShutdownRecorder] (Shutdown thread) Timed out waiting for graceful shutdown, shutting down anyway. 2021-10-19 00:07:33,729 INFO [io.qua.ver.htt.run.fil.GracefulShutdownFilter] (vert.x-eventloop-thread-5) All HTTP requests complete 2021-10-19 00:07:33,759 INFO [io.quarkus] (Shutdown thread) resteasy-graceful-shutdown stopped in 15.048s
ã¿ã€ã ã¢ãŠãããããšãã°ã«æžãããŠããŸããã
ã¯ã©ã€ã¢ã³ãã«ããã¬ã¹ãã³ã¹ã¯è¿ããŸããã
$ time curl localhost:8080/hello?sleepTime=30 curl: (52) Empty reply from server real 0m16.793s user 0m0.011s sys 0m0.002s
æåŸã«ãã¢ããªã±ãŒã·ã§ã³ã®åæ¢ãå§ãŸã£ãåŸã«ãªã¯ãšã¹ããæããŠã¿ãŸãããã
ãŸãã¯èµ·åã
$ java -jar target/quarkus-app/quarkus-run.jar
å ã»ã©ãšåãããã«ããªã¯ãšã¹ãã2ã€ïŒçæ¹ã¯ç¶äºæéäžã«çµãããªããã®ïŒãæããŠãããŸãã
# 1 request $ time curl localhost:8080/hello # 2 request $ time curl localhost:8080/hello?sleepTime=30
kill
ã
$ kill `ps -ef | grep 'java -jar' | grep -v grep | awk '{print $2}'`
Graceful Shutdownãå§ãŸããŸãã
2021-10-19 00:23:36,794 INFO [io.qua.ver.htt.run.fil.GracefulShutdownFilter] (Shutdown thread) Waiting for HTTP requests to complete
ãã®æãè¿œå ã§ãªã¯ãšã¹ããæãããšãHTTPã¹ããŒã¿ã¹ã³ãŒã503ãè¿ãããšã確èªã§ããŸãã
$ time curl -i localhost:8080/hello HTTP/1.1 503 Service Unavailable connection: close content-length: 0 real 0m0.023s user 0m0.004s sys 0m0.009s
Spring Bootã§ã¯ãTomcatãJettyãReactor Nettyã䜿ã£ãŠããå Žåã¯ãããã¯ãŒã¯ã¬ãã«ã§åãä»ããåæ¢ãã
Undertowã䜿ã£ãŠããå Žåã¯503ãè¿ããšãã話ã ã£ãã®ã§ãUndertowã䜿ã£ãŠããæãšåãæåã«ãªã£ãŠããããšã«
ãªããŸããã
ãã£ãšããQuarkusã®å Žåã¯äœ¿ã£ãŠããã®ã¯Vert.xã§ããã
ããšã¯ããããŸã§ãšåãã§ãããGraceful Shutdownã®ã¿ã€ã ã¢ãŠãæéå ã«çµãããã®ã¯ã¬ã¹ãã³ã¹ãåŸãããŸããã
$ time curl localhost:8080/hello Hello World!! real 0m10.129s user 0m0.009s sys 0m0.010s
ã¿ã€ã ã¢ãŠããåŸ ã¡ãããªããã®ã¯ãã¢ããªã±ãŒã·ã§ã³ãåæ¢åŸã«
2021-10-19 00:23:51,795 ERROR [io.qua.run.shu.ShutdownRecorder] (Shutdown thread) Timed out waiting for graceful shutdown, shutting down anyway. 2021-10-19 00:23:51,814 INFO [io.qua.ver.htt.run.fil.GracefulShutdownFilter] (vert.x-eventloop-thread-0) All HTTP requests complete 2021-10-19 00:23:51,834 INFO [io.quarkus] (Shutdown thread) resteasy-graceful-shutdown stopped in 15.041s
å¿çãåŸãããªãã£ãããšã確èªã§ããŸãã
$ time curl localhost:8080/hello?sleepTime=30 curl: (52) Empty reply from server real 0m17.131s user 0m0.006s sys 0m0.005s
ããã§ãQuarkusã®Graceful Shutdownã®åãã¯ç¢ºèªã§ããããªããšæããŸãã
å®è£ ãŸããã«ã€ããŠ
å°ããQuarkusã®Graceful Shutdownã®å®è£ ãŸãããèŠãŠãããŸãããã
Graceful Shutdownãæå¹ã«ããããã®ããããã£ã
ãã®ããããã£ã«å€ãæå®ããŠãããšãGracefulShutdownFilter
ãè¿œå ãããŸãã
ãã¡ãã§ããã
GracefulShutdownFilter
ã¯ShutdownListener
ã®å®è£
ã§ãããããã¯ã·ã£ããããŠã³ããã»ã¹ãå¶åŸ¡ããããã®
ãªã¹ããŒã§ãã
ã¿ã€ã ã¢ãŠãã¯ã©ãã§ç®¡çããŠããããšãããšããã¡ãã«ãªããŸãã
ãã®åŠçã¯ãã¢ããªã±ãŒã·ã§ã³ã®åæ¢æã«åŒã³åºãããŸãã
åæ¢æã«åŒã³åºãããä»çµã¿ã¯ãShutdownHookã«ãªããŸãã
ãŸãšã
Quarkusã®Graceful Shutdownãè©ŠããŠã¿ãŸããã
Spring Bootã®æãšåæ§ãç°¡åã«äœ¿ããŠãåããããããããã£ãã§ããã