20150328 humansociria

80
ミッションクリティカルなシステムを 支えるアプリ開発 ~初心者がつまずくポイント解説と コミュニティの歩き方~ 株式会社ケーシーエスキャロット 江森 真由美 2015.03.28 @ヒューマンソシリア

Upload: mayumi-emori

Post on 15-Jul-2015

145 views

Category:

Software


0 download

TRANSCRIPT

ミッションクリティカルなシステムを 支えるアプリ開発

~初心者がつまずくポイント解説と コミュニティの歩き方~

株式会社ケーシーエスキャロット 江森 真由美

2015.03.28 @ヒューマンソシリア

自己紹介• 江森 真由美 (@emorima)

• 株式会社ケーシーエスキャロット ユニットマネージャー

• Asakusarb メンバー

• Rails Girls Tokyo 3rd & 4th オーガナイザー

• Rails Girls Shiojiri 1st コーチ

会社概要

放送局ビデオ編集・配信システム開発 AV機器・情報家電組込みシステム開発 Windowsアプリケーション開発 通信制御アプリケーション開発 Webアプリケーション開発 Androidアプリケーション開発

業務経歴• 入社~2年Visual Basic、C、Java とか業務で色々な言語を触れる機会はあるが、6ヶ月程度の業務が終わればそれで終わりの繰り返し

• 3年~C++でWindows アプリを作りまくる (ThreadでのSocket通信アプリ、バイナリデータ解析アプリ等)

• 6年PHPでWebアプリを作る

• 7年 (2003年)~「来月からRubyをやってもらいます」というお客さんの一言でRubyを使い始める。「今度、Railsが出ます」の一言で、 Rails 0.11を使い始める。

• 現在に至る

本日お話しすること

ミッションクリティカルな システムを

支えるアプリ開発

‘ミッション クリティカル’ とは

• 任務や業務の遂行に必要不可欠な要素(機器、プロセス、手順、ソフトウェアなど)のこと。

• 障害の発生による中断や停止が発生した場合に社会的影響が大きい、交通機関や金融機関などの機関システムは一般的にミッションクリティカルであり、停止しないことが求められる。

• (中略)ミッションクリティカルシステムを想定した技術や製品では、信頼性・可用性・保守性といった面が高められている。          ~wikipediaより~

ミッションクリティカルな システム

って 何?

jishin.net

http://demo.jishin.net/map

jishin.net

東京ガス(株)の 「超高密度リアルタイム

地震防災システム(SUPREME)」 が収集した地震情報を

リアルタイムに提供するサービス

jishin.net

配信の仕組みhttp://jishin.net/point.html#link_1

jishin.net• 地震が発生すると利用者の携帯電話に速報メールを送る

• 携帯電話・PCからリアルアイムに地震の情報を把握することが可能

地震時の初動対応を確実にサポートする

実際に見てみましょう

会員制

http://jishin.net

朗報です

http://demo.jishin.net/map

http://jishin.net

yokohama.jishin.net

http://yokohama.jishin.net

jishin.net 開発の中で Railsを始めたばかりの方がはまりそうなポイント

第1のポイント

画面表示

遅い

どこが遅いのかを知る

Started GET "/" for ::1 at 2015-03-28 11:00:22 +0900 Processing by Rails::WelcomeController#index as HTML Rendered /Users/emorima/.rvm/gems/ruby-2.2-head/gems/railties-4.2.0/lib/rails/templates/rails/welcome/index.html.erb (0.0ms) Completed 200 OK in 3ms (Views: 2.3ms | ActiveRecord: 0.0ms)

Started GET "/users" for ::1 at 2015-03-28 11:00:24 +0900 Processing by UsersController#index as HTML User Load (0.2ms) SELECT "users".* FROM "users" Rendered users/index.html.erb within layouts/application (2.4ms) Completed 200 OK in 1333ms (Views: 1330.5ms | ActiveRecord: 0.3ms)

• SQLのレスポンスが遅い

• 画面表示が遅い

• アクセスが集中した時に遅い

• SQLのレスポンスが遅い

• 画面表示が遅い

• アクセスが集中した時に遅い

SQLのレスポンス要因(1)

include をせずに、 View側で余分なSQLが毎回発行されている

SQLのレスポンス要因(2)

データベースの設定 (INDEXの設定)

SQLのレスポンス要因(3)

とても複雑なSQLを Arelを使って 書いている

SQLのレスポンス要因(4)

とても複雑なSQLをfind_by_sqlで実行しているが、不要なデータを取得して遅くなっている

項目1 項目2 状態あ A 正常あ B 正常い A 異常い C 異常

状態管理テーブル(日単位)

項目1 項目2 時刻 値あ A 00:00:00 1あ A 00:01:00 2あ A 00:02:00 2あ B 00:00:00 3

データテーブル(日単位)

940万レコード/日

• SQLのレスポンスが遅い

• 画面表示が遅い

• アクセスが集中した時に遅い

画面表示の要因(1)

View側の画面表示に javascriptで

重い処理を実行している

画面表示の要因(2)

大きな画像の読み込みや、画面に表示している画像

数が多い

画面表示の要因(3)

Cacheを使っていないFragment Cache(Rails3)

Russian-doll caching(Rails4) Cache Digest(Rails4)

• SQLのレスポンスが遅い

• 画面表示が遅い

• アクセスが集中した時(負荷テスト)に遅い

負荷時の要因(1)

Webサーバの設定 (MaxClient、

ThreadPerChildの設定)

「RailsはSQL知らなくても 出来ますか?」

Rails開発で付随するモノ

ちょっと休憩

FizzBuzzをやってみよう

FizzBuzzプレイヤーは円状に座る。 最初のプレイヤーは「1」と数字を発言する。 次のプレイヤーは直前のプレイヤーの次の数字を発言していく。 ただし、3で割り切れる場合は 「Fizz」、5で割り切れる場合は 「Buzz」、両者で割り切れる場合は 「Fizz Buzz」 を数の代わりに発言しなければならない。 発言を間違えた者や、ためらった者は脱落となる。 ~wikipediaより~

自分ならどんなコードを 書くか考えてみてください

出力する値は、1~50とします メソッドも使ってよしとします

1.upto(50) do |i| if i % 15 == 0 puts ‘FizzBuzz’ elsif i % 3 == 0 puts ‘Fizz’ elsif i % 5 == 0 puts ‘Buzz’ else puts i end end

「3と5の両方で割りきれる」と 「15で割りきれる」は

同じではない

3、5が 2、4に変わったら プログラムの変更が必要

信頼性・保守性

V1 = 3 V2 = 5 1.upto(50) do |i| s = ‘’ s.concat ‘Fizz’ if 0 == i % V1 s.concat ‘Buzz’ if 0 == i % V2 s.concat i.to_s if s.empty? puts s end

値が変更されたら~ 機能が拡張されたら~ を考えたプログラム

第2のポイント

データ登録(画面以外から) ‘も’

遅い

• Rails(Active Recorde)で登録するために、cron起動となっていて遅い

• データ量が多すぎるため、BULK INSERTを使っても遅い

• Rails(Active Record)で登録するために、cron起動となっていて遅い

• データ量が多すぎるため、BULK INSERTを使っても遅い

cronの要因(1)

cronで設定できる 1分毎

cronA データファイルがあったら、データ登録を行う(処理時間3sec) cronB Aが更新したデータがあったら、データ更新を行う(処理時間2sec) cronC Bが更新したデータがあったら画面表示用のデータ更新を行う(処理時間2sec)

cron 最長4分

• Rails(Active Recorde)で登録するために、cron起動となっていて遅い

• データ量が多すぎるため、BULK INSERTを使っても遅い

データ量の要因(1)

• 最大10数万のデータを15分毎に更新

• 940万を超えるデータを更新

まとめ

• Railsだけで解決できない問題も発生するので、対応できる知識

• 「Railsだけ」にこだわらず、業務の中でのゴールに合わせて柔軟な発想

ちょっと休憩

好きなメソッド instance_eval

class Foo def initialize data @key = data end private def do_fuga p 'secret' end end

some = Foo.new 'XXX' some.instance_eval{p @key} #=> "XXX" some.instance_eval{do_fuga } #=> "secret" # private メソッドも呼び出せる

http://docs.ruby-lang.org/ja/2.2.0/method/BasicObject/i/instance_eval.html

privateの意味って何?

Object#try!

Rails はRubyのオリジナルクラスを、便利に拡張

String#blank?

Rails Loading development environment (Rails 4.2.0) 2.2-head :001 > 'a'.blank? => false 2.2-head :002 >

Ruby 2.2-head :001 > 'a'.blank? NoMethodError: undefined method `blank?' for "a":String from (irb):1 from /Users/emorima/.rvm/rubies/ruby-2.2-head/bin/irb: 11:in `<main>' 2.2-head :002 >

おまけ ~コミュニティの歩き方~

NEVER CHANGE THE WORLD

このままの世界が ずっと続くと思っていた

自己紹介• 江森 真由美 (@emorima)

• 株式会社ケーシーエスキャロット ユニットマネージャー

• Asakusarb メンバー

• Rails Girls Tokyo 3rd & 4th オーガナイザー

• Rails Girls Shiojiri 1st コーチ

初めはどうしたらいいか 何を話したらいいか わからなかった

色々参加してみた 何度も参加してみた

#rubyfriends

I CAN CHANGE MY WORLD

‘世界は変わる’って知った

TokyuRuby会議06

Rails Girls

join 👉 organize

自己紹介• 江森 真由美 (@emorima)

• 株式会社ケーシーエスキャロット ユニットマネージャー

• Asakusarb メンバー

• Rails Girls Tokyo 3rd & 4th オーガナイザー

• Rails Girls Shiojiri 1st コーチ

https://twitter.com/FinEmbTokyo/status/567917864792907776

コミュニティというのは、 技術的なスキルを

あげるだけの場ではなく、 新しい仲間と出会い、

自分の世界が広がっていく場

コミュニティ参加するには、まずどうすればよいか?

地域Rubyの会

https://github.com/ruby-no-kai/official/wiki/RegionalRubyistMeetUp

イベント管理サービスで 興味のあるイベントに参加する

(Doorkeeper, Peatix etc.)

はじめの1歩を 踏み出すか

変わらないままでいるか

あなたのRuby Lifeを 楽しんでください :)

ご静聴 ありがとうございました

QA