アソビューがサービスを成長させるためJavaを選択する理由

これはアソビュー Advent Calendar 2019の12日目です。

アソビューでエンジニアをしている兼平🐼(@disc99)です。

現在Javaは世界中で広く使われる言語である一方で、古い技術と捉えられることも少なくありません。 特に社外の方からは、なぜJavaなのかと聞かれる機会があります。

そこで今回はアソビューでJavaを使う理由とその活用内容を紹介したいと思います!

なぜJavaなのか

f:id:disc99:20191211100241p:plain:w300

理由1. 多くの企業で支援される言語

Javaというと硬いイメージを持つ方も多いと思いますが、世界的に見るとGoogle、Amazon、Netflix、Airbnbなどは主要言語、またはその一つとしてJavaを使用しています。

国内でもLINE、楽天、ヤフーなどを始め多くの企業が選択している言語でもあります。

非常に多くの利用者がいるため、各サービスやフレームワークが優先的にサポートやSDK提供されることが多く、メジャーなものだけでなく、先進的なサービスやツールを使う場合でも、他言語よりも先行して開発に取り入れることが可能になります。

結果的に、多くの経験者やナレッジが揃い、サービス開発に還元しやすくなります。

理由2. 優れたランタイム

Javaの特徴の一つがJVMです。

Web、金融、基幹システム、ビッグデータ、スマートフォンから組み込み機器まで、幅広い環境で利用され、非常に高いパフォーマンスや安定性、信頼性などの厳しい条件をクリアしています。

またJavaだけでなく、多くの言語(Scala、Kotlin、Clojure、Groovy)の実行環境として利用されています。

アソビューが提供しているサービスも to C向けのアソビュー!アソビュー!Gift、 to B向けのアクティビティ、チケット管理システム、OTAへのデータ連携や、社内向けシステムの他にも、それらをつなぐAPIやバッチ、運用のためのツールなど様々です。

これらの幅広い、条件をクリアする上でJavaは非常に有効な選択肢となっています。

弊社同様に多くの企業で採用される理由としてJVMの存在は大きいと思います。

理由3. 進化を続けてる言語

言語そのものとしては決して新しい部類ではないものの、現在でも半年に1度のバージョンアップを行っています。 また、進化を続けながらも、Javaの特徴である高い後方互換性を維持しています。

これに関しては、サービスをローンチしてから5年以上経過している弊社のサービスを安心して運用を続けられる理由でもあります。

最近では、言語仕様だけでなく、現代的なクラウド環境で重視される、高速起動や低リソース対応など、従来のJavaでは難しかった課題もGraalVMの登場により、新たな可能性が見えてきています。

また、最近の言語では、優れた構文であることより、たとえ冗長でも誰でも読み書きしやすかったり、ランタイムやエコシステムなど総合的に扱いやすいことが重視されることもあり、Javaもその特性に近いと感じています。

細かな部分は他にもいろいろありますが、これらは大きな理由となっています。

どのようにJavaを使っているか

Web

f:id:disc99:20201120115929p:plain
Spring

現在アソビューでは大小合わせて、数十のアプリケーションが連携しています。 その中で特に多いのが、Webサービスや、Web API、gRPCサーバなどのアプリケーションです。

この分野は 理由1. 多くの企業で支援される言語 でも紹介した通り、非常に多く使われており、パフォーマンスや信頼性、ナレッジも含め非常に充実している分野です。

また、社内ではSpring Bootが多く使われているため、開発も素早く開始できます。 実際に今年1年でも10以上のSpring Bootアプリケーションが新規でローンチされています。

また、結果的にマイクロサービス化されたアプリケーションが増えたため、外部からの呼び出しにはSpring製のAPI Gatewayである、Spring Cloud Gatewayを活用しています。

Springのエコシステムはもとより、プログラマブルなルーティング、APIアグリゲーションやHTTP over JSON to gRPCの変換レイヤーなど、API Gatewayとして求められる機能を活用してます。

spring.io

サーバーレス

f:id:disc99:20191211005535p:plain

現在弊社で稼働しているアプリケーションの多くはコンテナベースの環境で稼働しています。

また、以前まではECSを採用していましたが、EKSが発表されてからEKSへの移行を進めています。 CaaSは柔軟性で優れてはいますが、要件次第ではもっと素早く、スケーラブルで運用コストの低い環境が求められることも増えています。

そのようなケースにはAWS Lambdaを代表とするサーバレス環境を利用しています。

特に社内ではSpringを利用した開発が多いため、Spring Cloud Functionを利用したサーバーレスアプリケーションの開発も行っています。

spring.io

実際にサーバレスを利用したSpringアプリケーションは開発から本番運用開始するまで1日以内で可能なため、マッチするケースでは強力な選択肢となります。

speakerdeck.com 以前サーバーレスを活用したアプリケーション開発について発表した資料

一方でサーバーレス環境はコールドスタート、従量課金など、限られた環境故の課題もあるので、Spring Boot 2.3のFeatureであるGraalVM対応には非常に期待しています。

開発ツール

弊社でメインで利用しているクラウドであるAWSやアプリケーション実行の基盤となるKubernetes他、開発を行う上では様々なツールを駆使することになります。

特に、基盤を構築しているSREと、それらを利用する開発メンバーの間に知見の差異があることも少なくありません。

これらのギャップを減らし、素早くセットアップや各環境を操作できることを目的としたCLIツールを、SREチームから配布しています。

f:id:disc99:20191211082113p:plain

このツールもJavaで開発しており、GraalVMに対応したpicocliでネイティブなバイナリの生成を行っています。

picocli.info

Java 11対応

Java 11リリース以降、開発を開始したアプリケーションでは最新のLTSであるJava 11を使用して開発しています。 また、AWS Lambdaも最近Java 11をサポートしましたが、即日アップデートするなど、可能な限り最適なランタイムを選択できるようにしています。

その他よくある質問

Javaだと開発が遅くならないか

言語としての向き不向きが無いことは無いですが、多くのサービスがそうであるように、実運用レベルになると言語特性だけでなく、それを取り巻く環境や、ビジネスモデル、人材などの複合的要素により開発速度や品質が決まってくると思います。

実際にアソビューが提供してるサービスでも様々なニーズがあり、それらを満たす上で言語そのものだけで解決できる部分は決して多くないです。

また多くのWeb企業で採用されてることからも分かるように、言語そのものだけで開発速度が決まるわけではないので、用途に合わせ適切に選択できることを重視しています。

他の言語利用状況

今の開発メンバーがJavaの知見が多いので、Javaを選択することが多いですが、用途に合わせ適材適所で使い分けています。 例えば機械学習にはPythonを活用していたりや、新規サービスでGoを試してみたりなど並行してチャレンジを行っています!

まとめ

簡単ではありますが、アソビューのJavaを使っている背景とその状況を紹介させてもらいました!