Kubernetes の導入時に考えるべきこと

Azure にシステム導入・移行するお客様に日頃ご支援をさせていただいているのですが、多くのお客様やエンジニアの皆様から、たびたび似たようなご質問を頂くので、その内容をここに紹介したいと思います。(実際、今日もとあるお客様で下記のご相談を頂いたので)

ご質問:

お客様からたびたび頂くご質問の例

  • このシステムを Kubernetes (AKS) 上で構築するのは正しいですか?
  • とあるコンサルから Kubernetes を導入しないと会社の未来はないと言われたのですが、本当ですか?
  • 今、Azure Web App for Container か AKS (Kubernetes) の何れかの選択で悩んでいるのですが、どちらが良いですか?
  • 今、このような Kubernetes(AKS) のシステム構成を考えているのですが、正しいですか?

質問の背景:

これらのご質問は、メッセージは異なるのですが基本的には同じ質問です。結局どのような場合に kubernetes (AKS) を活用するのが効果的なのかが理解出来ていないため出てくる質問です。

個人的には当たり前になっていたので、この手の内容はまとめなくても良いかな?と思っていたのですが、度々、お問い合わせを頂くので多くの方がお悩みなのかな?と思ったのと、今日ミーティングに同席された方から、ぜひまとめて欲しいとのご要望を承ったので書くことにしました。

ご質問いただいた際の私の対応:

このようなご質問をいただく際、私からは必ず、質問者に対して下記の2つを問い合わせます。

  1. そのシステムは変更の激しいシステムですか?例えば今後サービスの追加は多いですか?もしくは修正が多いですか?
  2. コンテナ化するサービスは大量の CPU やメモリのリソースを消費しますか?

Kubernetes を選択するか否か:

A. Kubernetes が適する場合

上記の質問に対する答えに対し、1 が「はい」、2 が「いいえ」 の条件を共に満たす場合は Kubernetes の導入が適するかと思います。(前提:アジャイル、DevOps などが出来る環境が整っている会社の場合)

1: はい (変更が激しい)
2: いいえ (大量の CPU/メモリは消費しない)

B. Kubernetes が適さない場合:

一方で、上記の質問に対する答えに対し、1 が「いいえ」、2 が「はい」の条件のどちらか片方でも条件を満たす場合は、Kubernetes の導入は適さないと思います。

1: いいえ (変更は激しくない)
2: はい (大量の CPU,メモリを消費する)

理由:

システムは変更の激しいシステムか否か

まず、1 の質問の背景はマイクロサービス化をしたいと考えるお客様に対しても同様の質問をするのですが、「変更」には2つの観点があります。一つは、「既存のサービスに対し頻繁な更新・バージョン・アップ」、そしてもう一つは「新機能の追加が多くある」です。

「既存のサービスに対し頻繁な更新・バージョン・アップ」が必要な場合、一早いサービスの入れ替えが必要になります。それを実現するためには、アジャイルでの開発を実践し、DevOps でビルドやリリースのパイプラインを自動化していきます。そして、古いバージョンから新しいバージョンに安全に入れ替えるために、ローリング・アップデートやブルー・グリーン・デプロイ、カナリー・デプロイなどの手法を用いて入れ替えていく必要があります。
その際、システム構築スピードであったり、構築やサービス入れ替えの容易性が重要になってきます。デプロイ先として IaaS を選ぶ場合、VM の構築には時間が掛かります。そして上記のようなローリング・アップグレードやブルー・グリーン・デプロイ、カナリー・デプロイなどの手法を取り入れるためには、ご自身でこれらを実現するための環境を整える必要があり多大な労力を伴います。
こうした手間や労力を軽減してくれるのが PaaS (Azure では Azure Web App)であったり Kubernetes(AKS) になります。

この時点では、まだ選択肢として PaaS, Kubernetes 何れもありうる状況ですが、次に考えるのがもう一つの「新機能の追加が多くある」か否かです。デプロイするサービス数が増えて来たり、サービス間の連携などが増えてくると、PaaS では管理が煩雑になる場合があります。その場合、Kubernetes クラスター内でまとめて管理をする方がサービス間の管理やサービス全体の運用管理が楽になったり見通しが楽になったりします。
具体的なサービスの追加数は、個々のシステムや企業における運用・管理ポリシーによって異なるので本来ならば明示は避けたい所ですが、追加するサービス数が 5-10 程度ならば、迷わず PaaS をお勧めします。
しかし、サービス数が、20を超えるようならば Kubernetes の導入をお勧めします。
もちろん、 5-10 程度でも Kubernetes をご利用いただいても良いかと思いますが、導入するサービス数に対して、運用・管理、さらに学習コストの方が高くつくのではないかと想定します。

CPU やメモリのリソースを消費するか否か

また、2 の稼働させるサービスは「大量の CPU やメモリのリソースを消費しますか?」についてですが、こちらも選択する際の重要な要素と考えています。

Kubernetes 上で稼働する Pod (コンテナを束ねた物) が実際にはどこで動いているのかを考えて頂くと納得していただけるのですが、Pod(コンテナ) は、実際には、Kubernetes クラスタのノード上で動いています。ノードは実際には 1VM になります。例えば Kubernetes クラスタを 3 ノード (3 VM) で構成し、各ノードの VMに CPU 4 コア、16GB の VM を割り当てた場合を考えます。

この場合、3ノード全体で利用できる CPU やメモリーのリソースは下記の通りです。

CPU: 4 Core * 3 node = 12 Core(1200m)
Memory: 16 Gb * 3 node = 48 GB

自身が提供するサービスは、上記の 12 Core, 48 GB を超えてスケール・アウト(増やす)事は出来ません。実際には、Kubernetes を動作させるために必要な管理用の Pod(kube-system内のpod)で利用する CPU や Memory のリソースも含まれるため、上記の MAX 分までを自身のサービスを利用することも出来ません。

極端な例でわかりやすく説明すると、仮に自身が提供するサービスが 1 Pod (コンテナ) あたり CPU 1Core 分を消費するようなアプリケーションの場合、1ノードあたり 2 〜 3 Pod、トータルで 6 〜 10 pod 位しか作れないのです。また、1 Pod (コンテナ) あたり 2 GB 位メモリを消費するようなアプリの場合は、約 20 pod 位しか作れないことになります。
もし、CPU や メモリーを大量に消費するようなサービスを提供したい場合は、わざわざ Node の CPU やメモリを共有する Kubernetes 環境で提供するよりも、IaaS 環境で 1 VM に1サービスをデプロイして提供した方が、Kubernetes のオーバヘッドもなく、パフォーマンスも発揮するかと想定します。

つまり、Kubernetes で提供するサービスは、簡単にスケール・アウトしやすいサービスのデプロイには向いていますが、パフォーマンスを上げるためにスケール・アップが必要なサービスには向かないと考えています。
その場合、IaaS でも PaaS でも Serverless でも違う選択肢を考えた方が良いかと思います。

さいごに

Kubernetes は決して銀の弾丸ではないため、どうぞ適材・適所で稼働に向くサービスを稼働させるようにしてください。

広告

2019年7月20日 at 1:51 AM コメントを残す

Quarkus: コンテナ上で Java アプリを高速起動する新しい手法のご紹介

Docker 環境上で Java のアプリを起動するのは遅いと思っていらっしゃる方は必見!!
どうぞ下記の内容をご参照いただき、どうぞお試しください!!

先日、Red Hat から Quarkus (https://quarkus.io) という新しい技術が発表されました。こちらを実際に試して見ましたが、想定通りというか、まさにこれを待っていた!!という技術でした。今後、私の中で注目の技術の一つになりそうです。もし、Docker/k8s 上で Java アプリを動かす方は、こちらの方法をご覧いただき、ぜひ試しください。

Quarkus を簡単にご説明すると、Java のソースコードを GraalVM を利用して Linux の Native バイナリを作成し、その Linux バイナリをコンテナ上で起動することにより、今まで Java アプリの課題であった起動時間を大幅に短縮することができる技術です。

※ GraalVM については、きしださんや Java Champion である阪田さんがまとめてくださっていますので、ここではその詳細説明を割愛させていただきます。
* GraalVMについて (きしださん)
* 詳説GraalVM(1) イントロダクション(阪田さん)

事前準備

GraalVM を入手したのち、.bash_profile などに環境変数 GRAALVM_HOME を指定しておきます。

GRAALVM_HOME=/Library/Java/JavaVirtualMachines/graalvm-ce-1.0.0-rc13/Contents/Home
export GRAALVM_HOME

それでは、実際に試して見ましょう。

1. Quarkus のクィック・スタートに従い Java のプロジェクトを作成します

$ mvn io.quarkus:quarkus-maven-plugin:0.11.0:create \
    -DprojectGroupId=org.acme \
    -DprojectArtifactId=getting-started \
    -DclassName="org.acme.quickstart.GreetingResource" \
    -Dpath="/hello"

プロジェクトを作成すると下記のようなファイルが作成されます。

├── pom.xml
└── src
    ├── main
    │   ├── docker
    │   │   └── Dockerfile
    │   ├── java
    │   │   └── org
    │   │       └── acme
    │   │           └── quickstart
    │   │               └── GreetingResource.java
    │   └── resources
    │       └── META-INF
    │           ├── microprofile-config.properties
    │           └── resources
    │               └── index.html
    └── test
        └── java
            └── org
                └── acme
                    └── quickstart
                        ├── GreetingResourceTest.java
                        └── NativeGreetingResourceIT.java

2. Java のソースコードをビルドし Linux の Native バイナリを作成します

$ mvn package -Pnative -Dnative-image.docker-build=true

-Dnative-image.docker-build=true は Docker on Linux 上で実行するバイナリを生成する事を明示するオプションです。これを指定しない場合、ビルドをした環境(例えば Mac OS/X なら Mac )用のバイナリが生成されます。

2.1 作成された Linux 用のバイナリを確認します


target ディレクトリ配下に成果物ができあがります。

$ ls -l target/getting-started-1.0-SNAPSHOT-runner
-rwxr-xr-x 1 yoterada staff 20112760 3 11 13:52 getting-started-1.0-SNAPSHOT-runner

2.2 file コマンドでファイル内容を確認すると Linux ELF バイナリが作成されています

$ file getting-started-1.0-SNAPSHOT-runner
getting-started-1.0-SNAPSHOT-runner: ELF 64-bit LSB executable, 
x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, 
for GNU/Linux 2.6.32, BuildID[sha1]=61ef9e78267993b688b9cf2de04e2aff9f1a4bfa, 
with debug_info, not stripped

3. Docker のビルド

Dockerfile のサンプルも下記の Dockerfile が自動的に作成されていますので、こちらをそのまま利用してビルドを行います。
17行目の COPY でビルド時に生成された Linux ELF バイナリを追加しています。

自動生成された Dockerfile

####
# Before building the docker image run:
#
# mvn package -Pnative -Dnative-image.docker-build=true
#
# Then, build the image with:
#
# docker build -f src/main/docker/Dockerfile -t quarkus/getting-started .
#
# Then run the container using:
#
# docker run -i --rm -p 8080:8080 quarkus/getting-started
#
###
FROM registry.fedoraproject.org/fedora-minimal
WORKDIR /work/
COPY target/*-runner /work/application
RUN chmod 775 /work
EXPOSE 8080
CMD ["./application", "-Dquarkus.http.host=0.0.0.0"]

Dockerfile からコンテナ・イメージをビルドしてください。

$ docker build -f src/main/docker/Dockerfile -t tyoshi2002/quarkus-quickstart:1.0 .

4. Docker の起動


作成したコンテナ・イメージを利用してコンテナを起動します。

$ docker run -i --rm -p 8080:8080 tyoshi2002/quarkus-quickstart:1.0
2019-03-11 05:10:42,697 INFO [io.quarkus] (main) Quarkus 0.11.0 started in 0.005s. Listening on: http://0.0.0.0:8080
2019-03-11 05:10:42,699 INFO [io.quarkus] (main) Installed features: [cdi, resteasy]

私の環境では 0.005 秒で CDI+REST アプリが起動できました。
Quarkus 0.11.0 started in 0.005s. Listening on: http://0.0.0.0:8080

5. 動作確認


curl コマンド、もしくはブラウザを利用して起動したアプリケーションにアクセスします。

$ curl http://localhost:8080/hello
hello

6. 備考


Quarkus は開発モード(Development Mode)も用意されており、開発時にホット・デプロイもできるようになっています。
ホット・デプロイを行うためには、下記のコマンドを実行します。

$ mvn compile quarkus:dev

こちらで起動したのち、ソースコードを修正しコンテンツを再読み込みします。
すると、再起動は不要で修正されたコードの内容を確認することができます。

7. 注意事項


Quarkus で内部的に利用されている CDI の実装 (ArC と呼ぶ) は、CDI の仕様に完全準拠しているのではなく、一部の仕様を実装したサブ・セットの実装になっています。下記にそれぞれ CDI におけるサポート、未サポートの機能についての機能一覧が説明されていますので、こちらをどうぞご確認ください。
CDI でサポートされている機能一覧
CDI で未サポートの機能一覧

8. Extension

Quarkus のアプリケーションに対して、追加のエクステンションを追加できます。追加可能なエクステンションのリストは下記から参照できます。

$ mvn quarkus:list-extensions
Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8
[INFO] Scanning for projects...
[INFO] 
[INFO] ----------------------< org.acme:getting-started >----------------------
[INFO] Building getting-started 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] 
[INFO] --- quarkus-maven-plugin:0.11.0:list-extensions (default-cli) @ getting-started ---
[INFO] Available extensions:
[INFO] 	 * Agroal - Database connection pool (io.quarkus:quarkus-agroal)
[INFO] 	 * Arc (io.quarkus:quarkus-arc)
[INFO] 	 * AWS Lambda (io.quarkus:quarkus-amazon-lambda)
[INFO] 	 * Camel Core (io.quarkus:quarkus-camel-core)
[INFO] 	 * Camel Infinispan (io.quarkus:quarkus-camel-infinispan)
[INFO] 	 * Camel Netty4 HTTP (io.quarkus:quarkus-camel-netty4-http)
[INFO] 	 * Camel Salesforce (io.quarkus:quarkus-camel-salesforce)
[INFO] 	 * Eclipse Vert.x (io.quarkus:quarkus-vertx)
[INFO] 	 * Hibernate ORM (io.quarkus:quarkus-hibernate-orm)
[INFO] 	 * Hibernate ORM with Panache (io.quarkus:quarkus-hibernate-orm-panache)
[INFO] 	 * Hibernate Validator (io.quarkus:quarkus-hibernate-validator)
[INFO] 	 * Infinispan Client (io.quarkus:quarkus-infinispan-client)
[INFO] 	 * JDBC Driver - H2 (io.quarkus:quarkus-jdbc-h2)
[INFO] 	 * JDBC Driver - MariaDB (io.quarkus:quarkus-jdbc-mariadb)
[INFO] 	 * JDBC Driver - PostgreSQL (io.quarkus:quarkus-jdbc-postgresql)
[INFO] 	 * Kotlin (io.quarkus:quarkus-kotlin)
[INFO] 	 * Narayana JTA - Transaction manager (io.quarkus:quarkus-narayana-jta)
[INFO] 	 * RESTEasy (io.quarkus:quarkus-resteasy)
[INFO] 	 * RESTEasy - JSON-B (io.quarkus:quarkus-resteasy-jsonb)
[INFO] 	 * Scheduler (io.quarkus:quarkus-scheduler)
[INFO] 	 * Security (io.quarkus:quarkus-elytron-security)
[INFO] 	 * SmallRye Fault Tolerance (io.quarkus:quarkus-smallrye-fault-tolerance)
[INFO] 	 * SmallRye Health (io.quarkus:quarkus-smallrye-health)
[INFO] 	 * SmallRye JWT (io.quarkus:quarkus-smallrye-jwt)
[INFO] 	 * SmallRye Metrics (io.quarkus:quarkus-smallrye-metrics)
[INFO] 	 * SmallRye OpenAPI (io.quarkus:quarkus-smallrye-openapi)
[INFO] 	 * SmallRye OpenTracing (io.quarkus:quarkus-smallrye-opentracing)
[INFO] 	 * SmallRye Reactive Messaging (io.quarkus:quarkus-smallrye-reactive-messaging)
[INFO] 	 * SmallRye Reactive Messaging - Kafka Connector (io.quarkus:quarkus-smallrye-reactive-messaging-kafka)
[INFO] 	 * SmallRye Reactive Streams Operators (io.quarkus:quarkus-smallrye-reactive-streams-operators)
[INFO] 	 * SmallRye Reactive Type Converters (io.quarkus:quarkus-smallrye-reactive-type-converters)
[INFO] 	 * SmallRye REST Client (io.quarkus:quarkus-smallrye-rest-client)
[INFO] 	 * Spring DI compatibility layer (io.quarkus:quarkus-spring-di)
[INFO] 	 * Undertow (io.quarkus:quarkus-undertow)
[INFO] 	 * Undertow WebSockets (io.quarkus:quarkus-undertow-websockets)
[INFO] 
Add an extension to your project by adding the dependency to your project or use `mvn quarkus:add-extension -Dextensions="name"`
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.696 s
[INFO] Finished at: 2019-03-11T19:45:32+09:00
[INFO] ------------------------------------------------------------------------

上記のリストを元に、追加するエクステンションの groupId と artifactId を指定し追加ができます。

$ mvn quarkus:add-extension -Dextensions="groupId:artifactId" 

例:

$ mvn quarkus:add-extension -Dextensions="io.quarkus:quarkus-smallrye-health" 

9. さいごに


Quarkus は他に、CompletionStage を利用した非同期処理の実装や、JUnit のテストも REST Assured を利用して非常に書きやすくなっており、全体的にとても良くできた技術だと感じています。
ご興味ある方はぜひ、お試しください!

その他の Java on Azure に関する日本語情報へのリンク

2019年3月11日 at 3:27 PM 1件のコメント

Kubernetes を本番環境に適用するための Tips

先日 JAPAN CONTAINERDAYS v18.12 に参加し 「40 Topic of Kubernetes in 40 Minutes」 という内容で 40 個の Kubernetes に関するトピックを 40 分でご紹介する内容を発表させていただきました。

第一弾の記事:JAPAN CONTAINERDAYS v18.12 での発表について

時間の関係上、セッション中でも詳しくお伝えできなかった所もあるので、ここで真意も含めて共有したいと思います。特に Kubernetes に関連した Topic 26-33 の部分を詳しくご紹介します。



26. すべての k8s 機能を利用する必要はない
Please Remember J2EE !!

27. 複雑な構成を作らない
運用構成を変えればできることを無理して k8s でしない
Simple is the Best

28. K8s にはポータビリティがある?
ある点とない点がある

29. どのバージョンを利用していますか?
バージョン毎に設定や機能の差異がある

30. 大規模 k8s クラスタを構築しない !!
ノード数を多く作らない

31. K8s のバージョン・アップは慎重に!!

32. ボリュームを扱う際には注意しましょう
Persistence Volume は極力使わないで

33. DB はマネージド・サービスを利用 !!
開発環境は OK !! でも本番は NG !!


26. すべての k8s 機能を利用する必要はない
Please Remember J2EE !!

今、Kubernetes は急速な勢いでエコシステムを拡大しています。エコシステム全体を通すと、並行して 2000 を超えるプロジェクトが走っており、日々何か新しい k8s 関連のツールや機能ができていると言っても過言ではありません。これは、もちろん Kubernetes のコンセプトが素晴らしく、多くの可能性が秘められているため、多くの方が賛同しこの状況が生まれていると思います。一方で、私は過去の経験から、今の急速な k8s の拡大に危惧している点もあります。出来る事が多くなればなる程、教育コストや運用・管理コストは大きくなっていきます。

私は Java を古くから見ている人間なので、今の状況を J2EE の時と同じような目で見ています。全てのエンタープライズ開発のニーズに応える為に J2EE はどんどん肥大化していき、結果として複雑で扱いづらくなりました。J2EE 当時は XML での設定でしたが、今 k8s では YAML で設定してます、そして YAML が辛いとか言ってらっしゃるのをお見かけします。ちょっと似てますね。

自分のやりたい事、実現したいことに対して、本当に、k8s の全機能は必要でしょうか?

例えば、マイクロサービスを作って行く事を考えると、Deployment は必須で一番の核となる機能です。一方で、それ以外の機能はどうでしょうか?すべてのマイクロサービス開発者や運用者にとって必要でしょうか?(理解しておくのは必要ですが使うかどうかは別)例えば、Job にしても Cron Job にしても、本当に k8s で実行する必要あるのでしょうか?他の別の場所でも実行出来ませんか?全てを k8s 中心で考えるのではなく、こうした事を考えるのはとても重要です。また DaemonSet にしても log を収集したりする際には設定が必要ですが、マイクロサービスを開発する多くの場合においては、多くの開発者にとっては必要無いでしょう。こうした考えを持つ事で、優先的にどの技術から検証をして行けば良いのか優先づけを行う事ができるようになります。

古いたとえですが、
J2EE で言うところの「JSP, Servlet は便利で使うけど、EJB は難しいし設定も大変なので積極的には使わない」というのに似ています(おっさんなので例えが古く、若い方にはわからない例え話で申し訳ありませんが)

でもこれ以外にも、J2EE と (k8s + エコシステム)って色々な点で良く似ているなと思います。例えばコンテナの Init Container や Pod の PostStart や PreStop なんて、Java で言う所のコンストラクタであったり、PostConstruct, PreDestroy と同様の概念ですし、Istio なんかは、AOP(Aspect Oriented Programming)をコンテナの世界に持ってきたような物です。つまり、今までエンタープライズ Java とかをやってきた人にとっては、k8s は決して目新しい物ではなく、今まで Java でやってきた事がコンテナに置き換わったんだなと思える部分は多々あると思います。

その観点で言うと、時代は繰り返すと言いますが、J2EE において Struts や Spring が出てきたように、今の k8s に対して、新しい簡単で軽量な別のオーケストレーション・ツールが出てきてもおかしくないかな?それを作った人は第二の Rod Johnson (Springの作者)になり、もしかしたらそこに新しい別のビジネスチャンスがあるのでは?と思う位です。

結局、ここで何が言いたいかと言うと、k8s に僕たちが使われるのではなく、k8s の便利な機能を私たちが選んで使うんだ!と言う気持ちや感覚が大切なのです。

無理して全部使わなくても良いし別の手段があるならば別を使っても良いと思っています。

27. 複雑な構成を作らない
運用構成を変えればできることを無理して k8s でしない
Simple is the Best

これも、26 によく似た話なのですが、k8s では複雑な構成を組むこともできます。名前空間の概念があるので、1つの k8s クラスタでマルチテナントとか、開発、テスト、本番環境を構築することも「できます」。さらに、RBAC も利用できる為、各ユーザ毎に細かい認証・認可の設定も「できます」。

でも、やります?

できるのと、実際やるかどうかは別の話で、少なくとも本番環境と他は分けるべきと私は思っています。本番環境のアプリと開発・テストのアプリが同一 Linux VM で動作するのは気持ち悪いです。
頑張って、名前空間を切り RBAC を設定し、さらには NodeSelector や Node Affinity の設定をして特定の POD を特定の Node (Linux VM) 上で走らせる事で影響を少なくできるでしょう。確かにできるのですが、やればやるほど設定は増えて行くし、設定ミスを誘発しやすくなります。そして設定をミスした時の影響はより大きくなります。

そこで、設定にしても構成にしても難しい構成にしないように留めておくべきと私は考えます。なぜなら人間は必ずミスをするからです。

私ならば、本番環境と開発・テスト環境などを分けて構築します。本番環境を触れられる人を物理的に制限しておく方が RBAC で一生懸命頑張って設定するよりも簡単ですし、確実に守れるからです。このように構成を変える事で簡単にそしてより安全にできるならば、そちらを選んだ方が私は良いのではないかと思っています。

28. k8s にはポータビリティがある?
ある点とない点がある

k8s で良く言われることに、k8s はポータビリティがあるから導入したいとか、k8s にするとベンダーロックインがなくなり移行しやすいと言われる事があるのですが、これは正しくもあり間違いもあります。

一部の設定に限って言うと同じ設定を他の環境で動かすこともできます。

しかし、細かい話をすると、実際にはノードで動いている Linux VM の種類やカーネルバージョン、さらにはコンテナ・ランタイム(Docker)のバージョンも各環境で違います。また、筆者は Azure Kubernetes Engine を利用してカスタムの k8s クラスタ環境を構築した経験もありますが、利用するテンプレートによって、機能が有効になったり無効になったりと構築時のオプション指定で、同じ k8s バージョンでも利用できる機能、できない機能を使い分ける事ができます。
これは、同じバージョンの k8s でも環境によっては使える機能、使えない機能があると言う事を示しています。

さらに言うと、k8s はご存知の通りバージョン・アップが頻繁に行われていますが、バージョンが変わる事で YAML の書き方や、場合によってはコマンドの引数が変わることまであります。
各ベンダーで提供している k8s のバージョンも時期によってメジャーバージョンやマイナーバージョンで差異が大きくありますので、全く同時期に同じバージョンのクラスタを構築するのは難しいかもしれません。

同じベンダーの k8s を利用した場合であっても、バージョンが異なると動かなくなる可能性があるのに、異なるベンダー環境 (OS, コンテナ・ランタイム(Docker)) で動かす事は本当にポータビリティがあると言って良いのでしょうか?

プレゼンでの発表時は例として、LoadBalancer や Volumeが違うことを例にあげましたが、それだけではない差がある事を、ここでお分かりいただけるかと思います。

私は、ポータビリティがあるからといって k8s の事をお勧めされる方のお話にはご注意くださいと、お客様には申し上げています。

29. どのバージョンを利用していますか?
バージョン毎に設定や機能の差異がある

28 で既に、バージョンの差異における課題について申し上げましたが、上記のような理由からどのバージョンを利用しているのかを強く意識する必要があります。

30. 大規模 k8s クラスタを構築しない !!
ノード数を多く作らない

AKS では 100 ノード、AKS Engine を使うと 1200 ノードまで、Kubernetes のノード数を増やす事が「できます」。もちろん、ニーズに応じて大規模クラスタを構築して1つのクラスタ内で全てを完結したいと思われる方もいらっしゃるでしょう。しかし、それほど大規模なクラスタを構築するのが果たして本当に必要なのかどうなのか十分に考えてお作りください。特に、メンテナンス性を考えて構築することを強くお勧めします。

たとえば、仮に1度クラスタを作ってしまえば、クラスタのメンテナンスが一切不要と言うことでしたら、大規模クラスタを構築するのもありでしょう。しかし実際には k8s もメンテナンスが必要です。各ノードの Linux VM にパッチを適用する必要もありますしバージョン・アップが必要になる場合もあります。各ノードをローリング・アップグレードで更新し完了するまでどれ程の時間を要するでしょうか。またそのメンテナンスの際、ノードが予期せぬ不具合にあった場合、もしくは API サーバ(管理サーバ)にトラブルが発生した場合どのような事態が発生するかを考えてみていただけないでしょうか。最悪の場合 k8s クラスタが壊れてまったく操作できなくなる事もありえます。その場合、またイチから 100-1200 ノードの k8s クラスタを構築するのにどれくらい時間がかかるでしょうか。再構築する間は一切のサービスが受けられなくなる程の大影響を及ぼしてしまいます。

POD を利用しコンテナ・レベルでいくら、マイクロサービスの考えに従って回復性や、可用性やスケールなどを考えていても、一番下側の VM 側がメンテナンスしやすいように作られていなければ、結局モノリシックに構築しているのと全く変わらなくなってしまいます。1つのクラスタに対するトラブルで全サービスに影響が出てしまいます。

私ならば、k8s のクラスタレベルでも適度なサイズ(もちろんマイクロやミニのレベルではなくてよく)、ミドルサイズくらい、もっと言うならば何か不足な事態が発生してもすぐに対応がしやすいようなサイズで構築することをお勧めします。限界にチャレンジしてもあまり良いことはないように思います。

31. K8s のバージョン・アップは慎重に!!

30 でも少しバージョン・アップに対して触れましたが k8s のバージョン・アップはとても危険を伴います。ベンダーが提供するバージョン・アップ・ツールやコマンドを利用すると簡単にバージョン・アップが「できる」でしょう。ただしその恩恵が得られるのは、コマンドやツールが正常に完了した場合のみです。コマンドやツールが失敗する事もありますし、その場合、最悪クラスタが壊れる事もありえます。

さらに言うならば、k8s はバージョン・アップする事で古い YAML の設定ファイルが、新しいバージョンの環境で必ず動くと言う保証はどこにもありません。そのような事態が発生する可能性がある中で、それを実行しますか?
本番サービスに直ちに影響を及ぼしても良いでしょうか?

せっかく、Deployment や Istio などを使って、ブルー・グリーン・デプロイやカナリー・デプロイなどの手法を使って、pod レベルでは本番に影響しないように頑張っても、クラスタ・レベルでも同様の事を考えていなければ意味がありません。影響は pod の比ではないほど甚大です。

もし、k8s クラスタのバージョン・アップをするならば、私ならば k8s レベルでも、新規にクラスタを構築し、リクエストのルーティングをクラスタ・レベルで 8:2 などで試しながら安全にバージョン・アップしていくでしょう。

32. ボリュームを扱う際には注意しましょう
Persistence Volume は極力使わないで

追記:この項目は Azure 用です (2018/12/07)

k8s では PV (Persistence Volue), PVC (Persistence Volume Claim) を利用して外部ストレージをマウントする事ができます。しかし、筆者の経験では PV や PVC を扱いボリュームをマウントさせた際に、今まで様々な問題に遭遇してきました。

代表的なのは下記の URL の記事のような問題です。

* How to Understand & Resolve “Warning Failed Attach Volume” and “Warning Failed Mount” Errors in Kubernetes on Azure
* Getting Unstuck with EBS: Primer on How to Use Docker and EBS

簡単に説明します。Deployment で2つの replica を常時起動しているように設定し、それぞれの pod にボリュームを1つづつマウントさせる場合を考えます。

1 pod に 1 ボリュームをマウントした場合、内部的にそれぞれ Attatch, Detach の状態を保持しているのですが、仮に1つの Pod が不意に死んだ場合、綺麗にボリュームのマウント状態を Detach してくれない場合があります。
この場合、k8s のスケジューラは1つが停止したため、新しい Pod の再作成を試みますが、ボリュームが Detach されていないため、再作成の Pod がマウントするボリュームがないため再起動に失敗する場合があります。一応、コマンドを打てば修正する方法はあるのですが、pod がいつ不意に停止するかは想定できません。

また、それ以外にもボリュームのメンテナンスはそれなりに大変です。実際にボリュームのマウントには時間を要します (実装に応じて異なる)。そして、k8s v1.13 までは、使用中のボリューム・サイズを拡張する事は出来ませんでしたので、マウントしているボリュームがいっぱいになると別のボリュームを再作成しマウントし直すなどの必要もありました。(v 1.13 に対応しているのはまだ少ないので多くの方がまだこの状況)

さらには、k8s や AKS の GitHub の Issue を見ても数多くの PV, PVC に関する問題が報告されています。

https://github.com/kubernetes/kubernetes/issues
https://github.com/Azure/acs-engine/issues

将来的には、PV, PVC のクオリティも向上し、利用する場面におけるベストプラクティスなどが出て安心して使用できるようになる時がくる事が期待されますが、現時点では、私ならば極力本番環境には適用したくないと言うのが本心です。

もしも、違う方法で回避ができるならばそちらの方法をお勧めしています。
例えば、ファイルの保存などが目的なのであれば、Stroage 用の SDK を使ってプログラム側から直接、保存・更新・削除などを実装する方法をお勧めしています。こちらの方が、POD 増加・減少それぞれにおいてもスケールしますし、Attach, Detach を気にする事もありません。

追記:2018/12/07 ここから —



また、上記以外でも私は、PV, PVC を積極的に採用しない理由があります。
実装するアプリケーションやサービス側から見て、static でマウントするにせよ dynamic でマウントするにせよ、1:1 でマウントする場合は、ボリュームのメンテも必要になります。なぜならはk8s の v1.13 まではボリューム・サイズを固定で設定しなければならずボリュームの拡張もできません。結果として管理項目も増えます。そしてアプリケーションのスケールの観点でもスケールがし辛くなります。

私ならば、プログラム的に Azure Storage などの外部ストレージに書き出した方が、アプリケーションのスケールもしやすいと考えますし、ディスク管理や制限に対する考え方も容易になります。

プログラムやサービス側からは、インメモリ・グリッドのような横にスケール・アウトさせる事ができるようなサービスを利用する方が、アプリケーションをスケールさせ易いので、私ならば、こうした違う方法を模索します。

そして、同僚の真壁さん (@tmak_tw) からのご意見はコチラ




追記:2018/12/07 ここまで —

それでも、もちろんボリュームをマウントして使いたいと言うニーズもあると思います。その際は上記のようなことが発生する可能性や他にも issue に上がっているような問題を認識した上でお使いいただく事で問題が発生した時に迅速に対応ができるようになるかと思います。ぜひお気をつけてお使いください。

33. DB はマネージド・サービスを利用 !!
開発環境は OK !! でも本番は NG !!

追記:この項目は Azure 用です (2018/12/07)

32. の「ボリュームを極力使わないでください」の延長線上で、ボリュームを扱うサービスは極力外に出したいです。例えば、代表的な所で DB が一番最初にきますが、プライベートの Docker レジストリや、Git のレポジトリなどボリュームを扱かわなければならないようなサービスは k8s の中ではなく、極力外で管理をしたいです。特に DB などのサービスはマネージドな DB の方が自分で管理をするよりも簡単に安全にご使用できる場合がありますので、仮想ネットワーク経由で安全な接続を利用した上で外部サービスに接続する方法をお勧めしたいと思います。

ご参考:AKS access to Azure Database for MySQL via VNet

最後に

k8s は今、エンタープライズ・システムの構築に必要な機能やサービスを、どんどんと追加しています。その際に、我々は一旦立ち止まって、全てを k8s 上に実装しなくても良いのでは?という考えを持つ事が重要なのではないかと思います。
それにより簡単に運用管理ができるような場面もあると思いますし、思い切ってここは使うけど、ここは使わないと言うご検討をいただくのがより有効にご活用いただけるようになるのではないかと思います。

この記事は 2018 年 12 月時点で、私が k8s HackFest などを通じて経験してきた内容をまとめていますが、もちろん今後 k8s は品質も向上しさらなる機能追加も行われていくと思います。今後、私たちは常に k8s の最新動向をウォッチしながら、できる事と、試す事、実際に本番に適用する事を分けて考えて考えて行かなければならないと思います。

ご自身にとって最適な構成をご検討・構築いただければ誠に幸いです。

私も完璧な人間ではありませんので、もし、ここは違うよなどがあれば、この記事をもとに議論したりさらなるご検討をいただければ誠に幸いです。

2018年12月6日 at 8:20 PM 1件のコメント

JAPAN CONTAINERDAYS v18.12 での発表について

先日 JAPAN CONTAINERDAYS v18.12 に参加し 「40 Topic of Kubernetes in 40 Minutes」 という内容で 40 個の Kubernetes に関するトピックを 40 分でご紹介する内容を発表させていただきました。

1-16 のトピックについては当日はデモをしながら説明をしたのですが、参加してくださった方のお一人が具体的に私がどのようなデモをしたのかをまとめてくださっていました。(誠にありがとうございます。)

Topic 1-16 のまとめ記事はコチラ。
Container Days × kubernetes(k8s) × 「40 topic of kubernetes in 40 minutes」メモ

今回の私の発表内容には賛否両論があるかと思いますが、この内容は、2018 年 12 月の現時点で、私が私のお客様に対してお伝えする、Kubernetes(k8s) を本番環境に対して適用する際の注意ポイントをまとめた内容です。

まず、私の立ち位置を簡単にご紹介しますと、私は k8s の製品営業でも k8s の担当エンジニアでもございません。k8s の良さを理解しつつ、正しい所で正しく使っていただきたいと思っているエンジニアです。もし、提供するサービスが k8s にあっていなければ、違う方法を選択したほうが良いですよと私のお客様には言っています。そして、それによって扱うエンジニアが幸せになり、企業もより良いサービスを素早く提供していただきたいと考えています。

余談ですが、実話としてあるお客様から以前こんなご相談を受けました。

相談者:「寺田さん、御社では無い方からこのような事を言われまして」
某営業さん:「このシステムを将来的にコンテナ化し k8s を導入しないと駄目だ!将来がなくなる」
相談者:「えっ?えっ?」
相談者:「寺田さん、本当なんですか?」
寺田:「どのようなシステムなんですか?」
相談者:「こんなシステムで、今はこのような開発人員構成です」
寺田:「それなら、無理にしなくていいです」

最初に話を伺った際に、マジかこの営業?お客様を地獄の底に連れて行きたいのか?と思ったくらいでした。

k8s は確かに素晴らしいので、上手く使いこなせばとても大きな効果を得られます。しかし、扱い方を間違えると効果が得られないばかりでなく、余計管理コストは高くつき大変な思いをすることにもなるでしょう。

今回のイベント会場の懇親会会場でも別の方から、下記のようなご質問をいただきました。
「エンドのお客様がコンテナ化や k8s 化に期待しており、会社としてやらなければならないのだが、上司から今までと作り方もやり方は変えられない。」
寺田:「いえ、それコンテナ化してもメリット無いですよ!」

このようなやりとりは、今の日本に少なからずあると思うのです。k8s を導入したらそれだけで幸せになれると思っているのでしょうか?

まず、その場合に私が最初にお伺いするのは下記のような内容です。

「サービスは今後どのように成長して行きますか?」
「もっというならば、新機能の追加は今後数多くありますか?」
「作ったサービスの改良やバージョンアップは頻繁にありますか?」

共に YES ならば k8s を検討し始めても良いですし、そうでなければ違う道を模索して良いと思います。

実は、このセッションは私の、k8s を扱うまでの三部作シリーズの3本目のコンテンツになります。

1. 今後の開発ビジョン


2. Java on Kuberenetes on Azure

3. 40 Topic of Kuberenetes in 40 Minutes

1 に関しては、Kubernetesは銀の弾丸ではない――エンジニアが生き残るために必要な技術とは【デブサミ2018 関西】に発表内容がまとめられていますので、こちらをご参考にいただければと思います。k8s を扱うその前に、心構えであるとかバックグラウンドを説明したのがこちらです。

ポイントは、「どのような時に、そして何のために k8s を使うのか?」を考える事がとても重要だと言う事です。

実際に k8s を扱うにしても、出来る事は数多くあります、その際、この機能は必要?別のほうが簡単じゃない?管理が楽になるんじゃ無い?と思うならば、率先して違う手段も考えるのも良いと思います。いや、それでも k8s のここが便利だから使って、いち早くサービスを提供・展開したいと思って初めて、k8s を扱う土俵に立てるのだと思います。

こうした背景を踏まえて、三部作の3つ目として作成したのが今回のコンテンツでした。特に 26-33 の項目は、おそらく今まで誰も表立って触れてこなかった内容だと思いますので、あえてこの場を借りて発表しました。

時間の関係上、セッション中でも詳しい点をお伝えできなかった所もあるので、ここで真意も含めて共有したいと思いますが、長くなるので別エントリに分けます。

本エントリの続きはこちら
第2弾:Kubernetes を本番環境に適用するための Tips

2018年12月6日 at 1:36 PM 1件のコメント

最近の Microsoft の Java 事情とインタビュー記事の日本語化

はじめに:最近の Microsoft における Java について


この記事の本題に入る前に、マイクロソフトの Java 活動にとって、とても嬉しい情報を共有いたします。私が入社したのは約2年半前になります。その際私以外にグローバルで Java on Azure に関する啓蒙活動をしている方は一人 (Brian Benz) しかいませんでした。そして私の入社から2年半を経て、この直近数ヶ月の間に 3 人もの Java 関連の方々がマイクロソフトに入社してきてくださいました。その内二人は元オラクルで、一人は、TomEE を提供する Tomitribe から入ってきてくださいました。

Bruno Borges (Developer Advocate)
Jonathan Giles (Developer Advocate)
Theresa Nguyen (Sr. Product Marketing Manager)

この中で、Bruno Borges は去年の JavaOne San Francisco で基調講演にも登壇したブラジル人で、オラクル時代から Java のコミュニティとの関係が強く、様々なカンファレンスなどで登壇しています。一時期ブラジルにいる頃 Java EE エバンジェリストをしていたこともあったように記憶しています。そして彼はマイクロソフトで Java の Developer Advocate チームを率いるという話を聞いています。

また、Jonathan は私同様 Sun Microsystems 出身で、彼はエンジニアリングチームに所属し、JavaOne のコンテンツ選定委員 (CFP で応募されたコンテンツを選定する側) を務めたり、JavaOne の優秀なスピーカーにだけ与えられる称号 Java Rock Star の称号も持っています。さらに昨年 Duke’s Choice Award なども受賞している、ガチの Java エンジニアです。

最後に、Java 専門のプロダクトマネージャとして最近入社されたのは、TomEE (Tomcat をベースとした Java EE コンテナ) を提供する Tomitribeで Vice President を務めていた方が入社してきてくださいました。

いずれの方も、グローバルでは Java 開発者コミュニティーから認知度の高い、Java コミュニティに精通する方ばかりです。Jonathan はJava SDK の API 実装においても Java らしい実装のレビューなどに多大な貢献が期待されますし、Bruno にはグローバルの Java コミュニティに対して、幅広くコンタクトしてくれると思いますので、ますます Java on Azure の拡大に期待が持てる、そんなハイアリングとなりました。前述した Brian と共に、この 4 名と一緒に Java on Azure の啓蒙活動を続けていく事をとても楽しみにしています。

下記のエントリの内容は、先日上記の Jonathan Giles からインタビューを受けましたので、インタビュー内容 (オリジナルの英語) を日本語化した内容を記載します。

Jonathan Giles からのインタビューの日本語訳


今日から Azure で Java を利用、または開発している方々とのインタビューシリーズを開始しています。 すでに他にも何名ものインタビューを企画しているため、これをシリーズ化したいと考えています。私からインタビューを受けたい方は、私にご連絡ください。

最初のインタビューは、Java チャンピオンであり、JUG リーダーでもある寺田 佳央さんです。彼は日本マイクロソフトで働く Java エバンジェリストで、私と彼は Sun Microsystems と Oracle で共に働いていたので、以前から彼の事を知っていました。 寺田さんは Java に長くそして深く関わっていますので、彼とのインタビューを喜んでいます。どうぞ読者の皆様もお楽しみください。

こんにちは寺田さん – みなさんに自己紹介をしていただけないでしょうか?


このような素晴らしい機会を与えていただきありがとうございます。 私は 2015年7月から日本 マイクロソフト でJava Evangelist として働いています。また Japan Java Users Group の幹事メンバーの一人でもあります。

マイクロソフトに入社する前は、日本 Sun Microsystems で GlassFish エバンジェリストとして働いていました。 Oracle による Sun の買収後、日本 Oracle で Java/Java EE のエバンジェリストとして5年間働いていました。 日本 Oracle での私の仕事は、JavaOne Tokyo、Java Day Day Tokyo、Java ユーザーズ・グループのイベントなど、日本の多くの Java 関連のイベントで、企画、運営・管理、登壇などをしていました。そして、マイクロソフト入社後 2016 年 7 月、私は Java チャンピオンになりました。

あなたはしばらくの間マイクロソフトで勤めているんですね。私はちょうど 12 月にマイクロソフトに入社したばかりなので、私よりもとても長いですね。私たちは二人とも比較的にた経歴を持っています。私もSun Microsystems と Oracle で勤めていましたが、私は開発のエンジニアリング・チームに所属していました。
私はあなたにマイクロソフトにおける Java の印象について聞きたいです。そして Java に関して時間がたつにつれてマイクロソフトがどのように変わったのか教えていただけないでしょうか?

マイクロソフト入社前、私の経歴が Unix と Java に携わる事が多かったため、マイクロソフトで働くことを全く想像していませんでした。しかし、現在マイクロソフトはクラウドプラットフォームの企業になっています。そこで .NET や Windows、Office 製品だけでなく、Unix やその他のプログラミング言語も強く推進しています。 すでに Azure のシステムの 30% 以上が Linux 上で稼働しており、これらのシステムでは多くの顧客が Azure 上で Java を使用しています 。 たとえば、 Pivotal Cloud FoundryService FarbricOpenShiftKubernetes などがあります。Java 開発者が Azure でサービスを実行するための選択肢はたくさんあります 。

日本を拠点とするマイクロソフトのJavaエバンジェリストとしての日々どのような事をされているのですか?


最近は、Java のエバンジェリストとして、お客様のために多くの HackFest を開催しています。HackFest ではお客様が実際にビジネスをされている上でかかえる課題について直接改善してまいります。 お客様と NDA を締結した上で、お客様のソースコードにアクセスし、改善のためのアドバイスや直接ソースコードを編集する事もあります。いままでの経験を活かして、Azure におけるシステム運用方法や、アーキテクチャ設計に関するアドバイスなどを行います。

たとえば、最近ハックフェストを実施したとあるお客様では、オンプレミスで運用されている既存の Java Web アプリケーションを Azure 上のコンテナに移行したいと考えていらっしゃいました。当初、お客様は Kubernetes についてよくご存知ではなかったのですが、 HackFest を通じて Azure Container Service (AKS) の構築方法や、操作方法について情報を提供し、結果として、わずか5日間で既存のシステムを AKS に移行することができました。2日間で Lift & Shift し、残りの 3 日間で、ソースコードに手を加え、例えば Serverless の Azure Functions 等も試され、アプリケーションのモダナイズを行いました。HackFest では開発の視点だけでなく、運用的な観点からも助言しています。 その結果、そのお客様はこの HackFest の成果に非常に満足されていました。

この HackFest は、Azure をご利用される世界中の Java 開発者も利用できます。 読者のみなさまの中で Azure 上で Java を利用し、それを有効活用したい、そのために私のような Java エバンジェリストと緊密に会話したい場合は、私に連絡するか、各国に存在するエバンジェリストに HackFest についてお問い合わせください(※ 実際には HackFest を実施するためには利用可能なテクノロジー領域に条件があります)。 また私自身、マイクロソフトのグローバル組織に所属していますので、HackFest への参加のご要望をいただいた場合、国を問わず、北米、ヨーロッパ、ブラジルなど世界中のさまざまな場所に参加できるかもしれません。

Azure は Java(または Kotlin、Scala などの JVM 上の言語)を基盤とする開発者や組織に適していますか?


はい、Azure は Java 開発者にとって適しています。多くのサービスで Java SDK が用意され、開発は頻繁に行われています。 また一部のサービスでは SDK が存在しないものもありますが、Azure では多くのサービスが RESTful インターフェイスを提供しているため、任意のプログラミング言語からこれらのサービスにアクセスできるようになっています。たとえば、Office 365 をご利用されている場合は、REST 呼び出しで Office 365 を操作することも可能です。

おそらく、マイクロソフトであなたはいくつかのクールなデモやチュートリアルを時間をかけて作成してきたと思います。読者が興味をもちそうなプロジェクトや GitHub のレポジトリについてご紹介いただけないでしょうか?

すべてのデモやプロジェクトを公開しているわけではありませんが、私は GitHub リポジトリに多くのデモとサンプルをアップロードしています。

最新のデモには、多くの面白い最新技術を含んでいます(スライドはこちら)。 1回のデモに含めた Azure の技術要素として下記を含んでいます。

Azure の Bot Framework を利用して Slack からメッセージの送受信を行うチャット・ボットを作成しています。このチャット・ボットの処理の実装には、Serverless の「Azure Functions for Java」を利用しています。Slack から k8s の「アカウントサービスのポッド数を増やしてください」という質問を投げかけると、Azure Functions は LUIS を呼び出して、文を解析しどの意図(入力内容を判定)が最も適切かを判断します。その結果、Kubernetes 上で稼働するアカウントサービスのポッド数を増やします。

仮に「顧客サービスのポッド数を減らしてください」と入力すると、Kubernetes の「顧客サービス」は減少します。 このように、私はチャットボットから Azure のKubernetes を操作できるようにしています。

さらに Microsoft Translator のデモも行なっています。上記のチャット・ボットではテキストでの入力を行いましたが、このデモでは音声入力を行います。 たとえば、Microsoft Translator に対して「アカウントサービスのポッド数を増やしてください」または「顧客サービスのポッド数を減らしてください」と言葉で語りかけると、Azure 上の Kubernetes のポッド数が増減します。

上記のすべてを Java で実装し、Java 開発者が利用できる多くの Azure サービスを利用しています。

エバンジェリスト(または私のようなクラウド・デベロッパー・アドボケイト)は、開発者や利用者などとの対外的な会話と、社内開発チームとの会話のバランスをとることが重要です。 私はすべてのデベロッパー・アドボケイトがこの範囲で異なる優先順位を持っていると思います。私自身は、ドキュメント、APIの改善など、開発者の経験を向上させることに重点を置いています。あなたは、この範囲においてどこに優先順位を置いて仕事をなさっていますか?

私は開発者やお客様と直接会話をするのが好きです。もちろん、私は API を変更したりドキュメントを改善する必要がある場所を見つけることが多いので、必要に応じてやっています。ただ、まだ多くのお客様が CI/CD、マイクロサービス、Cognitive ServicesAzure FunctionsMicrosoft TranslatorIoTPowerBI などの利点についてご存知ないので、これらの技術を Java 開発者の皆様やお客様にその利点や利用方法や実装方法について紹介していきたいです。

昨今 Azure は非常に多くのサービスを提供し、その多くは本当に素晴らしいサービスです。 あなたが今より詳細に調査していることは特にありますか、全体的にあなたの好きなサービスは何ですか?

これはとても難しい質問です。なぜなら、マイクロソフトの技術と世界的な技術トレンドは以前と比べとても速く変化しているためです。 ちょうど今私が上で紹介したデモンストレーションは、現時点で私が好きな、そしてお勧めの技術から構成しています しかし、上記に取り上げた Kubernetes だけでなく、Pivotal Cloud FoundryOpenshift も非常に面白いです。

特に、お客様が巨大なデータセンターを所有されている場合は、 Azure Stack の利用をご検討いただくことをお勧めします。Pivotal Cloud Foundry も Azure Stack 上で動作します。運用における管理コストを削減したい場合、Azure Stack は選択肢の 1 つになります。

マイクロソフトは歴史的に Java の非サポートで知られていますが、最近はマイクロソフトが真にオープンソースに舵をきり大きな進歩を遂げたと思います。Java エンジニアと会話をしてAzure を紹介するとき、参加者の皆様の印象は如何でしょうか?

約2年半前、私は日本マイクロソフトに加わりました。当時すでに一部の開発者やエンジニアの中で、マイクロソフトの変化に気づいている方がいらっしゃいました。 しかしこの2年間で、私はマイクロソフトの印象がさらに変化していると感じています。私はお客様やコミュニティのメンバーとコミュニケーションをとるとき、ほとんどの人から肯定的なフィードバックをいただいています。

特に、AI 技術の観点でマイクロソフトについて多くの肯定的なフィードバックをいただいています。 build 2016 のカンファレンスで AI プロトタイプを発表したSatya Nadella の発表を見たとき、私は本当に感銘を受け、私の周りのすべてのJava開発者にビデオを共有しました。このビデオは、我々が将来を想像すると、エンジニアが世界を変える方法を示しました。本当に素晴らしい内容でした!Cognitive Services のすべてを Java アプリケーションから利用できることも重要です。

初めて他のエンジニアに Cognitive Services のデモンストレーションを行った際、多くの開発者が私もこれを試したいと言いました。 私はこの技術が世界を変えることができると思っていましたが、この技術が会社の将来をも変えることができると私は考えました。

インタビューのお時間をとっていただきありがとうございました。最後に、他にコミュニティの皆様にメッセージがあれば頂けないでしょうか?

私は過去2年間、マイクロソフトで働いており、多くのツール、テクノロジ、サービスが Java 開発者にとって利用できることを理解してきました。たとえばプログラマの皆様にとっては、Visual Studio Team Services(VSTS)はソースコード管理や運用を行うために、ぜひご利用いただきたいサービスです。CI/CD におけるビルドとデプロイのパイプラインを使用することができます。もちろん開発チームに応じて Jenkins のような他の CI/CDツール をご利用されたい場合もあるでしょう、この場合にも、VSTSからそれらのツールにアクセスできるようになっています。

またコンテナ技術をご利用されたい場合は、Web App for Container, Azure Container Service(AKS)Azure Container Instance(ACI)Pivotal Cloud FoundryOpenShift などのご利用のニーズに応じてコンテナ環境を構築できます。さらに、IoT、BigData、NoSQLなどをご利用したい場合は、マイクロソフトは、それらのサービスを提供しています。

私は、エンジニアが想像することができれば、エンジニアが世界を変えることができると信じています!そして私は、そのような素晴らしい Java の開発者の皆様とともに時間を過ごしたいと思います。 私は Java が大好きです!

2018年2月22日 at 8:30 AM 1件のコメント

Azure Functions for Java Preview Release

この度、San Francisco で開催された JavaOne 2017 で、Microsoft は Azure Functions の Java 版を Preview 版として公開しました。本エントリーでは、ちょとだけ試してみましたので、その内容をご紹介します。

Mac OS/X の環境で Azure Functions を動作させるためには下記の環境が必要です。環境が整っていない場合、インストール・実行が正しくできない場合があります。必要な環境にご注意ください。

Azure Functions のローカル実行環境のインストール
Local Execution Environment Install

$ sudo npm i -g azure-functions-core-tools@core --unsafe-perm
Password:

> azure-functions-core-tools@2.0.1-beta.18 uninstall /Users/tyoshio2002/.nodebrew/node/v8.6.0/lib/node_modules/azure-functions-core-tools
> node lib/uninstall.js

deleting /Users/tyoshio2002/.azurefunctions/bin
/Users/tyoshio2002/.nodebrew/node/v8.6.0/bin/func -> /Users/tyoshio2002/.nodebrew/node/v8.6.0/lib/node_modules/azure-functions-core-tools/lib/main.js
/Users/tyoshio2002/.nodebrew/node/v8.6.0/bin/azfun -> /Users/tyoshio2002/.nodebrew/node/v8.6.0/lib/node_modules/azure-functions-core-tools/lib/main.js
/Users/tyoshio2002/.nodebrew/node/v8.6.0/bin/azurefunctions -> /Users/tyoshio2002/.nodebrew/node/v8.6.0/lib/node_modules/azure-functions-core-tools/lib/main.js

> azure-functions-core-tools@2.0.1-beta.18 postinstall /Users/tyoshio2002/.nodebrew/node/v8.6.0/lib/node_modules/azure-functions-core-tools
> node lib/install.js

+ azure-functions-core-tools@2.0.1-beta.18
updated 1 package in 112.93s

次に、Maven コマンドで Azure Functions のプロジェクトを作成します。

$ mvn archetype:generate -DgroupId=com.yoshio3  -DinteractiveMode=false  -DartifactId=AzureFunctionTest
Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8
[INFO] Scanning for projects...
[INFO] 
[INFO] ------------------------------------------------------------------------
[INFO] Building Maven Stub Project (No POM) 1
[INFO] ------------------------------------------------------------------------
[INFO] 
[INFO] >>> maven-archetype-plugin:2.4:generate (default-cli) > generate-sources @ standalone-pom >>>
[INFO] 
[INFO] <<< maven-archetype-plugin:2.4:generate (default-cli) < generate-sources @ standalone-pom <<<
[INFO] 
[INFO] 
[INFO] --- maven-archetype-plugin:2.4:generate (default-cli) @ standalone-pom ---
[INFO] Generating project in Batch mode
[INFO] No archetype defined. Using maven-archetype-quickstart (org.apache.maven.archetypes:maven-archetype-quickstart:1.0)
[INFO] ----------------------------------------------------------------------------
[INFO] Using following parameters for creating project from Old (1.x) Archetype: maven-archetype-quickstart:1.0
[INFO] ----------------------------------------------------------------------------
[INFO] Parameter: basedir, Value: /Users/tyoshio2002/NetBeansProjects/Azure-Function-Test2
[INFO] Parameter: package, Value: com.yoshio3
[INFO] Parameter: groupId, Value: com.yoshio3
[INFO] Parameter: artifactId, Value: AzureFunctionTest
[INFO] Parameter: packageName, Value: com.yoshio3
[INFO] Parameter: version, Value: 1.0-SNAPSHOT
[INFO] project created from Old (1.x) Archetype in dir: /Users/tyoshio2002/NetBeansProjects/Azure-Function-Test2/AzureFunctionTest
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 6.258 s
[INFO] Finished at: 2017-10-28T13:24:07+09:00
[INFO] Final Memory: 15M/223M
[INFO] ------------------------------------------------------------------------

プロンプト無しで Maven プロジェクトを作成したい場合の実行例:

mvn archetype:generate -DinteractiveMode=false -DarchetypeGroupId=com.microsoft.azure -DarchetypeArtifactId=azure-functions-archetype -DgroupId=com.yoshio3 -DartifactId=Java-Azure-Functions -Dversion=1.0-SNAPSHOT -Dpackage=com.yoshio3 -DappName=Java-Azure-Functions -DappRegion=westus2

デフォルトで Hello World のコードが生成されます。

package yoshio3.com;

import com.microsoft.azure.serverless.functions.annotation.*;
import com.microsoft.azure.serverless.functions.ExecutionContext;
import java.util.logging.Level;

/**
 * Hello function with HTTP Trigger.
 */
public class Function {
    @FunctionName("hello")
    public String hello(@HttpTrigger(name = "req", methods = {"get", "post"}, authLevel = AuthorizationLevel.ANONYMOUS) String req,
                        ExecutionContext context) {
        return String.format("Hello, %s!", req);
    }

このサンプル・コードをビルドします。

$ mvn clean package
Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8
[INFO] Scanning for projects...
[INFO] 
[INFO] ------------------------------------------------------------------------
[INFO] Building Azure Java Functions 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO] 
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ azure-functions-test ---
[INFO] Deleting /Users/tyoshio2002/NetBeansProjects/Azure-Function-Test1/azure-functions-test/target
[INFO] 
[INFO] --- maven-resources-plugin:3.0.2:resources (default-resources) @ azure-functions-test ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory /Users/tyoshio2002/NetBeansProjects/Azure-Function-Test1/azure-functions-test/src/main/resources
[INFO] 
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ azure-functions-test ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 1 source file to /Users/tyoshio2002/NetBeansProjects/Azure-Function-Test1/azure-functions-test/target/classes
[INFO] 
[INFO] --- maven-resources-plugin:3.0.2:testResources (default-testResources) @ azure-functions-test ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory /Users/tyoshio2002/NetBeansProjects/Azure-Function-Test1/azure-functions-test/src/test/resources
[INFO] 
[INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ azure-functions-test ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 1 source file to /Users/tyoshio2002/NetBeansProjects/Azure-Function-Test1/azure-functions-test/target/test-classes
[INFO] 
[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ azure-functions-test ---
[INFO] Surefire report directory: /Users/tyoshio2002/NetBeansProjects/Azure-Function-Test1/azure-functions-test/target/surefire-reports

-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8
Running yoshio3.com.FunctionTest
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.117 sec

Results :

Tests run: 1, Failures: 0, Errors: 0, Skipped: 0

[INFO] 
[INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ azure-functions-test ---
[INFO] Building jar: /Users/tyoshio2002/NetBeansProjects/Azure-Function-Test1/azure-functions-test/target/azure-functions-test-1.0-SNAPSHOT.jar
[INFO] 
[INFO] --- azure-functions-maven-plugin:0.1.4:package (package-functions) @ azure-functions-test ---
AI: INFO 06-10-2017 12:00, 1: Configuration file has been successfully found as resource
AI: INFO 06-10-2017 12:00, 1: Configuration file has been successfully found as resource
[INFO] 
[INFO] Step 1 of 6: Searching for Azure Function entry points
[INFO] Reflections took 101 ms to scan 1 urls, producing 1 keys and 2 values 
[INFO] 2 Azure Function entry point(s) found.
[INFO] 
[INFO] Step 2 of 6: Generating Azure Function configurations
[INFO] Generation done.
[INFO] 
[INFO] Step 3 of 6: Validating generated configurations
[INFO] Validation done.
[INFO] 
[INFO] Step 4 of 6: Saving empty host.json
[INFO] Successfully saved to /Users/tyoshio2002/NetBeansProjects/Azure-Function-Test1/azure-functions-test/target/azure-functions/function-test-java/host.json
[INFO] 
[INFO] Step 5 of 6: Saving configurations to function.json
[INFO] Starting processing function: Timer
[INFO] Successfully saved to /Users/tyoshio2002/NetBeansProjects/Azure-Function-Test1/azure-functions-test/target/azure-functions/function-test-java/Timer/function.json
[INFO] Starting processing function: hello
[INFO] Successfully saved to /Users/tyoshio2002/NetBeansProjects/Azure-Function-Test1/azure-functions-test/target/azure-functions/function-test-java/hello/function.json
[INFO] 
[INFO] Step 6 of 6: Copying JARs to staging directory /Users/tyoshio2002/NetBeansProjects/Azure-Function-Test1/azure-functions-test/target/azure-functions/function-test-java
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 1 resource to /Users/tyoshio2002/NetBeansProjects/Azure-Function-Test1/azure-functions-test/target/azure-functions/function-test-java
[INFO] Copied successfully.
[INFO] Successfully built Azure Functions.
[INFO] 
[INFO] --- maven-resources-plugin:3.0.2:copy-resources (copy-resources) @ azure-functions-test ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 2 resources
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 33.243 s
[INFO] Finished at: 2017-10-06T12:01:07-07:00
[INFO] Final Memory: 39M/564M
[INFO] ------------------------------------------------------------------------

ローカルで実行します。

$ mvn azure-functions:run
Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8
[INFO] Scanning for projects...
[INFO] 
[INFO] ------------------------------------------------------------------------
[INFO] Building Azure Java Functions 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO] 
[INFO] --- azure-functions-maven-plugin:0.1.4:run (default-cli) @ azure-functions-test ---
AI: INFO 06-10-2017 09:13, 1: Configuration file has been successfully found as resource
AI: INFO 06-10-2017 09:14, 1: Configuration file has been successfully found as resource
[INFO] Azure Functions stage directory found at: /Users/tyoshio2002/NetBeansProjects/Azure-Function-Test1/azure-functions-test/target/azure-functions/function-test-java
[INFO] Azure Functions Core Tools found.
[INFO] Starting running Azure Functions...

                  %%%%%%
                 %%%%%%
            @   %%%%%%    @
          @@   %%%%%%      @@
       @@@    %%%%%%%%%%%    @@@
     @@      %%%%%%%%%%        @@
       @@         %%%%       @@
         @@      %%%       @@
           @@    %%      @@
                %%
                %

[2017/10/06 16:14:30] Reading host configuration file '/Users/tyoshio2002/NetBeansProjects/Azure-Function-Test1/azure-functions-test/target/azure-functions/function-test-java/host.json'
[2017/10/06 16:14:31] Host configuration file read:
[2017/10/06 16:14:31] {
[2017/10/06 16:14:31] }
[2017/10/06 16:14:31] 
info: Worker.Java.c26685f3-cbd5-4bff-bbea-d3e9e00d08ed[0]
      Start Process: /Library/Java/JavaVirtualMachines/jdk1.8.0_121.jdk/Contents/Home/bin/java  -jar -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 "/Users/tyoshio2002/.azurefunctions/bin/workers/Java/azure-functions-java-worker.jar" --host 127.0.0.1 --port 56034 --workerId c26685f3-cbd5-4bff-bbea-d3e9e00d08ed --requestId 4270cbeb-361f-422a-872a-c0ec946199c5
[2017/10/06 16:14:32] Generating 1 job function(s)
info: Worker.Java.c26685f3-cbd5-4bff-bbea-d3e9e00d08ed[0]
      Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8
[2017/10/06 16:14:32] Starting Host (HostId=yoshionomacbookpro-1392184404, Version=2.0.11308.0, ProcessId=65522, Debug=False, Attempt=0)
Listening on http://localhost:7071/
Hit CTRL-C to exit...

Http Functions:

	hello: http://localhost:7071/api/hello

info: Worker.Java.c26685f3-cbd5-4bff-bbea-d3e9e00d08ed[0]
      Listening for transport dt_socket at address: 5005
info: Worker.Java.c26685f3-cbd5-4bff-bbea-d3e9e00d08ed[0]
      Microsoft Azure Functions Java Runtime [build 1.1-SNAPSHOT]
[2017/10/06 16:14:32] Found the following functions:
[2017/10/06 16:14:32] Host.Functions.hello
[2017/10/06 16:14:32] 
[2017/10/06 16:14:32] Job host started
info: Worker.Java.c26685f3-cbd5-4bff-bbea-d3e9e00d08ed[0]
      [INFO] {com.microsoft.azure.webjobs.script.handler.MessageHandler.handle}: message generated by "class com.microsoft.azure.webjobs.script.rpc.messages.StartStream$Builder"
info: Worker.Java.c26685f3-cbd5-4bff-bbea-d3e9e00d08ed[0]
      Worker initialized
info: Worker.Java.c26685f3-cbd5-4bff-bbea-d3e9e00d08ed[0]
      94978bb8-3f21-47c7-961d-5d9caecc0136 - "/Users/tyoshio2002/NetBeansProjects/Azure-Function-Test1/azure-functions-test/target/azure-functions/function-test-java/azure-functions-test-1.0-SNAPSHOT.jar"::"yoshio3.com.Function.hello" loaded
[2017/10/06 16:16:27] Function started (Id=a529fffb-fd7b-43d4-bd53-3283808f68ce)
[2017/10/06 16:16:27] Executing 'Functions.hello' (Reason='This function was programmatically called via the host APIs.', Id=a529fffb-fd7b-43d4-bd53-3283808f68ce)
[2017/10/06 16:16:27] Function "94978bb8-3f21-47c7-961d-5d9caecc0136" executed
[2017/10/06 16:16:27] Function completed (Success, Id=a529fffb-fd7b-43d4-bd53-3283808f68ce, Duration=444ms)
[2017/10/06 16:16:27] Executed 'Functions.hello' (Succeeded, Id=a529fffb-fd7b-43d4-bd53-3283808f68ce)

起動が完了したら、curl コマンドなどでアクセスしてみてください。

$ curl http://localhost:7071/api/hello -d "Java World"
Hello, Java World!

上記は、簡単な Hello World ですが他のトリガーを利用する場合は、下記のように local.settings.json ファイルに、AzureWebJobsStorage のアクセスキーを入力する必要があります。どうご注意ください。

local.settings.json
{
  "IsEncrypted": false,
  "Values": {
    "AzureWebJobsStorage": "DefaultEndpointsProtocol=https;AccountName=fileup;AccountKey=*******;EndpointSuffix=core.windows.net",
    "AzureWebJobsDashboard": ""
  }
}

たとえば、タイマーをトリガーに何らかの処理をしたい場合、下記のようなコードを書きます。

    @FunctionName("Timer")
    public String functionHandler(@TimerTrigger(name = "timerInfo", schedule = "*/30 * * * * *") String timerInfo, final ExecutionContext executionContext) {
        executionContext.getLogger().log(Level.INFO, "Timer trigger input: {0}", timerInfo);
        return "From timer: \"" + timerInfo + "\"";
    } 

ローカルで検証が終わったので、Microsoft Azure へデプロイします。

$ mvn azure-functions:deploy
Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8
[INFO] Scanning for projects...
[INFO] 
[INFO] ------------------------------------------------------------------------
[INFO] Building Azure Java Functions 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO] 
[INFO] --- azure-functions-maven-plugin:0.1.4:deploy (default-cli) @ azure-functions-test ---
AI: INFO 06-10-2017 12:31, 1: Configuration file has been successfully found as resource
AI: INFO 06-10-2017 12:31, 1: Configuration file has been successfully found as resource
[INFO] Starting deploying to Function App function-test-java...
[INFO] Authenticate with Azure CLI 2.0
[INFO] --> POST https://login.microsoftonline.com/********-****-****-****-**********/oauth2/token
[INFO] 1178-byte body:
client_id=04b07795*******
[INFO] --> END POST
[INFO] <-- 200 OK https://login.microsoftonline.com/72f988bf-86f1-41af-91ab-2d7cd011db47/oauth2/token (833 ms, 2907-byte body)
[INFO] Cache-Control: no-cache, no-store
[INFO] Content-Length: 2907
[INFO] Content-Type: application/json; charset=utf-8
[INFO] Date: Fri, 06 Oct 2017 19:31:31 GMT
[INFO] Expires: -1
[INFO] P3P: CP="DSP CUR OTPi IND OTRi ONL FIN"
[INFO] Pragma: no-cache
[INFO] Server: Microsoft-IIS/8.5
[INFO] Set-Cookie: esctx=AQABAAAAAAABlDrqfEFlSaui6xnRjX5E6ugjSSC5bAEQSJ1V_VvTv2HB9o-5-******;; domain=.login.microsoftonline.com; path=/; secure; HttpOnly, x-ms-gateway-slice=004; path=/; secure; HttpOnly, stsservicecookie=ests; path=/; secure; HttpOnly
[INFO] Strict-Transport-Security: max-age=31536000; includeSubDomains
[INFO] X-Content-Type-Options: nosniff
[INFO] x-ms-request-id: 4813f784-046f-414e-8d9e-29a4e43e3c00
[INFO] X-Powered-By: ASP.NET
[INFO] 2907-byte body:
{"token_type":"Bearer","scope":"user_impersonation","expires_in":"3599","ext_expires_in":"0","expires_on":"1507321891","not_before":"1507317991","resource":"https://management.core.windows.net/","access_token":"eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6IkhIQnlLVS0wRHFBcU1aaDZaRlBkMlZXYU90ZyIsImtpZCI6IkhIQnlLVS*********
[INFO] <-- END HTTP
[INFO] Target Function App does not exist. Creating a new Function App ...
[INFO] Successfully created Function App function-test-java
[INFO] 
[INFO] Step 1 of 4: Creating ZIP package...
[INFO] Successfully saved ZIP package at /Users/tyoshio2002/NetBeansProjects/Azure-Function-Test1/azure-functions-test/target/azure-functions/function-test-java.zip
[INFO] 
[INFO] Step 2 of 4: Uploading ZIP package to Azure Storage...
[INFO] Successfully uploaded ZIP package to https://d0a43c4e4c4a435d9f25.blob.core.windows.net/java-functions-deployment-packages/function-test-java.20171006123210784.zip
[INFO] 
[INFO] Step 3 of 4: Deploying Function App with package...
[INFO] Azure Resource Manager read/write per hour limit reached. Will retry in: 5 seconds
[INFO] Successfully deployed Function App with package.
[INFO] 
[INFO] Step 4 of 4: Deleting deployment package from Azure Storage...
[INFO] Successfully deleted deployment package function-test-java.20171006123210784.zip
[INFO] Successfully deployed Function App at https://function-test-java.azurewebsites.net
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 02:01 min
[INFO] Finished at: 2017-10-06T12:33:00-07:00
[INFO] Final Memory: 42M/488M
[INFO] ------------------------------------------------------------------------

デプロイが完了したのち、Azure の Portal 画面を確認して正しくデプロイされている事、そしてアクセスするための URL を確認します。

Azure にデプロイした URL へアクセスしてみます。

$ curl https://function-test-java.azurewebsites.net/api/hello -d "Java World"
Hello, Java World!

ローカルで実行したのと同様に、正しく実行する事ができました。
より詳細な情報は、Azure Functions Java developer guide
に記載されています。

ぜひ、みなさまお試しください!!

2017年10月7日 at 4:46 AM

[CON6076] The Good Cop/Bad Cop Guide to Java 9 session subtitle

You’re 60 minutes but thank you.
And if you don’t like the presentation.
Very much like.
Yeah, it’s still a person.
I’ll say I said big turning up we love translate Java once exactly for the full room please please program session that will be also I will not, you know, that you also spoke in the guys told me. Yellow in the bed bugs don’t actually work. So.
You will release as they go few before but I think.
I think that it’s a fairly.
What is left two minutes left? So any questions. Any questions. Because a couple of people are starting to leave, let’s do not have work. So before there were a couple of people who are not excited by John 9 let’s try that again who’s excited about going that release.
Laughing little actually do the search for complete features, well pretty sure it does not, so, yeah. You can see you can pretty much search for whatever you want that it does a small search. So welcome to 3005 without one.
I’ll suck *** wrong side head type coming into that you can actually just pacifica peaceful future. For example, that you can just do up to seek up left.
Some teachers might be angry but that will save the best to last Html five yama docks, and it is reasonable you can type in now.
Orry mission libraries in relation did not make it look really good night, which is really great because we have plenty of third party information and you can choose whatever my country personally smart. I think that’s prayer.
Okay. So let’s jump ahead. Okay. So the final few things that will will talk about 82 18 18 82 is is an incubator project rather than being in in the full full game which is what i mentioned before. So I went to buy that for too long is your slide. I don’t know, why you picked this paycheck and said it’s a picture of Google storage angry keeps your and this was an easy course.
But we still super excited to live there for the API improvements.
With him this little line of the tri block if you can declare them somewhere above and then you some reference them into try with resources blocked and they will be closed automatically at the end of that try block so that. Means the cook much more readable, but it’s really hard to show him. So.
Yeah. If used trying with resources. This is fantastic. This is not the API increment language for the try with resources blocks. Now, you can use effective with final variables in the driver’s resources. So we don’t need to declare them.
In a gallon which opponents you can have private mess in the interface is so now we see the full methods it in private methods. You can actually put a lot of logic in your interfaces, which is amazingly great. And drug coupled other things.
An exception right now there is no type don’t know that there is no keyboard you work if I did just dude dude underscores just like Simon, I will have the name than the reasonable Vermeil’s typing friends sufficient enough and. Will do but you can easily keep works. So you going to keep your source code for the land of sports and then you can read that.
Unreasonable to type of thing like this what will happen if he click on her.
There’s exactly one method that sports act, but we can do that if you can find it. That’s recalled the single underscore is not supported. This is now.
Improvements my personal favorite is that now we can leave the property files in Utah 8.
You can get the arguments for any processes, you can get the process of representation in your Java code. So if you deal with some processes where if you need to check any ornaments. You can differentiate with within process is much easier. This is also cross platform which is fairly great. Because now everyone everything runs in doctor. So now we especially need that cross platform things.
Yeah.
In fall and get some arguments and he.
He can do this process management fairly easily. So you can get the current process. You can then execute some.
Process, hello.
Process handle if there is any class and you can do.
Taken three or whatever the version ends up being but with the process.
I should know this is just exactly like a four loop but now with you can generate a streams normally like, you would do because you have some conditions and from a sequence of value is a step back and it’s. Really interesting guy to play with some improvements for local digital timer. There are some improvements for the process handles the process process management is interesting because before it was so messy in Jonah number just show you that thing and then we’ll go to next time next things also concurrent improvements. Completely teacher got a couple of the methods the world’s racket classes in the flow. So we can get closer to the record programming median shady.
Proper lady would suggest me to do that.
See.
It’s not a way around.
And.
Frank.
You think that was that it right method where you can do the property eration, and i will need to check the syntax on that. So you start with the start value than you do the increment step and then you specify condition and before july 9 it was quite clumsy to do that because the worst known each right method to do that. But now we can do that. If it’s less than 10 and then we preach with print them.
You see we dropped the first five elements also we can just take the number of elements in from the stream. It’s very useful. If you just need five elements but not the five elements, but you need to take the vents until some condition is met. For example, you want to skip the duplicates events or something. So the stream a guy was enhanced as well. One thing I like that. It’s actually, it’s the type wall. So, for example, if you actually had an infinite stream want to continue running running you might say I’m going to take while while some other condition is met and then when something once on video, it’s true. Then you stop by infinistream they all need to kill a process to kill those traits. That’s quite a distance from.
Reach will ranks this element.
An ex 6 more than five and then after that we will.
I’m very rarely, I’m a bad hot. So the right couple of things on the stream ties with it did take it in stream. And if I will type that correctly, and then we’ll do a range from one to 10 now we have the methods to trouble amounts while and take while which are pretty interesting. They also present in all other stream conditions on now will have them built in the jig is one, so say we can drop the elements until a certain condition is matter.
Play optimistic person.
I love the way you love the way it took about four times to do that because you actually smiley instead of a court.
You can never know if it works not, why you because we’re in jail.
Okay, hopes works.
Yes tax, and if it’s not then we just have a supplier and we do print.
You start speaking.
I think we need this side effect here.
And it takes two functions soldiers present, then we have a function and we do.
Or else.
Sleep we had the method called present which would take a function which will evaluate only the evaluating awful is present. Now we can have the method that takes two arguments in it called it is called if present.
Do you want?
What is it?
Evaluate the function that provided if I do just the normal thing optional one, and it will do the map immediately here I will get the results immediately. So if you have a functions you might go mapping the functions which are expensive performance, wise any don’t may need really need to be about the merely your can always convert an optional stream very easily, and other people saying. That is present in the optional.
What will I get back we’ll get four will like it then optional 4 1 2 my masses terminal no? In fact, I will since stream is lazy by default. Now, if I convert optionally to stream. I will get the lateness of the stream in my optional, so that I will get the reference my plan will need to terminal operation to actually.
Apply a function when I get sick ax times two.
27 and i do a map function here. So I haven’t.
Swimming like, Nasa’s formatting functions or the values within the control panel container. It’s very important. So that right do this 27.
And I get to stream implication while it seems like a reasonable thing to do because in optional provides.
And then you remembered if you’re still in class fast and everything is rank. So besides that there a couple of things that. So in German 8 we got the stream ati and got optional some java and those are really great. And then in German 9 3 couple of improvements one of my hair it is a stream method on the optional. So what I can do now is optional off say one and I can do a stream of it.
If you don’t get more to let, you know, seeing you actually seem which module that came from which is kind of nice interesting thing to know about one here.
Yeah.
Smart. So in fact, I won’t get any new information that was just add it in the German 9 and it’s an immutable list of one element and one of the things is those implementations are fairly heavily optimized though that for example. Stores the element in the field. So we pass it but it doesn’t need to do that in the rate access. So we just read the element directly because it’s mytable inclination one element and so on, if you have any subduing limits. It’s also Hella way up to my eyes and there are collection of elements and further. So those collection literals will make it quick more readable, and it’s going to be absolutely great. Tutti soaps other interesting thing actually when you call that get close. But if you just grab that again of that get close you can actually do a dot, I think it is again module.
Few people who think I’ll get the link list.
A simplified the syntax also during for things big implementations of those classes are a 13 percent. So if I do this and you get the class what is it called again, who thinks I will get them the realist.
Implementation of the listen interface over you can do is set up and you just type off and you do the elements and you have a set you can also do a map where you will just provide the key and entry. Values in the robe and it will create a map that to you the good thing about this is while.
Just getting in the collection liros there. I think that’s because we’re talking about Java. So this thing it was again. Do you can talk about you can create the list of elements or a set of holiness in a single line of code and you populate that had it is a fully functional.
It’s not my machine. So my typing will be little bit slow. But we’ll manage if we run out of time please just tell me that we need to cover up things because the remaining media improvements in China right now. And we will not go through all of them. I’m showing you a couple of that I like the most war, I think there are mostly fluent influential. Maybe we’ll see how much will kind of do. So one thing that we wanted from Java 40 years and everyone thought that you speak absolutely great to have that work collection literals. So we don’t need to create the newer relate list. And then the subsequent statements publicly that was the data. Now we have those collections leaders in Java I fear.
This 50 50 make updates a week already about updates we gonna both be good cop free updates cause the api updates always pretty awesome job developers. So you gonna do *** it, right here and also have a little worse. Obviously, I’m going to show you the new economy using the situation hope. I don’t take that vote now.
Right?
And then draw and I think.
Stands out when you see.
All right.
Okay. Okay, here gives us a proper ideam hasn’t done Java development team to be on your emacs 40 just and then it will more i need support some sort of evaluation of expressions works scratch pad to something and the you know. That they will almost never touch the judicial at real job except for testing expo something.
Please Jay Cell is an interesting tool you use it to test out Apis and things without having to split up the whole browser in browser idea. There’s a whole bunch of extra things who likes the idea of just coding quick.
Special is it is a given all other languages have that now Java has as well.
So, yeah, I.
Kids commands within the context of that process eat as far as I know currently cannot do that. He can embed ratio and greatly to console in your app, but you have to think about that before hand and if you think about that before hand doesn’t count.
No reason you can presentation situation, but it just takes a little bit more typing. So while it’s a great thing it feels a little bit gimmicky. Personally, I would love to see the future where you can connect your gee shelter running qadian process Java process.
A man and usually pretty meeting at the same time, it’s really hard to imagine that usual would change the way we develop software. It’s pretty hard to type in a significantly large program interesting was shown there is a reason why Simon show you how to create an annotation.
Joe is gonna change it we help people learn Java until people get into the using Java especially the small humans.
System out print stuff things like that. One thing I will say which is absolutely also and it’s better marks in remote 6 on say it all set so much in him. She said it before hide composed in really great videos at state minutes longer. So I want you did was she created a script with a with a hatchback and passing it shell and you can never scripts and with some Java code and by doing that you catch me execute Jay Shell as if you. Were like a basket or something like that. If frozen exceptional benefit still does that maybe frozen section but you can ignore that I’m just going to run Java like a script how calls that but that’s joke shop brilliant brilliant, and it’s used for A.. Bad cop we.
Hello? Hello.
If you if you talk to a cell and you just like printing something that was very, very nice, that we get but my key and that will actually does is it per type look at the methods of provide with A. Whole list of print. So I can then type abstract type print.
There we go.
So.
Text file and now is run everything. So you saw that one second better late than you saw the integration of everything that you see how well that’s Jay Soldiers pretty awesome. One other thing actually if I slashed exit. This is only use about Caroline here depending on how happy are feeling at the time you can exit in two different ways. You can either commande if you’re feeling like I don’t really want anyone to talk to you if you think of it down if you think down you need some need a hug touch like sex and it’s goodbye.
Yeah, I’ll things like you can check what’s imported other things if I wanted to I can just type a list and I can see everything that I’ve typed in two Janie Kay, I can also type to slash. History and I get everything outside when it’s in the Johnny Cake or to the console itself, and i wanted to I can save that as come-ons, I can slash research which resets my states are fine art type slash. Feel I get nothing but what I can do is I can open come on to this she just saving it as a.
We get holly. Well, so I can do that we can also add classes and things like I wanted to work. So I could just so I can say a class by we got close. I could say interface conserved face big we can interface I can type slash team we got type. So, it’s pretty much just know busing using a rep who used to wrap up before fraught with other languages just get this great. We can use with them as I think Java Revel dot com was what we could use previously but this is nicely collected straight into the Johnny Cake.
And from him, I can say hello world, I can say except that you’ll notice that that’s actually updated. Now I can exit I can execute that Paula. Jeez for making that I.
Say, hello. And we get some amazing 1970 window pop up.
It’s a hotel I checked it out.
Hello. At this point cause I’m doing multi lines it obviously needs a obviously into semi colon. So when I do that we now have a method. So I can type slash 10 and we get a better. I can slash editor.
I’m done here I can just do something like system out of print print, then.
If I do a public voice. I love low.
Catch how cool is that.
Yeah, I swear threat to sleep.
Let me kind of week we can coach other without semi colon tell kids that it’s amazing. That’s what the word but nothing else went away for just a movie.
Tell me what’s missing there. Let me just put that at the top was missing there.
And that gives me that you speak the variables that we’ve got a if I wanted to do something interesting like system.
It was three and you get five. So now it’s double up the school that how cool is pretty that you’ve left out in force i types last fee.
Right. So that means what console here. I’m in a console I can talk to Jay Dickey, I can talk to other shell if I wanted to talk to Johnny Cake. I just put something as simple as one plus two and I guess me three if I wanted to talk to the shell spinning slash as soon as I put a slash on the talking to Jenny case, we have a number. Of things I can do. So one of the other thing I’ll mention there is when I put one plus two. I didn’t actually assign it to a variable. So what is actually done decided to a variable forming the dollar one if I wanted to do something similar like int ex equally notable underscore upper double underscores Icab double underscore equals two plus three ships two plus three. I know. It’s not right now just walked in that’s why did that.
Usually not going to repel it’s a rabble. So I just talked a shell that puts me to really nice condos. That is not readable for back.
Second.
Okay.
Translator we got redevelopment look let’s just meet with them.
Really love program close.
You can leave you guys cook up it, right? So you sell a cell is a replica stands for?
As a gimmick.
Okay, let’s stop.
Glasses, I’m good copy.
Right? Okay.
Shell.
But even, okay, right. Next one if you know, I’m not would you do that shell everyone loves to show.
Believes it is a good it leaves it is a really good thing.
It would be no different in Eastern Europe.
Okay, this might be close though.
Tested in supported in China case 7 that was before my five year old son was born officially the default you see in jenny canine who cares you can use it anytime you wanted before jackie canine just with this switch and if. You are using a specific gee see in your jovian arguments can affect you because you’re going to continue to use that in Tianjin Canine. So gee one gessi a good thing, probably is it gives you choice is a good enjoy conjecture canine when it’s getting Jenny Canine is a good it is 8 7 and 6 it’s always been there pretty much so that’s why. Argument as to why do you want easy isn’t a big deal in any canine remain as a result. It’s not a big deal in Janie Kay 9.
So to summarize that you get the faster memory management. We spear application tricks. Is she want to see a good thing. Well, some forms experts say, yes, something textbooks. So, ultimately it really depends on your application, you need to test it with your application. But the question is gee one gessi exciting Indian Java 9 well let me actually go back to a couple of things this was introduced in chinese came 6 hours before my five year old son was born.
I think the next thing is yours.
Yeah. This is how it came to us, it was introducing gdp 6 it was tested so it’s a very much your technology. You could have used at least work very many companies try that tested that don’t different work clothes and it works beautifully and now it is getting through all of us in jail ignites when you run your applications on online. They will probably run a little bit faster in terms of having smaller garbage collection process in the US trade off some throughput maximal stupid because the government you want to see will run concurrently with the application. So not the full resources for hardware will be available to you but for most applications especially for applications where the latency is important. This is a very great pain.
Do you want to see is pretty amazing in?
In a normal conversation we can stop at that.
And this is all garbage collection tuning that is required for which do you want to see, well, there were force more to that but.
Removed all the time. But the main benefit of that is that the garbage collection can decide how many of those small regions, it can collect at any given moment and through that it can control what is your work coverage collection thoughts was that he. Can do this is a things first key the latest in the garbage collection goes down second you can adapt if Lee control data. So you don’t have to have a stretch sheet of gave him options to Kenya garbage collection. In fact teaching your garbage collection. Now, what you want to do you want to just say this is my requirements for the conversation flows this. And this is my record how much space I can sacrifice to achieve that.
So now she want to see this concept is pushed into not to the extreme but much further what do you want to see that it splits your keep into very small regions, and then the only allocated and objects are. Located in them randomly you still have the type sold in some of them will be young objects in some of them will be although tricks.
Michael Speak probably will survive more. So it doesn’t make sense to collect the memory from the cold space. But it’s better to sleep that into different regions. And then you can perform smaller numbers collections and safe time on that. So delete and see if single garbage collection cycle, Google down.
What else? Let’s talk about the future. So let’s look at the garbage collection between because this is something that does make some a great and from the beginning of the times we had to manage memory, and we all use application resource the hardware resource in. Memory as it is infinite and it is absolutely perfect, so what comes in John 9 it comes a new default garbage collectors called do you want to see if you think of the java keep john memory you probably think of a. Picture something like this. You have the heap just separated in different regions the reserve even space where the new objects are located and then when they leave long enough if their survivors begin promoted to the care of space. And then they become the old generation the hypothesis is here is very simple although tricks that already survived the couple of Jesus.
How are you?
But that is the answer is no further though. Let’s start all I would not want right.
But that’s not that’s not the question.
I think that.
The German I release and migration will not be easy.
There we go.
It takes that much about the save the Java language and is has actually made the Java language most stable for the future who believes that much loud. He is a good thing it job 9.
Who thinks?
So much market, let’s vote.
This feature like modules will benefit architecture concerns vary greatly. But for developer it could be a lot of pain, so the good thing is done safely still iaccessible. So we can do stuff on the covers.
Out of those two people think is in developer and who is an architect.
Find out you can benefit from the other improvements that are in China and then you want to fix the easiest things that you can potentially fix concerning the module system currently it is not enforced it to the very strictest level. By default but you can turn it on if you want to if you wanted to work fixing those errors but you can fix the warnings and then you wait for some time preferably somewhere until April 2018 first you will have any. Major release of Java and second probably their system will catch up and you can migrate to modules bottoms up starting from the libraries, you can also migrate the other way around but it’s much harder. So when you think about the modules keep this picture in mind.
Several thousand files big, then you would perhaps have a problem, you would have a problem with the bill systems you will have a problem with ecosystem where some libraries don’t actually migrate werkbund supported or maintaining each other and all. That can cause you trouble. So when you weren’t getting excited about the modules you have to know that there was a migration pass. So before the migration path was a little bit unclear up to the very last moment of the really switch online currently we think that this is the idea how to migrate further. What do you want to do you don’t want to have pretty development environment immediately starts portugal rising everything you want to do you want to unreleased you cannot have read your production environment out of the blue because that’s? Just unwind. So we want to unbreak your staging environment or something where you can.
And so Michael Sauce really nice problem of the open geki and enforcing the rules and then reveals the opportunity better. But what does it cost because her single on the language levels that are this is like five new keywords and you model info file and a lot of pain with actually migrating old projects to the John 9 if you work in? The Greenfield projects you start from scratch. This is amazing and you would love it if you actually have an application that is several gigabytes.
Some of us didn’t choose that.
Excellent your good people.
That’s pretty amazing modules or excellent as someone said, we have a smaller footprint. We have class release cadence which has nothing to do with modules. But the features we can get it the sooner. So before we go forward we need to assess every feature love just fight with it gives us or what other people say that gives us, but what it actually doesn’t solve the problem for us and we have to remember that. Modules built in the Jay Dickey as lead our were designed to solve the problems were the Jay Dickey developers it wasn’t it wasn’t implanted device emotional or system to gild consumer applications from scratch. We had nothing particular to have joy in our systems. We didn’t choose that most of us didn’t choose that please with giant.
That’s good.
And so actually play with Java with a beta. So I think we should just vote now and again, there’s a bad cop in here as well.
I also will talk a little bit about Http two later, but it wasn’t ready because we needed more community feedback but now we can do speak release a module as an incubator which will allow for that community feedback and I. Later stage we push into the main over Judy Cake. So not only is going to provide us with a much nicer way of developing a code, but he’s also allowed us with all these new freedoms to release Java quicker to have smaller run times.
Into the percent of the new runtime with it. You know, in a single module without having too many dependencies on other modules, we can also use a tool called Jailing which allows us to reduce the size of our run type using jailing we can say this is my application. Provide me with a Java image that will allow you to only use platform modules you need and it will provide you with a 14 mega image rather than this huge image. And that will allow you to run the day, you know the Javy me with your application and it’s much much faster smaller footprint.
For 12 hours to have more traffic ations but be cause of the module system. I’m sure all of you have heard of the new release cadence in Java going forward is going to be every 6 months. So next March are going to have was likely to be called in 18 93 release their next september 11 18 9 release the reason this is possible with cause of the module system by having by having everything’s modules is much much easier to. Make her updates.
Stopping on modules a full week. I don’t want to say the modules hasn’t just been available there.
Wait.
Well.
So that’s modules.
I’ve got from.
Get name. It’s say, let’s realized that I can get the name of the class, which is.
And let’s say let’s say this is from a plus this class.
Provide input. So, I’m going to provide the service and here is our implementation. And what is going to do when I say that and after 9 that’s going to reload in and all of a sudden we’re getting a service backup services just returning underscore what that simple provides measures does is that. The Java runtime is under the covers registering that service with the service load up and then when we actually used that by another month. She’ll actually perform a look up into our service loader were grabbing that service back and just to prove, that is the service I can go into our provider amplify wanted to.
Around dogs API dog my service, I’m going to provide that it’s going to provide that with people dog zero turn around dots provider.
I just got rid of that.
And then we got three loaded, but we still not getting anything back and that’s because no services have been registered at the way to register a service is in my provider class maybe go provide a simple we have our. Provider input which I showed you in our model in Photo Java what we actually need to say is we need to say what we’re going to provide the class org dot zero to.
Element via on coding you get far fewer bugs as amazing as in a way more people don’t do it so we go to the service loader we say the load all services of the interface my service we have to get. In trouble back of my services we go through that. And we just try and call get message on that. So I’m going to hit save on the reload that into my runtime.
Every guys that’s been reloaded live into the environment still not get any service is no one of the reasons for that is but we’re not actually grabbing any services from the service load up. So I’m going to come back in here. I’m going to uncomment this is a great way of this great new style of development is called.
As general loading. I’m now here we have a loop looking for services, but there’s no services there, how do we actually use services or we use it by the service load up service later is actually something which was what 1 6 1 4 something and. It’s been there and the majority system uses the same service load that we can register things with it. And we can grab some grub services from there. So what I do is first of all, I’m going to actually make sure we’re using the service loader. So in our consumer module wanna say here is on the say that we use a specific service. That’s going to be all dark zero turn out round the API dot my service to now saying that we’re going to be using that service Oregon. It’s safe to rebuild my application.
I will apply dribble does is provide input implements my service and implements they get message did it go. So we have a provider which implements the service we have a consumer which will soon grab that service. That’s pretty much. So I’m going to run this so much in already using general. So we will get a code and updated as we go.
Next thing is the provider import.
I can see my just has a main method it got it spins round a loop calling cool services call service is just as a system print out a of a counter looking to services that counted incremented we sleep for A.. Second and then we print out nothing. It’s also it does pretty much nothing yet. But there’s a little spoiler for you in the middle which we won’t talk about just yet.
Sorry. I can see my head has a single class called consumer. Wow. That’s not really a smoke break it is a.
Our consumer was a consumer here.
Right. I *** I is very simple. It’s got my service and it just has a single method called get message and our modular photo Java we just export that package. So this is a module containing code that is been exposed to the rest of the module system.
Is.
That actually goes to the provider via an API. Now I apply for just quickly have a look at that.
Some of this up. So intelligent right now I have three modules three Jane. Modules, I have also zero turn on the 80 i start with consumers are consumer.
Coffee people cash also up, so you have a demo just with services something to ever too intelligent.
You probably already seen how to help job don’t send not set up.
Just so *** it Josh.
As a result the unsafe. I see I which many of you heard of mostly property frameworks and libraries the unsafe API is going to be in from you it was an API which was which was meant to be an internal API as i said. Before there is no enforcement previously. So people were using it and actually for good reason because it’s great stuff in there, and it’s made our ecosystem richer.
Wow, that is painful does not.
So much we can use what the module depends on what it requires, that’s that created module graph. So if a client applications running the class part is still running on a modular Javy Am, but if you choose to use the module partner application then both you old platform and your application will be running in a modular way. But you don’t necessarily need to do both.
Platform will always enforce tea. We can’t compile again, something if I’m module structure to determines that we don’t actually depend on that module. Likewise. Now runtime we can’t start our runtime unless all the modules are present for the application to run. So very keep both incomm population. I’m during runtime the module structure must be satisfied rust converter fully compile awfully run as very important. But this is the first time with hard enforcement now. Yes, we had the module path we still have the class pala. So if you wanted store use the class while you can, well though under the covers everything is still modular in the platform. So you can’t use things that are hidden from you. So what’s in front you, well in modules, you have a calculation what the module exports is what I.
And the reason is up till now we haven’t had any enforcement in our runtime now whether we’re compiling or whether we actually burning in the wrong time.
Okay. We deal with much about it, you already when we just don’t think we drop boxes we write words in the box is in control arrows between them we design in a modular way. So when we write code we write it very flat again. We don’t actually put like push that into a modularity.
Build up this dependency tree.
Quar certain module. Let’s say we have a scripting that module will in turn depend on basic depending on which modules, you require.
At the bottom here we have been the job base classes. This is the fundamental class which every application and everything must use it contains things like collections everything that you need to use if you want to any kind of job application. We also have some compact profiles there which you may recognize from other things the lines are dependencies. So if you require a specific a bundle as white module. And when I was joined persons, well, so this is hearts.
You’ll notice.
We don’t cool. But why do we have to have it because we have to support really old upset need Corba, okay. But even if we don’t want to use call, but we have to still have it as possible, so what we do is we marginalize the platform into modules that we can choose whether we want to have in our own. Time or not and depending on what I like Asian needs from it’s from his platform we can bundle up a new runtime which only provides that. So we’re creating a runtime based on the needs of our application rather than having this one size fits all Jovem, and it is a big size fits all de Vienne for any application that wants to run on that job. Platform.
No weeping.
Elephant in the room big elephant in the room much after why do we need modularity. Well, we have much loud in a couple of different ways. We have platform agile our team we have application which are we really need that for much larger because the way the, the platform is gone over many many years requiring backwards compatibility, it’s turned into really the elephant in. Room, right. It’s a huge beast that we need to support horrible things like all of a school bus.
Right? So let’s start.
Okay, good.
We might have a guest or somewhere welcome poll quiz not excited about John night than this kind of disappointed with this release.
If you do that is studia that would never have never?
I’m just taking all I like really that’s probably what I’ll say sorry start before we start, let’s not get into this debate. So fast who’s excited? So German 9 was cooking for a long time and then it was released and people some people are excited about that some people are not that excited about that. So let’s vote in the beginning of the session before we heard all our arguments whether it’s good about it who is excited by John 9.
The way it works is if I’m good call barring bad cop you always vote for whatever I say is I like to win.
So I also work with the London Jug and the virtual jug, and I work in develop relations as well. So I work as a developer advocate for a zero turn around, but let’s get started suck Java 9 the debate the way this is going to work is going to play good cop bad cop we’re going to take a. Number of the major job annoyance of the minor Java 9 updates and one of us going to play a good got one of us is going to bed back up. So the good cop will look at some of the party of parts of that feature the bad cop will look at some of the parts of the feature went on, so good and when you as the jury have heard. Both the pros and cons you will vote as to whether you like that feature in Java 9 or not or whether it’s something enough for you to migrate apps.
And I’m also a leader off a jig grouping party in a sauna, which is a very small town but there are probably wrong.
I’m a co-leader with Simon of Virtual Drucker, which is the Java online only Java user group. So if you’re late enough to join your local Java user group. We will welcome you will be happy to have you.
Couple of things that I do I maintain the or block older blacks where we publish technical content. So if you can check it out it will make me personally very happy.
Yes. This is me. My name is Alex. Life, I come from astoria, I work for complete cold zero turn around as a developer advocate.
Okay. Hello. Everyone and thank you very much for coming to our session we appreciate this whole bunch of really good session. So I. Thank you for joining our one. My name is Simon. Mabel’s my colleague election, I’ve hello. IRA, and this is a session on good cop bad cop guides Java 9 so who’s heard of job and 9 so far and java one most people i would expect out on a wednesday. So we’re going to a slightly subtly different orry Outlook on this session started to be a regular session we’re going to be a good cop and about cops. So that’s possible introduce ourselves.
What a horrible movie star concentration sorry. Sorry. You had to hear that.
Really.
Or we mixed back.
This sound louder. It does not like that. That’s the proper way to do it.
1 2 1 2 excellent can you make me louder than him. Please.
1 2 1 2.
Microsoft, yeah.
Wow.
Hello 1 2 3 1 2 3.
1 2 1 2.
That’s 45 minutes. I don’t think, I think that stuff.

2017年10月5日 at 9:20 AM

過去の投稿


Java Champion & Evangelist

ご注意

このエントリは個人の見解であり、所属する会社の公式見解ではありません

カレンダー

2019年7月
« 3月    
1234567
891011121314
15161718192021
22232425262728
293031  

カテゴリー

Twitter

  • RT @kencharos: "追加するサービス数が 5-10 程度ならば、迷わず PaaS をお勧めします" / これ。 前職では時期的な理由であり、 Azure App Services でいきましたが少数サービスなら何の問題もなく、学習コストも少なく、PaaS最高でした… 1 day ago
  • @tk_uc1978 @SlideShare 加藤さん、サマーツアーご紹介いただきまして誠にありがとうございます!! 1 day ago
  • RT @ehotinger: Container image scanning as a part of your CI/CD via @AquaSecTeam 's microscanner and Azure Container Registry Tasks - https… 1 day ago
  • RT @yyamasaki1: 理由が明確に説明されていて、いい記事だなぁ 「Kubernetes は決して銀の弾丸ではないため、どうぞ適材・適所で稼働に向くサービスを稼働させるようにしてください。」 twitter.com/cyberarchitect… 1 day ago
  • RT @cyberarchitect: 寺田さん極めてまともでいらっしゃる Kubernetes の導入時に考えるべきこと | 寺田 佳央 - Yoshio Terada yoshio3.com/2019/07/20/app… 1 day ago

clustermap

ブログ統計情報

  • 1,147,076 hits

RSSフィード