@ 仕事 個人活動 https://www.facebook.com/neuecc

Similar documents
Microsoft認定資格問題集(70-483_demo)

MVP for VB が語る C# 入門

Microsoft PowerPoint ppt

スピーカースライド作成前の確認シート例

スライド 1

Exam : 1z1-809-JPN Title : Java SE 8 Programmer II Vendor : Oracle Version : DEMO Get Latest & Valid 1z1-809-JPN Exam's Question and Answers 1 from Ac

PowerPoint Presentation

PowerPoint プレゼンテーション

PowerPoint Presentation

クエリの作成が楽になるUDF


Microsoft Word - Android_SQLite講座_画面800×1280

PowePoint Free Design Template

データセンターの効率的な資源活用のためのデータ収集・照会システムの設計

WPF アプリケーションの 多言語切替

// このクラスの有効期間中の各呼び出しに使用される キャッシュされた Socket オブジェクト Socket socket = null; // 非同期処理が完了したことを通知するために信号を送るオブジェクト static ManualResetEvent clientdone = new Ma

Javaセキュアコーディングセミナー2013東京第1回 演習の解説

とても使いやすい Boost の serialization

PowerPoint プレゼンテーション

PHP 開発ツール Zend Studio PHP アフ リケーションサーハ ー Zend Server OSC Tokyo/Spring /02/28 株式会社イグアスソリューション事業部

HTTP 404 への対処

IT / KPI IT WF(XOML),BPEL WSDL XSD IT XSD WSDL BPEL XOML XML

Seasar.NET入門

AWSSummitTokyo2018

新バージョン! Zabbix 2.2 と検証結果のご紹介 SRA OSS, Inc. 日本支社山本博之 Copyright 2013 SRA OSS, Inc. Japan All rights reserved. 1

Oracle Lite Tutorial

About me! 足立昌彦 / +Masahiko.Adachi )! バイドゥ株式会社技術顧問 (Simeji)! 株式会社カブク Co-Founder! Google Developer Expert (Android)

tkk0408nari

intra-mart Accel Platform — IM-BloomMaker プログラミングガイド   初版  

XML Consortium 2009/5/8 XML Consortium Enterprise2.0 アプリを支えるクラウド基盤としての Windows Azure XML コンソーシアム Web 2.0 部会 日立ソフト宮崎昭世 Microsoft MVP for Development Pl

AWS Deck Template

VB.NETコーディング標準

Server and Cloud Platform template

1_cover

Microsoft PowerPoint pptx

メール全文検索アプリケーション Sylph-Searcher のご紹介 SRA OSS, Inc. 日本支社技術部チーフエンジニア Sylpheed 開発者 山本博之 Copyright 2007 SRA OSS, Inc. Japan All right

1.SqlCtl クラスリファレンス SqlCtl クラスのリファレンスを以下に示します メソッドの実行中にエラーが発生した場合は標準エラー出力にメッセージを出力します (1)Connect() メソッド データベースへ connect 要求を行います boolean Connect(String

…l…b…g…‘†[…N…v…“…O…›…~…fi…OfiÁŸ_

目次 はじめに 4 概要 4 背景 4 対象 5 スケジュール 5 目標点 6 使用機材 6 第 1 章 C# 言語 7 C# 言語の歴史 7 基本構文 8 C 言語との違い 9 Java 言語との違い 10.Netフレームワーク 10 開発資料 10 第 2 章 Mono 11 Monoの歴史 1

JAVA とテンプレート

honbun.indd

IronPython による柔軟なゲーム開発 筑波大学 AmusementCreators

d_appendixB-asp10appdev.indd

FileMaker Cloud App FileMaker Pro FileMaker Go FileMaker WebDirect App FileMaker Cloud Amazon Web Services (AWS) Marketplace AWS FileMaker Server File

DB2 をバックエンドとした Delphi での Web サービスの構築 Marco Cantu ( 年 12 月 05 日 DB2 をバックエンドとした Delphi での Web サービスの構築 はじめに Borland TM 社の Delphi

.NET Framework 4.0 世代の Expression Trees

10年オンプレで運用したmixiをAWSに移行した10の理由

PowerPoint Presentation

Dolteng Scaffoldに対する機能追加とマスタ-ディテールScaffoldの紹介

untitled

目次 1. 本書の役割 Windows Agent サポート OS とエディション サポート言語 Agent 稼働前提条件 Azure SDK リリース済み Windows Agent のサポート

スライド 1

スライド 1

~ アドレス収集くん ~ セキュリティ対策御説明資料

Microsoft PowerPoint - ●SWIM_ _INET掲載用.pptx

PowerPoint Presentation

システム操作インターフェイス最適化によるテスト自動化ROI向上

S2BaseとZend Framework

Oracle Database 12c

デモで理解する Facebook アプリ開発のポイント シグマコンサルティング ( 株 ) 菅原英治

Visual Studio ( )



Oracle SQL Developerの移行機能を使用したOracle Databaseへの移行

雲の中のWebアプリケーション監視術!~いまなら間に合うクラウド時代の性能監視入門~

Sequel のすすめ 私が SQL を嫌いな理由 とみたまさひろ RubyHiroba Sequel のすすめ - 私が SQL を嫌いな理由 Powered by Rabbit 2.0.7

WPF アプリケーションの 多言語切替

PowerPoint プレゼンテーション


Windowsユーザーの為のOracle Database セキュリティ入門

PowerPoint プレゼンテーション

V8.1新規機能紹介記事

CashDrawer ライブラリ API 仕様書 2014/07/09 CashDrawer ライブラリ API 仕様書 Rev / 10

Visual Studio 2012 と ASP.NET に見る、最新 Web 開発の魅力

Visual Basic Oracle Database 11 Release 1

内容 Visual Studio サーバーエクスプローラで学ぶ SQL とデータベース操作... 1 サーバーエクスプローラ... 4 データ接続... 4 データベース操作のサブメニューコンテキスト... 5 データベースのプロパティ... 6 SQL Server... 6 Microsoft

Oracle Lite Tutorial

JAVA H13 OISA JAVA 1

WCF と IIS を使用して OData プロデューサーを作成する

スライド 0

Microsoft PowerPoint - prog03.ppt

mySQLの利用

Exam : 1z0-882 日本語 (JPN) Title : Oracle Certified Professional, MySQL 5.6 Developer Vendor : Oracle Version : DEMO 1 / 4 Get Latest & Valid 1z0-882-JP

プロセス間通信

C#の基本

10-C.._241_266_.Z

untitled

WEBシステムのセキュリティ技術

CAC


スライド 1

MS SQL の Point-in-Time リストア A - - v6.5 Update4 以降サポート Active Directory 詳細レベルリストア A A A v5 Update2 以降サポート 小さいパーティションへのBMR A A A v5 Update2 以降サポート リモートレ

Case 0 sqlcmdi.parameters("?tencode").value = Iidata(0) sqlcmdi.parameters("?tenname").value = Iidata(1) 内容を追加します sqlcmdi.executenonquery() Case Else

PowerPoint Presentation

日本 PostgreSQL ユーザ会第 28 回しくみ + アプリケーション勉強会 Zabbix を使って PostgreSQL を監視してみよう 2014 年 2 月 1 日 TIS 株式会社中西剛紀 (Yoshinori Nakanishi)

クラウド時代のインフラ構成/変更管理とコンプライアンス管理

JavaプログラミングⅠ

MVC4 Mobile Classic

2017/8/2 HP SiteScope software 監視機能対応表 この監視機能対応表は HP SiteScope software v11.33) に対応しています モニタ モニタ説明 モニタ説明 SiteScope for Windows SiteScope for Linux ネット

MISAO with WPF

Transcription:

@ 仕事 http://grani.jp/ C# @ 個人活動 http://neue.cc/ @neuecc https://www.facebook.com/neuecc

神獄のヴァルハラゲート モンスタハンターロアオブカード

AWS+C# によるウェブソーシャルゲーム 汎用的

その他 30% C# 50% AWS 20%

using

何故C# リリース後わずか半年でC#に全面移行

C# Everywhere Windows WinForms, WPF Mac Xamarin.Mac Windows Tablet Windows Store Application Web Application ASP.NET MVC/WebAPI, OWIN Cloud Microsoft Azure, AWS Game Unity, PlayStation Mobile SDK Mobile Xamarin.iOS Xamarin.Android Windows Phone 8 SDK Embedded Windows Embedded.NET Micro Framework NUI Kinect, LeapMotion

C# Everywhere - Current Windows WinForms, WPF Mac Xamarin.Mac Windows Tablet Windows Store Application Web Application ASP.NET MVC/WebAPI, OWIN Cloud Microsoft Azure, AWS Game Unity, PlayStation Mobile SDK Mobile Xamarin.iOS Xamarin.Android Windows Phone 8 SDK Embedded Windows Embedded.NET Micro Framework NUI Kinect, LeapMotion

C# Everywhere - Future Windows WinForms, WPF Mac Xamarin.Mac Windows Tablet Windows Store Application Web Application ASP.NET MVC/WebAPI, OWIN Cloud Microsoft Azure, AWS Game Unity, PlayStation Mobile SDK Mobile Xamarin.iOS Xamarin.Android Windows Phone 8 SDK Embedded Windows Embedded.NET Micro Framework NUI Kinect, LeapMotion

on AWS

現在の規模感 100 アプリケーションサーバー 10,000 リクエスト / 秒 100,000,000 ページビュー / 日 問題ない C# によるウェブソーシャルゲーム開発

IIS8 (EC2 Windows Server 2012) MySQL 5.6(RDS) Redis(EC2 Amazon Linux)

Database

NoSQL でいい? RDBMS の利点

RDS こそ AWS を使う最大の理由! SQL Server vs MySQL AWS + C# の企業としては RDS としての良さのほうを選ぶ

r3.8xlarge ったら最強ね!

機能単位の垂直分割を採用 水平分割は避ける

機能単位の垂直分割を採用 ヴァルハラゲートレベルの負荷でも 垂直分割で 耐えられているので(r3.8xlargeは素晴らしい) ほ とんどのアプリケーションは 大きなデメリット を抱える水平分割する必要性はないのでは 水平分割は避ける

DB 管理は GUI ツールを使いたい 水平分割はツールと相性最悪

アプリケーションからはMasterのみ参照 同一AvailabilityZoneへ配置する

public interface ITypedConnection : IDisposable { DbConnection Slave { get; } DbConnection Master { get; } } public BattleEntity SelectById(BattleConnection battle, int id) { return battle.master.query<battleentity>("select * from battle where id = @id", new { id }); } public UserEntity SelectById(UserInfoConnection user, int id) { return user.master.query<userentity>("select * from user where id = @id", new { id }); } コーディング時のミス防止 ( 間違った接続の利用はコンパイル時に弾かれる ) テーブルの別 DB への分割時にも完全にコンパイルチェックが効くので安全に行える C#( というか型付き言語 ) を使う利点

クエリは生 SQL を手書き Dapper https://code.google.com/p/dapper-dot-net/ connection.query<dog>("select * from dogs where id = @id", new { id = 100 }) http://neue.cc/2013/08/06_423.html

テーブルと 1:1 で関連づいたクラス T4 テンプレート + ADO.NET GetSchema

[Serializable] [DataContract] public class GuideTemplateMaster { [DataMember(Order = 1)] public GuideCode GuideId { get; private set; } [DataMember(Order = 2)] public Int32 No { get; private set; } [DataMember(Order = 3)] public String Title { get; private set; } [DataMember(Order = 4)] public String Body { get; private set; } [DataMember(Order = 5)] public String LinkController { get; private set; } [DataMember(Order = 6)] public String LinkAction { get; private set; } [DataMember(Order = 7)] public Int32 Priority { get; private set; } [DataMember(Order = 8)] public NavicoCharacter NaviId { get; private set; } [DataMember(Order = 9)] public NavicoFaceType NaviPattern { get; private set; } Int Enum への変換などは生成後 手で修正している 半自動生成 初回の雛形作成 というぐらいの位置づけ public override string ToString() { return "" + "GuideId : " + GuideId + " " + "No : " + No + " " + "Title : " + Title + " " + "Body : " + Body + " " + "LinkController : " + LinkController + " " + "LinkAction : " + LinkAction + " " + "Priority : " + Priority + " " + "NaviId : " + NaviId + " "

永久に保存する領域 データベースなど期間保存 Memcached/RedisなどExpire 付きアプリケーション単位 Static 変数リクエスト単位 - HttpContext.Items

永久に保存する領域 データベースなど期間保存 Memcached/RedisなどExpire 付きアプリケーション単位 Static 変数リクエスト単位 - HttpContext.Items

アイテム名など不変の情報はキャッシュ キャッシュ用コードもインデックス見て使い方が判別できるものも テーブル定義と一緒に自動生成してしまう ( マスタじゃない普通のテーブルに関しても インデックスを見てデータベースアクセサの雛形は自動生成してます ) public static class GuideTemplateMasterCache { public static readonly ReadOnlyCollection<GuideTemplateMaster> All; public static readonly ReadOnlyDictionary<Tuple<GuideCode, Int32>, GuideTemplateMas public static readonly ILookup<GuideCode, GuideTemplateMaster> ByGuideCode; } static GuideTemplateMasterCache() { using (var connection = new GeneralConnection()) { All = connection.master.queryenumerable<guidetemplatemaster>( "select * from GuideTemplateMaster").ToList().AsReadOnly(); } ByGuideIdAndNo = All.ToDictionary(x => Tuple.Create(x.GuideId, x.no)).asreadonl ByGuideCode = All.ToLookup(x => x.guideid); }

結合はアプリケーション側で LINQ to Objects で簡単

Redis

インメモリ Key-Value ストア RDS の不得意な部分を補える

用途毎のグループ分けと単純分散 定時 (21:00~21:30, 22:00~22:30 など ) 開催のバトルの時だけ忙しいがそれ以外はほぼ 0 という極端なグラフになる Battle グループ など

Slave vs ElastiCache Redis

Protocol Buffers Speed?

Performance + Async

Time To First Byte

言語構文レベルでサポートされる非同期 var names = Members.Select(x => new { Name = x.getname() }).ToArray(); Members が 10 人だとして GetName が 2ms かかると 同期だと 10 * 2 = 20ms var names = await Members.Select(async x => new { Name = await x.getnameasync() }).WhenAll(); 非同期で一気に同時に取得すれば 2ms で済む

// 例えば memcached の場合 var memcached = new MemcachedClient(); // 3 回アクセスがあって辛ぽよ var a = memcached.get("hoge"); // +10ms = 10ms var b = memcached.get("hage"); // +10ms = 20ms var c = memcached.get("huga"); // +10ms = 30ms // 1 度に問い合わせて 分配 var all = memcached.get(new[] { "hoge", "hage", "huga" }); // +10ms var a2 = all["hoge"]; var b2 = all["hage"]; var c2 = all["huga"]; 別に非同期構文とかなくてもできるじゃん!?

// 例えば memcached の場合 var memcached = new MemcachedClient(); // 3 回アクセスがあって辛ぽよ var a = memcached.get("hoge"); // +10ms = 10ms var b = memcached.get("hage"); // +10ms = 20ms var c = memcached.get("huga"); // +10ms = 30ms // 1 度に問い合わせて 分配 var all = memcached.get(new[] { "hoge", "hage", "huga" }); // +10ms var a2 = all["hoge"]; var b2 = all["hage"]; var c2 = all["huga"]; でも Incr とか Get 以外のコマンドは? それに こうしたコードってオブジェクトモデルでまとめにくい! 性能優先 vs 設計優先の対立になるの?

全コマンドがパイプライン化可能 Client-Server 間で 4 回の応答待ちが発生 パイプラインで呼ぶと 全部まとまってコマンド飛ばせるので往復遅延時間が削減

全てが非同期で自動でパイプライン化される var a = redis.tryget("hoge"); // Task なのでひどぅーき var b = redis.tryget("huga"); var c = redis.tryget("hage"); await Task.WhenAll(a, b, c); // 10ms

var fronthps = await field.ownguild.members.where(x => x.position == Position.Front).Select(async x => new { Name = await x.name, CurrentHP = (await x.userstatus).currenthp }).WhenAll(); x.name や x.userstatus は Redis への通信 こうして書いたコードは 自動的にパイプライン化されて非同期実行されている LINQ と相性良い IntelliSensable 超大事そうした LINQable のための設計と性能が両立できる // 自分の実行可能 (TP 不足じゃないとか ) なアビリティを ActionType でグループ分け var abilities = (await field.ownstatus.getcommandabilities()).where(x => x.canexecute == CanExecuteReason.CanExecute).GroupBy(x => x.actiontype);

Log for Performance

外部通信 (HTTP, SQL, Redis) を全て記録する アプリ側から行う利点 http://neue.cc/2013/07/30_420.html

public class HttpProfilingHandler : DelegatingHandler { static readonly Logger httplogger = NLog.LogManager.GetLogger("Http"); public HttpProfilingHandler() : base(new HttpClientHandler()) { } public HttpProfilingHandler(HttpMessageHandler innerhandler) : base(innerhandler){ } protected override async Task<HttpResponseMessage> SendAsync( HttpRequestMessage request, System.Threading.CancellationToken cancellationtoken) { // 通信の前後を Stopwatch で測る var sw = Stopwatch.StartNew(); var result = await base.sendasync(request, cancellationtoken).configureawait(false); sw.stop(); } // 以下に好きなようにログ仕込む 例えば JSON 化 httplogger.trace(applicationperformancelog.tojson( DateTime.Now, request.method.tostring(), request.requesturi.tostring(), sw.elapsedmilliseconds)); return result; HttpClient に対して DelegatingHandler を挟むことで処理の前後を簡単にフックできる new HttpClient(new HttpProfilingHandler());

public class LoggingDbProfiler : IDbProfiler { // 中略 MiniProfiler に用意されている IDbProfiler をカスタムして,ADO.NET のコネクションとして使うことで自由に仕込める var conn = new ProfiledDbConnection(new SqlConnection(), new LoggingDbProfiler()); } // コマンドが完了された時に呼ばれる public void ExecuteFinish(System.Data.IDbCommand pro ExecuteType executetype, S { commandtext = profileddbcommand.commandtext; if (executetype!= ExecuteType.Reader) { stopwatch.stop(); sqllogger.trace(newtonsoft.json.jsonconvert. { date = DateTime.Now, command = executetype, key = commandtext, ms = stopwatch.elapsedmilliseconds }, Newtonsoft.Json.Formatting.None)); } }

public class RedisProfiler : ICommandTracer { static readonly Logger redislogger = NLog.LogMan Stopwatch stopwatch; RedisSettings usedsettings; CloudStructures( 自社製の Redis ライブラリ ) に用意されてるプロファイラの口に通すことで 送った / 受け取ったオブジェクトなどがモニタできる } public void CommandStart(RedisSettings usedsetti { this.usedsettings = usedsettings; stopwatch = Stopwatch.StartNew(); } public void CommandFinish(object sentobject, obj { stopwatch.stop(); var ms = (long)system.math.round(stopwatch.e redislogger.trace(applicationperformancelog.tojsonwithhost(datetime.now, usedsettings.host, command, key, ms)); }

記録したら簡単に見れなければならない Glimpse http://getglimpse.com/

全体の実行時間のほか あらゆるメトリクスを 常時可視化 目に見えてRedis並列実行

開発環境上では 常に全SQL発行に 対して explain結果も出すように している 手動でやるようだと絶 対にやらないので 機械的に自動 でやって 常に見えるところに置 かなければならない 明らかにヤヴァそうなもの(Using filesortとか)は警告する これによ り 開発者が 開発中 に 自分 で気づけるように誘導

同一キーの重複時警告 送信 受信オブジェクトのダンプ オブジェクトサイズ Expire 残り時間 通信時間などの表示

Workflow

Git + GitHub(Business) Jenkins Deploy https://github.com/guitarrapc/valentia

Next Generation Log Management & Analytics ログをクエリ

最高のモニタリング SaaS 自社製プラグインで Performance Counter などの情報も集積 表示 SDK を叩いてアプリ側から Redis の利用具合を可視化

Analytics

アプリケーション分析のためのロギング Semantic Logging Application Block https://slab.codeplex.com/ Tableau

アプリケーション分析のためのロギング Semantic Logging Application Block https://slab.codeplex.com/ Tableau とかやってたら 東京リージョンに来た Kinesis がきになるぅぅぅ!

Conclusion

C# + AWS は現実解 構成は堅く シンプルに 環境は常に最新に