Upload
fd0
View
3.044
Download
0
Embed Size (px)
Citation preview
自己紹介• Daisuke Fujimura• クラスメソッド株式会社• AWS コンサルティング部• 製品開発チーム
• 以前は Web サーバサイドとかインフラ (AWS / 物理) を触ってました
• 最近ようやく Java に目覚めました2
Amazon SNS• パブリッシャからトピックを経由してサブスクライバにメッセージを配送するサービス• http://docs.aws.amazon.com/ja_jp/sns/
latest/dg/welcome.html
11
Amazon SNS
12
http://docs.aws.amazon.com/ja_jp/sns/latest/dg/welcome.html より引用
配信シナリオの例を考えてみる• サブスクライバ登録には API 呼出しが必要• 1 モバイルデバイス毎に最悪数秒
• 1000 件なら…
• 1000000 件なら…
• もしかして配信自体よりも準備に時間がかかる?
14
懸念• あらかじめ決まっている配信先集合の場合はトピックへの登録コストは登録時フックなどで隠蔽可能• 例 : ユーザの静的属性 (性別, 年齢, 居住地,
etc…)• そうでない (= 動的属性に基づく) 場合は前述の問題がある• 例 : ユーザの行動履歴 (購入履歴, etc…)
15
その他にも…• 任意の配信先集合は配信が完了したらどうするの?• 使用後には削除するの?• 1 アカウントあたりのトピック数には上限• http://docs.aws.amazon.com/ja_jp/
general/latest/gr/aws_service_limits.html#limits_sns
16
モバイルプッシュ通知• Amazon SNS にはトピックを使わずにパブリッシャからモバイルデバイスにプッシュ通知メッセージを直接送信する機能もある• http://docs.aws.amazon.com/ja_jp/sns/
latest/dg/SNSMobilePush.html
17
モバイルプッシュ通知
18
http://docs.aws.amazon.com/ja_jp/sns/latest/dg/SNSMobilePush.html より引用
Amazon S3• インターネットストレージ• バケットという単位の中にオブジェクト (= ファイル)を置くことが可能
• http://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/Welcome.html
22
Amazon SQS• メッセージキューサービス• SNS のサブスクライバとして登録が可能
• http://docs.aws.amazon.com/ja_jp/AWSSimpleQueueService/latest/SQSDeveloperGuide/Welcome.html
27
配信先リストの例
29
arn:aws:sns:ap-northeast-1:XXXXXXXXXXXX:endpoint/GCM/xxx-sns/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeeearn:aws:sns:ap-northeast-1:XXXXXXXXXXXX:endpoint/APNS/xxx-sns/aaaaaaaa-bbbb-cccc-dddd-ffffffffffff
ARN (Amazon Resouce Name) が列挙されたもの
たくさんの EC2 で並列化• たくさんの EC2 でワークスティール• bucket にある配信先リストを並列処理• 配信先リストからの配信先分割を並列処理
• モバイルプッシュ通知を並列処理→ 課金すればするほど並列度が上がる!
37
たくさんの EC2 で並列化• たくさんの EC2 でワークスティール• bucket にある配信先リストを並列処理• 配信先リストからの配信先分割を並列処理
• モバイルプッシュ通知を並列処理→ 課金すればするほど並列度が上がる!
39
並列化 #2
40
• 配信先リストから offset 毎に配信先を配信くんインスタンスで並列に読み込む
• Request header の Range 指定で実現• http://
docs.aws.amazon.com/ja_jp/AmazonS3/latest/API/RESTObjectGET.html
• ARN は固定長ではない → 何らかの工夫が必要
たくさんの EC2 で並列化• たくさんの EC2 でワークスティール• bucket にある配信先リストを並列処理• 配信先リストからの配信先分割を並列処理
• モバイルプッシュ通知を並列処理→ 課金すればするほど並列度が上がる!
41
たくさんの EC2 で並列化• たくさんの EC2 でワークスティール• bucket にある配信先リストを並列処理• 配信先リストからの配信先分割を並列処理
• モバイルプッシュ通知を並列処理→ 課金すればするほど並列度が上がる!
43
配信性能• 2500 push / min• t2.micro x 1 の場合の数値• インスタンスタイプは性能に影響なし• 配信くんを増やせば性能も上がる• プログラムチューニングも効果あるかも
44
まとめ (前半)• AWS ネイティブなモバイルプッシュ配信ミドルウェアを開発
• AWS で同機能が提供されたらあっさり捨てる心構えが大事• たぶんその方が高性能• あくまでも「ないからつくってみた」
45
利用している技術• Single Command Deploy• Spring Boot (Java)• Docker• Gradle• AWS• Elastic Beanstalk• CloudFormation
47
Single Command Deploy• 自動ビルド厨の成れの果ての最終形• 単一コマンドですべてを完了する仕組み• Spring Boot アプリケーションを
• Docker コンテナ化し
• Gradle タスクで
• CloudFormation で構築した
• Elastic Beanstalk 環境にデプロイ
49
Single Command Deploy• 詳細は弊社都元の slideshare を参照• http://www.slideshare.net/daisuke_m/
single-command-deploy-gradleawsplugin
50
最近の Java フレームワーク• Play Framework• Dropwizard• Ninja Framework• Spring Boot• etc…• スタンドアロンなアプリケーションを実現• Java プロセスひとつで http サーバが起動
52
Spring Boot• 起動が簡単• $ java -jar your-app.jar• クラスパスの設定およびコンテナ準備は不要
• 設定の自動化• classpath 内のクラスの有無による自動設定• アノテーションによるカスタマイズ
• Spring Boot を使ってみよう
• http://dev.classmethod.jp/server-side/spring-boot/
53
Docker• Go 製のオープンソースの仮想化技術• アプリケーションをコンテナ化• Infrastructure as Code (Dockerfile)• VCS によるインフラ情報の管理が可能
55
Docker (for Spring Boot)• Java インストール済のファイルシステムイメージに your-app.jar を取り込んだイメージを作成
• 内部で java プロセスを起動• 環境依存を極力排除
56
Dockerfile の例# Java インストール済ファイルイメージ
FROM java:openjdk-8-jdk# 指定したポートの開放
EXPOSE 8080WORKDIR /opt/haishinkunADD your-app—x.y.z.jar /opt/haishinkunCMD /usr/bin/java -jar your-app—x.y.z.jar
57
Elastic Beanstalk
58
http://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/Welcome.html
Elastic Beanstalk• AWS 上にアプリケーションの基本構成を自動構築• ELB (ロードバランサ)
• EC2 (コンピューティング資源)
• Auto Scaling (負荷分散)
• 開発者は Application Bundle を準備することでアプリケーションを構築可能
59
Application Bundle• Elastic Beanstalk の作法に従ったアプリケーションを含む zip アーカイブ• your-app.jar• Dockerfile• etc…
60
CloudFormation
61
http://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/Welcome.html
CloudFormation• アプリケーション全体を構成する AWS 資源を定義
• Elastic Beanstalk (コンピューティング環境)
• VPC (仮想ネットワーク)
• S3 (ストレージ)
• RDS (データベース)
• etc…• Infrastructure as Code (テンプレート)
• VCS によるインフラ情報の管理が可能
62
テンプレートの例{ "AWSTemplateFormatVersion": "2010-09-09", "Description": “Your App environment template", "Parameters": { … // 構築時に決定するパラメータ … // インスタンスタイプ, 台数, SSH 接続元 IP, etc… }, "Resources": { … // 設計時に決定するリソース … // EC2, ELB, S3, RDS, etc… }}
63
Gradle• Java 製のビルド自動化ツール• タスクという単位で処理• ライブラリ管理• パッケージ作成• etc…
• Spring Boot アプリケーションの起動• spring-boot-gradle-plugin
66
Gradle の例
67
apply plugin: "java" // タスク群の追加apply plugin: "spring-boot"
task helloWorld << { // タスクの定義 println "Hello, world!"}
dependencies { // ビルド依存の定義 compile 'org.springframework.boot:spring-boot:1.3.0.RELEASE' compile 'com.amazonaws:aws-java-sdk:1.10.34'}
gradle-aws-plugin• Gradle から AWS リソースを操作するためのタスク群
• github で公開中
• https://github.com/classmethod-aws/gradle-aws-plugin
68
導入の例buildscript { repositories { mavenCentral() maven { url "https://plugins.gradle.org/m2/" } } dependencies { classpath "jp.classmethod.aws:gradle-aws-plugin:0.22.2" }}
apply plugin: "jp.classmethod.aws.s3"apply plugin: "jp.classmethod.aws.cloudformation"apply plugin: "jp.classmethod.aws.beanstalk"
69