rubyとクラウドサービスで実現したec決済共通基盤@ruby association...

28
(株)DTS 大西正太

Upload: shota-onishi

Post on 28-May-2015

246 views

Category:

Technology


0 download

DESCRIPTION

2013/11, 2014/1にRuby Associationのビジネスセミナーで発表した時の資料です。 http://www.ruby.or.jp/ja/news/20131218.html

TRANSCRIPT

Page 1: Rubyとクラウドサービスで実現したEC決済共通基盤@Ruby Association ビジネスセミナー201401

(株)DTS 大西正太

Page 2: Rubyとクラウドサービスで実現したEC決済共通基盤@Ruby Association ビジネスセミナー201401
Page 3: Rubyとクラウドサービスで実現したEC決済共通基盤@Ruby Association ビジネスセミナー201401

Me

大西正太

(株)DTS SIer

社員2700名

創業40年強

ITサービス事業本部

ITインテグレーション事業部

IT Platform担当 クラウド活用を推進

Page 4: Rubyとクラウドサービスで実現したEC決済共通基盤@Ruby Association ビジネスセミナー201401

Ruby(Rails)Programmer / Architect / PM

2005~

Page 5: Rubyとクラウドサービスで実現したEC決済共通基盤@Ruby Association ビジネスセミナー201401

DTSとRuby

Ruby System Integrator Gold取得

Ruby Association評議員輩出企業

2005年よりRuby on Railsを活用

Page 6: Rubyとクラウドサービスで実現したEC決済共通基盤@Ruby Association ビジネスセミナー201401

Bizca (Groupware)

Page 7: Rubyとクラウドサービスで実現したEC決済共通基盤@Ruby Association ビジネスセミナー201401

スポーツリアルタイム配信サイト

(on Heroku)

Page 8: Rubyとクラウドサービスで実現したEC決済共通基盤@Ruby Association ビジネスセミナー201401

Heroku add-on Bounscale

(SaaS:オートスケール)

Page 9: Rubyとクラウドサービスで実現したEC決済共通基盤@Ruby Association ビジネスセミナー201401

この発表のあらすじ

近年サービスの垂直立ち上げのご要望が増えています

ご要望に応えるために講じている3つの方策を「EC決済サービス基盤」の事例を交えご紹介します

最後にそれらを今後どのように改善しようと考えているかをご紹介します

Page 10: Rubyとクラウドサービスで実現したEC決済共通基盤@Ruby Association ビジネスセミナー201401
Page 11: Rubyとクラウドサービスで実現したEC決済共通基盤@Ruby Association ビジネスセミナー201401

サービスの垂直立ち上げ

多くのお客様が3ヶ月前後でのリリース要望

でも開発期間の標準的な指標値からすると普通にやってたら間に合わない

工数(人月) 計算式 開発期間(月) 1 2.15 * (1^(1 / 3)) 2.15 5 2.15 * (5^(1 / 3)) 3.68

10 2.15 * (10^(1 / 3)) 4.63 30 2.15 * (30^(1 / 3)) 6.68 60 2.15 * (60^(1 / 3)) 8.42

100 2.15 * (100^(1 / 3)) 9.98

Page 12: Rubyとクラウドサービスで実現したEC決済共通基盤@Ruby Association ビジネスセミナー201401

どうすればいい?

①作る範囲を 減らす

②作る開発者を柔軟に増やす

③作る速さを 上げる

Page 13: Rubyとクラウドサービスで実現したEC決済共通基盤@Ruby Association ビジネスセミナー201401

具体的には・・・

①作る範囲を減らす

②作る開発者を柔軟に増やす

③作る速さを上げる

クラウド コンピューティング

ニアショア

Page 14: Rubyとクラウドサービスで実現したEC決済共通基盤@Ruby Association ビジネスセミナー201401
Page 15: Rubyとクラウドサービスで実現したEC決済共通基盤@Ruby Association ビジネスセミナー201401

プロジェクト概要

お客様のグループ共通のECサイトでの決済サービス基盤

決済という意味ではエンタープライズ

開発規模:

数十人月(全体)

開発期間:

ファーストリリース 3ヵ月

Page 16: Rubyとクラウドサービスで実現したEC決済共通基盤@Ruby Association ビジネスセミナー201401

作る範囲を減らす

多数のシステム連携によりサービス実現

顧客管理データベース

オブジェクトストレージ

決済代行システム

基幹システム …etc

全てを一から構築・実装していた場合と比べて大幅な工数削減

クラウドの積極活用

Page 17: Rubyとクラウドサービスで実現したEC決済共通基盤@Ruby Association ビジネスセミナー201401

作る開発者を柔軟に増やす

質を落とさず最適な人数・スキルの

開発人員を全国からオンタイムに調達

顧客 (東京)

DTS (東京)

外注先 (地方)

チケット チケット

Git

Git Git Git

Git

対面 会議

ビデオ会議

ニアショアを活用した分散開発

Page 18: Rubyとクラウドサービスで実現したEC決済共通基盤@Ruby Association ビジネスセミナー201401

作る速さを上げる

具体的に何を開発するのか?

クラウドのオーケストレーション

開発対象固有の業務ロジック

クラウド オーケストレーション

サービス固有の 業務ロジック

クラウド

Ruby利用で高速開発 !

Page 19: Rubyとクラウドサービスで実現したEC決済共通基盤@Ruby Association ビジネスセミナー201401

Rubyでクラウドオーケストレーションはなぜ高速?

Rubyの柔軟性でクラウド接続がシンプル記述

クラウド連携はマッピングなど定型的な処理が大半

Rubyのリフレクション機構でシンプルに記述できる xxxxSession = XxxxSession.openSession( USER_ID, PASSWORD, END_POINT); List<Brand__c> objectList = new ArrayList<Brand__c>(); StringBuffer selectQuery = new StringBuffer(); selectQuery.append("SELECT "); selectQuery.append("Id, "); selectQuery.append("Name "); selectQuery.append("FROM "); selectQuery.append("Brand__c "); selectQuery.append("where IsDeleted = false "); QueryResult rs = xxxxSession.binding.query(selectQuery.toString()); boolean done = false; if (rs.getSize() > 0){ while (!done) { for (SObject so : rs.getRecords()) { objectList.add((Brand__c)so); } if (rs.isDone()) { done = true; } else { rs = xxxxSession.binding.queryMore(rs.getQueryLocator()); } } }

client = Xxxx::Client.new client.authenticate :token => "xxx", :instance_url => "xxx" client.xxxx("Brand") result = Brand.find_by_is_deleted(false)

1/6

Page 20: Rubyとクラウドサービスで実現したEC決済共通基盤@Ruby Association ビジネスセミナー201401

Rubyで業務ロジック開発はなぜ高速?(1)

Rubyの柔軟性でDB接続がシンプル記述

業務ロジックの大半、DBアクセスをシンプル記述

Rubyのリフレクションをフルに生かしたRailsの力 class Meigara < ActiveRecord::Base

end

package jp.kawakubo;

import java.io.Serializable;

import javax.persistence.Column;

import javax.persistence.Entity;

import javax.persistence.Id;

import javax.persistence.Table;

@Entity

@Table(name = "MEIGARA")

public class Meigara implements Serializable {

private int id = 0;

private String name = "";

private String nameKana = "";

private int dosu = 0;

private String koji = "";

private String sweetPotatoName = "";

private String manufacturer = "";

private float volume = 0f;

private int price = 0;

public Meigara() {

}

public Meigara(

int id,

String name,

String nameKana,

int dosu,

String koji,

String sweetPotatoName,

String manufacturer,

float volume,

int price) {

this.id = id;

this.name = name;

this.nameKana = nameKana;

this.dosu = dosu;

this.koji = koji;

this.sweetPotatoName = sweetPotatoName;

this.manufacturer = manufacturer;

this.volume = volume;

this.price = price;

}

@Id

@Column(name = "ID")

public int getId() {

return id;

}

public void setId(int id) {

this.id = id;

}

@Column(name = "NAME")

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

@Column(name = "NAMEKANA")

public String getNameKana() {

return nameKana;

}

public void setNameKana(String nameKana) {

this.nameKana = nameKana;

}

@Column(name = "DOSU")

public int getDosu() {

return dosu;

}

public void setDosu(int dosu) {

this.dosu = dosu;

}

@Column(name = "KOJI")

public String getKoji() {

return koji;

}

public void setKoji(String koji) {

this.koji = koji;

}

@Column(name = "SWEETPOTATONAME")

public String getSweetPotatoName() {

return sweetPotatoName;

}

public void setSweetPotatoName(String

sweetPotatoName) {

this.sweetPotatoName = sweetPotatoName;

}

@Column(name = "MANUFACTURER")

public String getManufacturer() {

return manufacturer;

}

public void setManufacturer(String manufacturer) {

this.manufacturer = manufacturer;

}

@Column(name = "VOLUME")

public float getVolume() {

return volume;

}

public void setVolume(float volume) {

this.volume = volume;

}

@Column(name = "PRICE")

public int getPrice() {

return price;

}

public void setPrice(int price) {

this.price = price;

}

} ※JPAの例

1/75

Page 21: Rubyとクラウドサービスで実現したEC決済共通基盤@Ruby Association ビジネスセミナー201401

Rubyで業務ロジック開発はなぜ高速?(2)

基礎的なデータ組立処理がシンプル記述

業務ロジックは配列・文字・数値などの組立が多い

Rubyのブロック機構でシンプルに記述できる

List<String> names = new ArrayList<String>(); if(group != null){ List<User> users = group.getUsers(); for (User user : users) { names.add(user.getName()); } }

names = group.try(:users).map(&:name)

1/7

例)あるグループに所属しているユーザの名前の入った配列を取得

Page 22: Rubyとクラウドサービスで実現したEC決済共通基盤@Ruby Association ビジネスセミナー201401

更にRubyの開発が早い理由

ソフトウェア開発は大半がうまく動かない問題の調査をしている

ホビーでRubyをやる人が世界中にたくさん!

まつもとさんの文化

ソーシャルコーディングサービスなどに有用な情報が多数ある

Page 23: Rubyとクラウドサービスで実現したEC決済共通基盤@Ruby Association ビジネスセミナー201401

Result

Rubyを含めたこれらの対応のおかげで

無事スケジュール通り

予算通り

期待の品質で

サービスインできました

Page 24: Rubyとクラウドサービスで実現したEC決済共通基盤@Ruby Association ビジネスセミナー201401
Page 25: Rubyとクラウドサービスで実現したEC決済共通基盤@Ruby Association ビジネスセミナー201401

クラウド活用の改善

Keep クラウドの利用は今後も継続したい ・大幅に工数削減できている

Problem 性能の改善が必要 ・一般にSaaS連携箇所は性能が出づらい ・毎回個別にキャッシングなどの対応 →より汎用的な対応が必要

Try 他レイヤのクラウド活用 ・今回はSaaSの利用 ・DTSではIaaS/PaaSの実績もあり ・より積極的に提案していきたい

Page 26: Rubyとクラウドサービスで実現したEC決済共通基盤@Ruby Association ビジネスセミナー201401

ニアショア活用の改善

Keep ニアショアは今後も継続したい ・現実的な費用でサービスの垂直立ち上げ可能

Problem ニアショア先がなかなか見つからない ・お声掛けください

Try クラウドソーシングの活用 ・更なる分散開発を追求していきたい ・SIerとしてはセキュリティなど課題がある ・携帯端末のテストなど適用内容を見極めたい

Page 27: Rubyとクラウドサービスで実現したEC決済共通基盤@Ruby Association ビジネスセミナー201401

Ruby活用の改善

Keep Rubyの利用 ・他言語に比べて今でもNo.1の開発スピード ・Web開発のトレンドはRailsが牽引

Problem 性能が劣る ・Javaやnode.jsに大きく劣る

Try 他言語のハイブリッド活用 ・Ruby : 作るのが速いので基本はRuby ・node.js: I/Oが多い、WebSocketなど ※コードは読みづらくなりがち ・Java : 計算速度が必要な場合など ※作るのに時間がかかる

Page 28: Rubyとクラウドサービスで実現したEC決済共通基盤@Ruby Association ビジネスセミナー201401

Ruby開発はお任せください

お問い合わせ: ITサービス本部ITインテグレーション事業部ITプラットフォーム担当

大西正太 [email protected]