scala: mobile backend on aws

97
Developers.IO 2016 B-1 荒井 祐輔 Ⓒ Classmethod, Inc. 2016年02月20日 Scala: Mobile Backend on AWS 1

Upload: cmaraiyusuke

Post on 15-Apr-2017

140 views

Category:

Technology


3 download

TRANSCRIPT

Page 1: Scala: Mobile Backend on AWS

Developers.IO 2016

B-1

荒井 祐輔

Ⓒ Classmethod, Inc.

2016年02月20日

Scala: Mobile Backend on AWS

1

Page 2: Scala: Mobile Backend on AWS

#cmdevio2016 #B

Page 3: Scala: Mobile Backend on AWS

whoami

• Yusuke Arai

• Classmethod (2014/11~)

• Mobile Backend API Team (2015/02~)

• AWS / Scala / Javascript / android

• dev.classmethod.jp/author/arai-yusuke

Page 4: Scala: Mobile Backend on AWS

Today's topics

• Scalaのoverview

• Scalaを使ったモバイルバックエンドAPI

• なぜAWSネイティブの時代にScalaが必要か

• How to 説得 your client in "Scala使います!"

Page 5: Scala: Mobile Backend on AWS

Today's topics

• Scalaのoverview

• Scalaを使ったモバイルバックエンドAPI

• なぜAWSネイティブの時代にScalaが必要か

• How to 説得 your client in "Scala使います!"

Page 6: Scala: Mobile Backend on AWS

Scalaのoverview

Page 7: Scala: Mobile Backend on AWS

Martin OderskyDeutscher Informatiker / 1958~

Page 8: Scala: Mobile Backend on AWS

Scala

• JVM言語(Javaバイトコードを生成)

• Javaの既存コードを直接参照可能

• 強い静的型付け言語

• 名前は"Scalable"から

Page 9: Scala: Mobile Backend on AWS

Scala の文法

• セミコロンのないJavaっぽくも書ける

• Rubyっぽくも書ける

• 記述量が少ない

• 詳しくはググってくださいm(_ _)m

Page 10: Scala: Mobile Backend on AWS

Scala のウソ・ホント

Page 11: Scala: Mobile Backend on AWS

よく耳にする話

• 関数型のプログラミング言語

• Rubyに近いのでLL経験者なら楽勝

• Javaがわかればすぐに書けるようになる

• エコシステム(Play)はRailsライク

Page 12: Scala: Mobile Backend on AWS

全部ウソです

• 関数型のプログラミング言語

• Rubyに近いのでLL経験者なら楽勝

• Javaがわかればすぐに書けるようになる

• エコシステム(Play)はRailsライク

Page 13: Scala: Mobile Backend on AWS

Scala のホント

Page 14: Scala: Mobile Backend on AWS

Scalaのホント

• 洗練されたOOP言語ただしHaskellの影響を強く受けており、関数型の書き方で書くことも可能になっている

• JVMやJava言語への理解が必要

• エコシステム(Play)は強力な型システムを内包しFP, FRPを前提としている

Page 15: Scala: Mobile Backend on AWS

Not 関数型言語

• 結構ある勘違い「Scalaは関数型言語DA!」

• Scala自体は洗練されたOOP言語

• ただし純粋関数ベースの開発を強くサポートしてる

• Haskellと同じ書き方をしようと思えば可能

主な理由としてScalaがアドホック多相性を表現できるから

Page 16: Scala: Mobile Backend on AWS

Java/JVMの理解が必要

• JVMが型消去モデルであること(重要)

• GenericsはJava 1.5で追加されたこと,

ClassManifestの挙動, etc…

• Javaの文法などよりも、Javaの歴史に対する理解が必要

Page 17: Scala: Mobile Backend on AWS

☓ LL話者なら馴染みやすい

• ScalaはaltJavaとしても利用できるが

それは"Scala言語"に限った話で、エコシステムがそれを許すとは限らない

• Play Framework 2.4 は強力な型システムを内部に持ち、随所で型システムへの理解を要求する。

• 例: JsResult は Applicative Functor

Writes は Contravariant Functor

Page 18: Scala: Mobile Backend on AWS

視点を変える

Page 19: Scala: Mobile Backend on AWS

Scala を使っていけば……

• JVMやJavaの歴史について深く理解できる

• 関数型のグッドプラクティスが取り込める

• 型クラス、代数的データ型、関手、モナドなどの鉄板パターンが使えるようになる

• 新しめの言語ではだいたい↑が一部または全部使える

例えばSwiftにもflatMapメソッドが用意されています

• 新しい機能を使いこなし品質の高いアプリを作ることが可能に!

Page 20: Scala: Mobile Backend on AWS

Scalaのoverview は

こんな感じです

Page 21: Scala: Mobile Backend on AWS

Today's topics

• Scalaのoverview

• Scalaを使ったモバイルバックエンドAPI

• なぜAWSネイティブの時代にScalaが必要か

• How to 説得 your client in "Scala使います!"

Page 22: Scala: Mobile Backend on AWS

Scalaを使ったモバイルバックエンドAPI

Page 23: Scala: Mobile Backend on AWS

モバイルAPIサーバーを作った

• 受託モバイルアプリ案件

• リリース後はC100Kがほぼ間違いない

• 安定して捌くためにフロントAPIサーバーには Play-Scalaを採用

• バックエンドもAkkaを使いたいという理由からPlay-Scalaにした

Page 24: Scala: Mobile Backend on AWS
Page 25: Scala: Mobile Backend on AWS

開発の進め方

• フルでテスト書く

(全クラスユニットテスト、API毎最低1結合テスト)

• pull reqレビュー必須

• ScalazやCatsは使わない

• 今リリース前なのでパフォーマンス・運用についてのことは何とも言えない(リリースできていたら運用ノウハウをお伝えしたかったです……)

Page 26: Scala: Mobile Backend on AWS

開発で感じたこと

Page 27: Scala: Mobile Backend on AWS

えげつないほど書きやすい

• ボイラープレートコードの少なさに咽び泣く

• 言語そのものがImmutableを推してくれてることの有り難みを思い知る

• 別にカッコよく書こうとしてないのに関数は

だいたい5行以内にまとまる

Page 28: Scala: Mobile Backend on AWS

めっちゃ読みやすい

• 「Scalaは記号ばっかで読みにくい」って とおい昔に聞いたことがあった

• それは超Haskellっぽく書いた場合の話だった

• シンプルに書いていくと英語っぽい文脈を持つ

• pull reqレビューが捗る

Page 29: Scala: Mobile Backend on AWS

なんとなく英語っぽいのです

Page 30: Scala: Mobile Backend on AWS

Akka

• 今回はワーカーをAkka Schedulerで実装

• AkkaのFault Toleranceを買った

• Amazon SQSやAmazon SNSとうまく結合する

• DynamoDB StreamやKinesisとくっつけたら絶対楽しいでよすね

Page 31: Scala: Mobile Backend on AWS

AWS Java SDKが使える

• AWSのフルマネージドサービス(CognitoやDynamoDB)とやり取りするアプリを作る場合、AWS SDKのドキュメンテーション具合は死活問題

• AWS Java SDKには何の心配もなかった

• Scalaの言語思想として「mutable実装をimmutableなインタフェースで隠蔽」というのがある

→ AWS Java SDK はインフラ層で隠蔽できるので無問題

Page 32: Scala: Mobile Backend on AWS

アーキテクチャの利点(1)

• 純粋関数型言語だとmain関数の外側、つまり自分でコントロールできない領域まで副作用を遅延しなければならない(ことが多い)

• Scalaでは副作用を起こすタイミングを自分で

コントロールしてOK※ HaskellにもunsafePerformIOとかはありますが……

• 本当に遅延すべき副作用(ドメインロジックが起こす副作用)とそれ以外(ログとか)を別のものとして扱うことが容易

ソフトウェア

Page 33: Scala: Mobile Backend on AWS

アーキテクチャの利点(2)

• 言語レベルでDIを強くサポートするのでDIP達成の前提があるアーキテクチャと馴染む

• Layered Architecture, Onion Architecture…

• DDDなどでよく採用されるアーキテクチャ

ソフトウェア

Page 34: Scala: Mobile Backend on AWS

続きはまた後で時間に余裕があれば

Page 35: Scala: Mobile Backend on AWS

Today's topics

• Scalaのoverview

• Scalaを使ったモバイルバックエンドAPI

• なぜAWSネイティブの時代にScalaが必要か

• How to 説得 your client in "Scala使います!"

Page 36: Scala: Mobile Backend on AWS

なぜAWSネイティブ時代に Scalaが必要か

Page 37: Scala: Mobile Backend on AWS

マイクロサービス アーキテクチャ

Page 38: Scala: Mobile Backend on AWS

マイクロサービスアーキテクチャ

• 一つの役割をもった疎結合で小さなサービス(コンポーネント)の集合で大きなサービス(アプリケーション)を構築する

• それぞれのサービスはDockerコンテナやEC2インスタンスとして表現される

• マイクロサービス同士はHTTPSなどで通信

Page 39: Scala: Mobile Backend on AWS

© NGINX via https://www.nginx.com/blog/service-discovery-in-a-microservices-architecture/

Page 40: Scala: Mobile Backend on AWS

実際どうなの

• ScalaMatsuri 2016で色々なセッションを聞いて来ましたが「リアクティブ」や「マイクロサービス」にまつわるセッションが多数

• 日本の方よりも海外の方のセッション多し

→ 海外では既にデファクトになってきてそう

• “リアクティブはResiliencyのための手段である”

Page 41: Scala: Mobile Backend on AWS

更に先を眺める

Page 42: Scala: Mobile Backend on AWS

その先に控えるのは

が主体のアーキテクチャ

Page 43: Scala: Mobile Backend on AWS

AWS Lambda が主体へ

• バックエンドにあるmicro servicesへのオーケストレーションではない

• ドメインロジックがAWS Lambda Functionとして表現されるサーバーレスアーキテクチャ

• 単位が micro services から functions へ

Page 44: Scala: Mobile Backend on AWS

Evolution of Compute – Public Cloud

InfrastructureInstances

Application code

©Amazon Web Services via http://www.slideshare.net/AmazonWebServices/arc308-the-serverless-company-using-aws-lambda/

Page 45: Scala: Mobile Backend on AWS

Evolution of Compute – Containers

InfrastructureInstances

Application codeContainers

©Amazon Web Services via http://www.slideshare.net/AmazonWebServices/arc308-the-serverless-company-using-aws-lambda/

Page 46: Scala: Mobile Backend on AWS

Evolution of Compute – ServerlessApplication code

©Amazon Web Services via http://www.slideshare.net/AmazonWebServices/arc308-the-serverless-company-using-aws-lambda/

Page 47: Scala: Mobile Backend on AWS

実際どうなの

• AWS re:Invent 2015でマイクロサービス関連のセッションが多く発表される中で、世界に向けて発信された概念(発表されたのはすでに実践されたもの)

• いずれ、必ず来るサーバーレスの未来を象徴している

• その”未来”が来る日のことを、

個人的に”Lambda Xデー”と呼んでます

Page 48: Scala: Mobile Backend on AWS
Page 49: Scala: Mobile Backend on AWS

深みにダイブしたい方は弊社丹内の記事をぜひチェック!

reinvent2015 マイクロサービス

Page 50: Scala: Mobile Backend on AWS

For Your Information

Page 51: Scala: Mobile Backend on AWS

2015.02 Lambda in VPC!!©Amazon Web Services

via http://aws.typepad.com/aws_japan/2016/02/access-resources-in-a-vpc-from-your-lambda-functions.html

Page 52: Scala: Mobile Backend on AWS

さて

Page 53: Scala: Mobile Backend on AWS

でアプリケーションを開発する場合の選択肢

Page 54: Scala: Mobile Backend on AWS
Page 55: Scala: Mobile Backend on AWS
Page 56: Scala: Mobile Backend on AWS
Page 57: Scala: Mobile Backend on AWS

Scala in AWS Lambda

• LambdaはScalaで書けます。これはScalaに限った話ではなく、JVM言語ならOK。

• ざっと試した感じでは無理やり感がでることもなく、いい感じに書けます。

• 技術調査を進めていて、もう少しナレッジが溜まれば 近いうちに本番適用可能になりそう。

Page 58: Scala: Mobile Backend on AWS

Scala in AWS Lambda

• LambdaはScalaで書けます。これはScalaに限った話ではなく、JVM言語ならOK。

• ざっと試した感じでは無理やり感がでる こともなく、いい感じに書けます。

• 技術調査を進めていて、もう少しナレッジが溜まれば 近いうちに本番適用可能になりそう。

この辺りを掘り下げる話を5月に福岡でします!

【Scala福岡2016】で検索検索!

Page 59: Scala: Mobile Backend on AWS

なぜScalaを選ぶべきか

• AWS Lambdaを使う上で乗り越えなければならないのは”結合テストの書きにくさ”

• 結合テストガンガン書いてぴゅんぴゅん進めようぜという文化とはうまく合致しない

• ユニットテストのみでより多くの心配事を解消するにはどうすべきか

Page 60: Scala: Mobile Backend on AWS

なぜScalaを選ぶべきか

• AWS Lambdaを使う上で乗り越えなければならないのは”結合テストの書きにくさ”

• 結合テストガンガン書いてぴゅんぴゅん進めようぜという文化とはうまく合致しない

• ユニットテストのみでより多くの心配事を解消するにはどうすべきか

強い静的型システムの堅牢さと 関数型の異常系表現力を駆使すべし!

Page 61: Scala: Mobile Backend on AWS

rapture.core.Resultvia https://github.com/propensive/rapture

Page 62: Scala: Mobile Backend on AWS

scalaz.\/via https://github.com/scalaz/scalaz

(EitherTもあるんだよ!)

Page 63: Scala: Mobile Backend on AWS

scala.util.Eithervia https://github.com/scala/scala

Page 64: Scala: Mobile Backend on AWS

関数型の異常系表現力

• ある振る舞いをテストするにあたり、その振る舞いが起こす副作用込みでテストするのではなく、異常系やIOアクセスを表現可能な型を扱い、副作用の発生箇所をギリギリまでアプリケーションの外側に持ち越すようにすることで、副作用発生直前の値が正しいこと(==)を保証するテストが書ける。

Page 65: Scala: Mobile Backend on AWS

現状の細かいCons

• Artifact ZIPに50MB制限がある→ 作り方を工夫する必要があるものの、

  マイクロサービスの考え方を継承するならば

  対処可能な制限

• JVMの初回起動コストがオーバーヘッドに?

→ Lambda in VPCならばENIコストもあるので、

  初回は遅いものと割り切る

Page 66: Scala: Mobile Backend on AWS

一番伝えたかった事なので ちょっと振り返り

Page 67: Scala: Mobile Backend on AWS

なぜAWS時代にScalaか

• Lambda Xデーは必ず来る

• 大規模アプリをLambdaで作る日がくる

• AWS結合テストを無理やり書くのではなくユニットテストで担保できる領域を増やす

• そういう書き方を強くサポートしているのがScala

Page 68: Scala: Mobile Backend on AWS

Today's topics

• Scalaのoverview

• Scalaを使ったモバイルバックエンドAPI

• なぜAWSネイティブの時代にScalaが必要か

• How to 説得 your client in "Scala使います!"

Page 69: Scala: Mobile Backend on AWS

How to 説得 your client in "Scala使いたい!"

Page 70: Scala: Mobile Backend on AWS

"Play-Scalaを使います!" という提案をするためには いくつかのFrameworkと 比較検討を行う必要があった

Page 71: Scala: Mobile Backend on AWS

代表的Framework

• Ruby on Rails (Ruby)

• Express (Node.js)

• Laravel (PHP)

• Play Framework (Java)

• etc

Page 72: Scala: Mobile Backend on AWS

前哨戦 vs Rails, Node, PHP

Page 73: Scala: Mobile Backend on AWS

vs Rails, Node, PHP

• Play-Scalaとは問題解決のモデルがはっきり 違うので、説明(説得)しやすい。

• 耐障害性(Resiliency), 伸縮性(Elasticity)

信頼性(Reliability)などで圧勝する。

• 強いて言えば1インスタンスでC100Kの功績があるNodeが一番のライバル。

Page 74: Scala: Mobile Backend on AWS

耐障害性(Resiliency)

• AkkaのFault Tolerance戦略はErlang/OTPなどと並び最強クラスの耐障害性を提供

• 仕組みを理解して正しく使えば、金融基盤やインフラ基盤に用いうるレベル

• 前哨戦では説得のメインウェポン

Page 75: Scala: Mobile Backend on AWS

伸縮性(Elasticity)

• 広義でのスケーラビリティ

• Akkaベースのクラスタリングが容易

• PlayもAkkaの仕組みの上で動いている

• Play-Scalaの単体処理性能はNodeより高い

※ 2015/05時点のベンチマーク

Page 76: Scala: Mobile Backend on AWS

信頼性(Reliability)

• なんだかんだ言ってもJVMで動くアプリ

• JVMの歴史と信頼性をそのまま引き継ぐことができる

• チューニングから運用まで実績・文献ともに豊富

• javapコマンドなどで解析すると結構読めます

Page 77: Scala: Mobile Backend on AWS

耐障害性、伸縮性、信頼性をしっかり抑えれば

Rails, Node, PHPに 競り負けることはない

※ APIサーバー開発の話です

Page 78: Scala: Mobile Backend on AWS

難攻不落 vs Java

Page 79: Scala: Mobile Backend on AWS

先ほど挙げた 耐障害性、伸縮性、信頼性は

それぞれ Play, Akka → 耐障害性

Akka → 伸縮性 JVM → 信頼性

Page 80: Scala: Mobile Backend on AWS

Play-Java

Page 81: Scala: Mobile Backend on AWS

Akka for Java

Page 82: Scala: Mobile Backend on AWS

JVM

Page 83: Scala: Mobile Backend on AWS

えっ、 それJavaでいいですよね?

Page 84: Scala: Mobile Backend on AWS

難攻不落 vs Java

Page 85: Scala: Mobile Backend on AWS

JavaよりScalaを使いたい理由

• コード記述量が圧倒的に少ない(ナウい)

• 関数型で書ける(ナウい)

• Akka, PlayはScalaで書かれてるから追いやすい

• …だけじゃなくSparkとかKafkaとか最近の

重要なOSSがScalaで書かれまくってる(ナウい)

Page 86: Scala: Mobile Backend on AWS

Javaを使ってほしい理由

• 言語話者の母数が圧倒的に多い

• ゆえにハイアリングが楽

• ゆえに保守・運用体制を立てやすい

• ゆえに安心感がある

Page 87: Scala: Mobile Backend on AWS

本当にそうでしょうか?

Page 88: Scala: Mobile Backend on AWS

Java8を実務レベルで書ける エンジニアって

そんなに多いんでしょうか

(StreamAPIにflatMapとかありますけどそれは大丈夫なんですかね)※ScalaにもSwiftにもHaskell(*bind)にもあるよ!

Page 89: Scala: Mobile Backend on AWS

Java8話者かつDDD話者の エンジニアのハイアリング ってそんなに楽でしょうか

Page 90: Scala: Mobile Backend on AWS

Java7話者を育てればよい?

Page 91: Scala: Mobile Backend on AWS

ならScalaでやりましょう!

Page 92: Scala: Mobile Backend on AWS

"JavaよりもScala"を説得する

• Scalaを使った場合の利点を説明し

• Java8話者が必ずしも多くなく、かつJava8には かなり学習コストがかかることを説明し

• (上司には)同じ学習コストを払うならばScalaを使うべきだと伝えるべし!

• (お客さんには)Scalaでもリスク大差ないと伝えるべし!

Page 93: Scala: Mobile Backend on AWS

時間に余裕があればここで Scala愛を語る

電撃、初恋、相手のこともっと知りたい、…

Page 94: Scala: Mobile Backend on AWS

まとめ

Page 95: Scala: Mobile Backend on AWS

まとめ

• Scalaは関数型もできるOOP言語ですよ!

• 来るLambda Xデーには、Scalaは開発者に多くの幸せをもたらすでしょう。

• Resiliency, Elasticity, Reliability!!

• Scalaを使う利点をしっかり説明した上で“Javaならば安心” という幻想をぶち壊す!

Page 96: Scala: Mobile Backend on AWS
Page 97: Scala: Mobile Backend on AWS

Developers.IO 2016

ご静聴ありがとうございました。 スライドは後日ブログで公開します。

97

A-1

Ⓒ Classmethod, Inc.

#cmdevio2016