2014 03-15 業務アプリinsider ソフトウェア方面の先進テクノロジー

47
ソソソソソソソソソソソソソソソソソ Sansan ソソソソソソソソソソソソソ Sansan ソ ソ ソ ソ ソソ ソソ

Upload: hub-dotnetdeveloper

Post on 28-May-2015

4.000 views

Category:

Technology


2 download

TRANSCRIPT

Page 1: 2014 03-15 業務アプリinsider ソフトウェア方面の先進テクノロジー

ソフトウェア方面の先進テクノロジー~ Sansan 流の業務系アプリ開発者視点 ~

Sansan 株式会社藤倉 成太

Page 2: 2014 03-15 業務アプリinsider ソフトウェア方面の先進テクノロジー

• 弊社サービス Sansan について• Sansan における OSS の活用事例

• Web フレームワーク• PostgreSQL 、 Redis とクライアントライブラリ• インフラ

今日話すこと

Page 3: 2014 03-15 業務アプリinsider ソフトウェア方面の先進テクノロジー

名前 藤倉 成太(フジクラ シゲモト)

仕事 Sansan 事業部 開発部部長 アーキテクト 2009 年 Sansan 入社

自己紹介

Page 4: 2014 03-15 業務アプリinsider ソフトウェア方面の先進テクノロジー

Sansan についてまとめ

Page 5: 2014 03-15 業務アプリinsider ソフトウェア方面の先進テクノロジー

たとえばRDB : Oracle / PostgreSQL / MySQLNoSQL : Memcached / Redis / MongoDB / RavenDBWeb Framework : Nancy / ServiceStackDI : Unity / Ninjectテスト : NUnit / NSpec / SpecFlowロギング : log4net / NLog / FluentdCI : Jenkins

さらに選択肢を増やすBuild Insider - 社内の開発環境の改善&効率化のためにNuGet

を活用しようそれぞれが作った、ちょっとしたツールやコードを社内用 NuGet リポジトリに、公開しましょう

.NET でも選択肢の数は変わらない

Page 6: 2014 03-15 業務アプリinsider ソフトウェア方面の先進テクノロジー

実績には注意GitHub なら Watch や Star 、 Issues などを確認する。NuGet なら Downloads なども参考になる。それらを踏まえて、リスクもきちんと評価した上での採用を。

バグは、あるテストは十分に。できればソースコードも読む。利用する箇所だけだったり、軽く流し読みするだけでも安心感は違う。

ご利用は計画的に

Page 7: 2014 03-15 業務アプリinsider ソフトウェア方面の先進テクノロジー

Sansan について弊社事例が、皆様の会社での

OSS 導入の一助になれば幸いです

Page 8: 2014 03-15 業務アプリinsider ソフトウェア方面の先進テクノロジー

1. Sansan について2. Sansan の構成

1. Web フレームワーク2. DB(PostgreSQL)3. キャッシュ / セッション (Redis)4. インフラ

3. まとめ

アジェンダ

Page 9: 2014 03-15 業務アプリinsider ソフトウェア方面の先進テクノロジー

1. Sansan について2. Sansan の構成

1. Web フレームワーク2. DB(PostgreSQL)3. キャッシュ / セッション (Redis)4. インフラ

3. まとめ

アジェンダ

Page 10: 2014 03-15 業務アプリinsider ソフトウェア方面の先進テクノロジー

名刺管理 Web サービスを開発、運営創業 7 年目で名刺管理に絞ったシステムを作っています。名刺管理システム業界トップ。ちょっとだけ CM 流してます。

プロダクト法人向け名刺管理 SansanC# + ASP.NET + PostgreSQL

個人向け名刺管理 EightRuby on Rails + MySQL + AWS

Sansan 株式会社について

Page 11: 2014 03-15 業務アプリinsider ソフトウェア方面の先進テクノロジー

ASP.NET 上で動く Web アプリ個人向けサービスに比較するとユーザ数はずっと少ない。ソーシャルゲームなどでは 100 万人以上、 Eight で 50 万人以上Sansan は数万人、前職では数百人。

負荷200 万リクエスト / 日を 2 台の Web/App サーバで。突然跳ね上がることは滅多になく、平日の 9-20 時にアクセスが集中。休日のアクセスはほぼ無い。

法人向けサービス Sansan の特徴

Page 12: 2014 03-15 業務アプリinsider ソフトウェア方面の先進テクノロジー

データユーザ数と比較すると、おそらくデータは多い。1 億超レコードのテーブルや、数千万、数百万レコードのテーブルが数十。たとえば、名刺テーブルは 2 千万超レコード。個人向けサービスの Eight は 1 千万超レコード。

システムに求められる要件可用性、一貫性、アクセスコントロールなどの要求は高い。一方で、パフォーマンスは個人向けサービスに比べると緩い。如何に速くするか、よりも如何に確実に処理するかが重要。また、営業やサポート部署への影響にも配慮する必要がある。

法人向けサービス Sansan の特徴

Page 13: 2014 03-15 業務アプリinsider ソフトウェア方面の先進テクノロジー

言語C# 5.0 (.NET Framework 4.5)

Web/AppWindows Server 2008 R2 / IIS 7.5

キャッシュ / セッションRedis

DBPostgreSQL 9.1

インフラ後述

Sansan の構成

Page 14: 2014 03-15 業務アプリinsider ソフトウェア方面の先進テクノロジー

生産性創業当初の限られた人員で Web/ クライアント (※)/ 社内システム全てを作る必要があった。クライアント OS は最も一般的な Windows をターゲットに、Windows+ 高生産性=Windows Forms を採用するに至る。スキルを応用できるし、という理由で Web も。

※スキャナと連携する名刺登録アプリケーション

なぜ C# か

Page 15: 2014 03-15 業務アプリinsider ソフトウェア方面の先進テクノロジー

1. Sansan について2. Sansan の構成

1. Web フレームワーク2. DB(PostgreSQL)3. キャッシュ / セッション (Redis)4. インフラ

3. まとめ

アジェンダ

Page 16: 2014 03-15 業務アプリinsider ソフトウェア方面の先進テクノロジー

1. Sansan について2. Sansan の構成

1. Web フレームワーク2. DB(PostgreSQL)3. キャッシュ / セッション (Redis)4. インフラ

3. まとめ

アジェンダ

Page 17: 2014 03-15 業務アプリinsider ソフトウェア方面の先進テクノロジー

フレームワークプロダクトは Web Forms/MVC/Web API併用。社内ツールに Nancy

Web/App

Page 18: 2014 03-15 業務アプリinsider ソフトウェア方面の先進テクノロジー

特別な使い方はしていないので

割 愛

Web Forms/MVC/Web API

Page 19: 2014 03-15 業務アプリinsider ソフトウェア方面の先進テクノロジー

軽量Web Framework処理を一つのメソッドで記述。HTTPメソッドごとルーティングを指定して処理を記述。Ruby の Web Framework 、 Sinatra にインスパイア。

Nancy

require ‘sinatra’get ‘/’ do # do somethingend

post ‘/’ do # do somethingend

Page 20: 2014 03-15 業務アプリinsider ソフトウェア方面の先進テクノロジー

Nancy

public class MyModule : NancyModule { public MyModule() { Get[“/page/{id}”] = param => { // データ取得 var data = new DbClient().GetData(param.id); // データ加工 var responceData = data.Select(_ => _.Value);      // データ表示 return View["page", new { Data = responceData }]; }; Post[“/regist”] = param => { // 省略 }; }}

Page 21: 2014 03-15 業務アプリinsider ソフトウェア方面の先進テクノロジー

用途ログの収集解析アプリで利用。ASP.NET & Nancy & MongoDB

やりたかったことやりたい処理は単純なデータ取得 > LINQ+α で加工 > 表示。将来も含めて、 MVC を利用するほどに大げさなものではなく、容易に保守できるような作りにしたかった。

Nancy

Page 22: 2014 03-15 業務アプリinsider ソフトウェア方面の先進テクノロジー

結果一つのメソッドに処理が集まるので、自然とシンプルに実装するようになり、ルーティングも一目で分かるのでデバッグや保守が非常に容易に。とにかく気軽に API を作成できるので、ちょっと Linux サーバと

の連携を取りたい時にも利用している。

Nancy

Page 23: 2014 03-15 業務アプリinsider ソフトウェア方面の先進テクノロジー

1. Sansan について2. Sansan の構成

1. Web フレームワーク2. DB(PostgreSQL)3. キャッシュ / セッション (Redis)4. インフラ

3. まとめ

アジェンダ

Page 24: 2014 03-15 業務アプリinsider ソフトウェア方面の先進テクノロジー

PostgreSQL おさらい• OSS の RDBMS• 可用性向上のための MVCC アーキテクチャ• 組み込み全文検索エンジン• 豊富な周辺プロダクト

pgpool-II => コネクションプーリング、レプリケーション、負荷分散

Slony-I => レプリケーションPL/Proxy => 水平分散FDW => 外部データラッパーPosgres-XC => 書き込み特化の DB クラスタ

PostgreSQL について

Page 25: 2014 03-15 業務アプリinsider ソフトウェア方面の先進テクノロジー

最初は Oracle創業メンバーに Oracle出身者がいたり、たまたま、創業当時のエンジニアが Oracle に習熟していた。

Oracle から PostgreSQL へ規模が大きくなるに従い、コストとインフラの技術的限界が重荷になっていったため、 OSS の DB を検討。

pl/pgsql の互換性、チューニングの勘所など、Oracle からの移行コストが低いことが PostgreSQL の最大の決定要因になった。

なぜ PostgreSQL か

Page 26: 2014 03-15 業務アプリinsider ソフトウェア方面の先進テクノロジー

クエリ、設計の最適化極端な高パフォーマンスは必要とされていないので、基本に忠実に作ることを心がける。seq scan させない、頻繁に使うデータは必ずメモリに格納し、ディスク I/O を削減する。主要テーブルの Cache Hit Rate はCacti で常に監視して 99%以上を保つ。

これらの実現のために、コードレビューとは別にSQL/ テーブル設計レビューを実施している。

パフォーマンス維持の工夫

Page 27: 2014 03-15 業務アプリinsider ソフトウェア方面の先進テクノロジー

データプロバイダは NpgsqlSQL Server とほぼ同じ記述で利用可能で、 OSS としてはほぼ唯一の選択肢になる。 ADO.NET データプロバイダとして大抵のことはできるが、 Entity Framework への対応はない。品質が特別高い訳ではないことが残念なところ。

• Timeout が既定値• 文字列日付の日付型への変換失敗• 大量のスレッドからの実行時、例外• 164 個の Open Issue (資料作成時 )

ただし、 Github 上での活動はそれなりに活発で、次期バージョンでは Entity Framework もサポートされるらしい。

C# からの PostgreSQL 活用

Page 28: 2014 03-15 業務アプリinsider ソフトウェア方面の先進テクノロジー

Npgsql サンプルコード

using (var conn = new NpgsqlConnection(connStr)){ conn.Open(); var dataAdapter = new NpgsqlDataAdapter( @"select * from table_name", conn); var dataSet = new DataSet(); dataAdapter.Fill(dataSet);}

Page 29: 2014 03-15 業務アプリinsider ソフトウェア方面の先進テクノロジー

他の選択肢は?有償製品になるが、 dotConnect がある。実は Npgsql より歴史が長く、 Entity Framework のサポートやLINQ プロバイダ、 Session State Store 、 Membershipプロバイダなどもサポートしており、 Npgsql と比較して高機能。

• どちらを選ぶか費用と必要とする機能を天秤に掛けて選択。弊社では既に分厚くラップしているので今はどちらでも大した違いはないが、今から作るなら dotConnect を選びたい

C# からの PostgreSQL 活用

Page 30: 2014 03-15 業務アプリinsider ソフトウェア方面の先進テクノロジー

困ることはまずない今は Entity Framework が使えないので初期コストが高くなるケースもある。が、運用していく為の周辺環境 ( ツールや情報 )は充実しているので埋め合わせは十分に可能。C# だから SQL Server 、ではなく、純粋に要件やエンジニアの保有スキルにあわせて DB を選択すべき。

C# からの PostgreSQL 活用

Page 31: 2014 03-15 業務アプリinsider ソフトウェア方面の先進テクノロジー

1. Sansan について2. Sansan の構成

1. Web フレームワーク2. DB(PostgreSQL)3. キャッシュ / セッション (Redis)4. インフラ

3. まとめ

アジェンダ

Page 32: 2014 03-15 業務アプリinsider ソフトウェア方面の先進テクノロジー

Redis おさらい• Memcached より少し豪華なインメモリ KVS• データ構造 (文字列、リスト、セット、ハッシュ )• 永続化、レプリケーション• Redis Cluster

• 将来的にはクラスタリングも可能 (度々延期してますが… )

• http://redis.shibu.jp/admin/cluster/• P2P型で、リバランスも自動

Redis

Page 33: 2014 03-15 業務アプリinsider ソフトウェア方面の先進テクノロジー

どこからでも使えるキャッシュ層としてクライアントライブラリには ServiceStack.Redis を利用。コネクションプーリングやジェネリックインタフェースなどを組み込みで持ち、気軽に利用可能で便利。

あれ? BookSleeve は?C#+Redis は BookSleeve では?

BuildInsider - C#のRedisライブラリ「BookSleeve」の利用法

なんで ServiceStack.Redis なの?

Redis の活用 – キャッシュ

Page 34: 2014 03-15 業務アプリinsider ソフトウェア方面の先進テクノロジー

複数抽象度から選べるインタフェース• RedisNativeClient• RedisClient• RedisTypedClient<T>

便利な機能が実装済コネクションプールやハッシング、 Pub/Sub や LUA スクリプトの実行も当然サポート。

安定更新が頻繁で利用者数も多く、安心して利用できる。

ServiceStack.Redis の特徴

Page 35: 2014 03-15 業務アプリinsider ソフトウェア方面の先進テクノロジー

• Sample

ServiceStack.Redis の特徴

var client = new RedisNativeClient("127.0.0.1", 6379);var value = client.LPop("list-key");

var client = new RedisClient("127.0.0.1", 6379);var value = client.As<Model>().GetItemFromList("list-key");

var manager = new PooledRedisClientManager("127.0.0.1:6379");var client = manager.GetClient();var value = client.Get<Model>("key");

Page 36: 2014 03-15 業務アプリinsider ソフトウェア方面の先進テクノロジー

いまひとつなインタフェースRedisClient型が持つ publicメソッドの数 => 437全ての Redis データ型を一クラスにまとめているためこんな事

に• client.GetItemFromList()• client.GetValueFromHash()

Redis データ型ごとに分けるとか出来そうだが…

メソッド名も初見では少し焦る。• client.Replace() => key があれば更新• client.Add() => key がなければ挿入

これらはそれぞれコマンドあるからしょうがないとも言えるがPush 、 Pop 、 Enqueue 、 Dequeue は絶許。

ServiceStack.Redis の特徴

Page 37: 2014 03-15 業務アプリinsider ソフトウェア方面の先進テクノロジー

シンプルなインタフェースと非同期基本的には Get/Set 。戻り値が特殊で Task<T> で返ってくる。プリミティブなインタフェースで、 byte[] か string くらいしか返せないので、そのままアプリケーションに組み込むよりはラップしてあげたほうが使いやすい。

詳細は以下を参照Build Insider - C#のRedisライブラリ「BookSleeve」の利用法

BookSleeve の特徴

Page 38: 2014 03-15 業務アプリinsider ソフトウェア方面の先進テクノロジー

どちらを使うべきか?パフォーマンス重視なら BookSleeve 、手軽なコストで使いたいなら ServiceStack.Redis 、というのも今は昔。ラップが面倒な BookSleeve も、今は CloudStructures(※) があるのであまり悩むこともなくなった。※ https://github.com/neuecc/CloudStructures

なぜ ServiceStack.Redis か?一番の理由は開発コスト。導入当時はラッパーがなかった。また、当時は C#4 を利用しており、非同期の扱いが手間で、慣れない非同期を組み込むリスクも踏まえた上での判断。Npgsql での反省も踏まえ更新頻度や実績 ( 利用者数 ) も参考に。

ServiceStack.Redis or BookSleeve

Page 39: 2014 03-15 業務アプリinsider ソフトウェア方面の先進テクノロジー

シリアライズ / デシリアライズGoogle謹製 protocol buffers の .NET 実装、 protobuf-net 。軽量かつ高速、 Google での利用実績もあって即決。同類に MessagePack for CLI があったが、当時はprotobuf-net と比較するとパフォーマンス、実績の点で欠けた( ただし利便性は MessagePack の方が良かった )

Redis の活用 - キャッシュ

Page 40: 2014 03-15 業務アプリinsider ソフトウェア方面の先進テクノロジー

セッションストアとして利用カスタムセッションストアプロバイダは AL-Redis(※) を利用。プロバイダは MSDN を見れば誰でも実装できるが全然速度が出ないので注意 (倍違う ) 。※ https://github.com/angieslist/AL-Redis

他の選択肢探せばいくつか出てくるが、排他制御にバグがあって高負荷時に安定して動いてくれないので、 Redis を使うなら AL-Redis がおすすめ。

Redis の活用 - セッション

Page 41: 2014 03-15 業務アプリinsider ソフトウェア方面の先進テクノロジー

1. Sansan について2. Sansan の構成

1. Web フレームワーク2. DB(PostgreSQL)3. キャッシュ / セッション (Redis)4. インフラ

3. まとめ

アジェンダ

Page 42: 2014 03-15 業務アプリinsider ソフトウェア方面の先進テクノロジー

1. Sansan について2. Sansan の構成

1. Web フレームワーク2. DB(PostgreSQL)3. キャッシュ / セッション (Redis)4. インフラ

3. まとめ

アジェンダ

Page 43: 2014 03-15 業務アプリinsider ソフトウェア方面の先進テクノロジー

たとえばRDB : Oracle / PostgreSQL / MySQLNoSQL : Memcached / Redis / MongoDB / RavenDBWeb Framework : Nancy / ServiceStackDI : Unity / Ninjectテスト : NUnit / NSpec / SpecFlowロギング : log4net / NLog

さらに選択肢を増やすBuild Insider - 社内の開発環境の改善&効率化のためにNuGet

を活用しようそれぞれが作った、ちょっとしたツールやコードを社内用 NuGet リポジトリに、公開しましょう

.NET でも選択肢の数は変わらない

Page 44: 2014 03-15 業務アプリinsider ソフトウェア方面の先進テクノロジー

実績には注意GitHub なら Watch や Star 、 Issues などを確認する。NuGet なら Downloads なども参考になる。それらを踏まえて、リスクもきちんと評価した上での採用を。

バグは、あるテストは十分に。できればソースコードも読む。利用する箇所だけだったり、軽く流し読みするだけでも安心感は違う。

ご利用は計画的に

Page 45: 2014 03-15 業務アプリinsider ソフトウェア方面の先進テクノロジー

Sansan について弊社事例が、皆様の会社での

OSS 導入の一助になれば幸いです

Page 46: 2014 03-15 業務アプリinsider ソフトウェア方面の先進テクノロジー

• 仲間を募集しています• http://www.sansan.com/recruit/engineer/

最後に

Page 47: 2014 03-15 業務アプリinsider ソフトウェア方面の先進テクノロジー

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