• 検索結果がありません。

「DataSnapユースケース研究」 多層技術の概要と最適化、実践テクニック

N/A
N/A
Protected

Academic year: 2021

シェア "「DataSnapユースケース研究」 多層技術の概要と最適化、実践テクニック"

Copied!
20
0
0

読み込み中.... (全文を見る)

全文

(1)

エンバカデロ・テクノロジーズ

エヴァンジェリスト 高橋智宏

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

DataSnapユースケース研究」

多層技術の概要と最適化、実践テクニック

B4】Delphi/C++テクニカルセッション

(2)

アジェンダ

DataSnapの基礎

– プロトコル

– サーバーメソッド

• 現実的な構成例

DMZ + ロードバランス

– ライフサイクル

DB接続のレイヤ

– 親クラス

FireDAC

• デモ

– マルチデバイス対応

Tips

HTTPSを利用するには?

– バイナリデータの送受信

– サーバーメソッドの非同期呼び出しは?

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。 2

(3)

DataSnapの基礎

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

3

(4)

DataSnapとは?

4

2層のC/S

3層構造

GUIアプリ

RDBMS

GUIアプリ

DataSnapサーバ

RDBMS

ドライバ

DB

Dat

aS

nap

DataSnap プロトコル

DB

ドライバ

GUI, 業務ロジック

SQL文 etc…

業務ロジック

SQL文 etc…

GUI

TCP/IP

HTTP(s)

(5)

5

Copyright ©2009 Embarcadero Technologies, Inc. All Rights Reserved. 本文書の一部または全部の転載を禁止します。

検討事項

• 特にセキュリティ面と運用面

RDBMSの「ユーザー名」と「パスワード」の管理

– ネットワーク上、直接RDBMSに接続出来てしまう

dbExpress/dbGo/FireDACなどのDBコンポーネント

• コンポーネントのアップデート

全端末への再配布

RDBMSのネイティブクライアントライブラリ

• サポートされているプラットフォームは

??

• インストーラ

• モジュールのアップデート

全端末への再配布

– ビジネスロジックや

SQL文がクライアント側に存在

• アプリケーションのアップデート

全端末への再配布

– ファイアウォール

etc…

(6)

6

Copyright ©2009 Embarcadero Technologies, Inc. All Rights Reserved. 本文書の一部または全部の転載を禁止します。

DataSnapプロトコル

TCP/IP

– デフォルト211番ポート

SSL, IPv6 は未サポート

HTTP

– デフォルト80番ポート

HTTP

S

もサポート

RPC形式

– サーバーメソッド

• 要は、

RDBMSのストアドプロシージャと同じ扱い!!

• パラメータ & 戻り値

in, var, out, return

• 組み込みの非同期呼び出しは無い

– インスタンスのライフサイクル

Server, Session, Invocation

Callback, Filter, Event

データフォーマット

JSON(JavaScript Object Notation)

{"method":"connect","params":"drivername":"DATASNAP", "port":"211","communicationprotocol":"tcp/ip","hostna me":"127.0.0.1","DriverUnit":"DbxDatasnap",....]} {"method":"execute","params":[{"fields":[-1,false,"Dbx.MetaData","GetDatabase"]}]} {"method":"reader_close","params":[1,0]} {"method":"disconnect","params":[0]} {"result":[0,"DataSnap",2]} {"result":[{"rows":[0]},{"data":[1,`]},{"table":[{"fi elds":[0,false,1,0,true]},{"columns":[13,["QuoteChar" ,26,0,0,0,16,0,0],["ProcedureQuoteChar",26,0,0,0,16,0 ,0],["MaxCommands",6,0,0,0,0,0,0],["SupportsTransacti ons",4,0,0,0,0,0,0],["SupportsNestedTransactions",4,0 ,0,0,0,0,0],["SupportsRowSetSize",4,0,0,0,0,0,0]... ... ... クライアントからのリクエストのサンプル サーバーからのレスポンスのサンプル

(7)

7

Copyright ©2009 Embarcadero Technologies, Inc. All Rights Reserved. 本文書の一部または全部の転載を禁止します。

サーバーメソッドとは

?

• リモートプロシージャコール

(RPC)

http://ja.wikipedia.org/wiki/RPC

• サーバーメソッドの実装

& エクスポート

– 引数の型

– 戻り値

– 例外は?

– クライアント用プロキシは?

(8)

8

Copyright ©2009 Embarcadero Technologies, Inc. All Rights Reserved. 本文書の一部または全部の転載を禁止します。

サーバーメソッドで扱える型

基本型

AnsiString

Boolean

Byte

Currency

TDateTime

TDBXDate

TDBXTime

Double

Int64

Integer

LongInt

OleVariant

Single

ShortInt

SmallInt

String(UnicodeString)

WideString

TStream

DBXValue型

• TDBXAnsiStringValue

• TDBXAnsiCharsValue

• TDBXBcdValue

• TDBXBooleanValue

• TDBXDateValue

• TDBXDoubleValue

• TDBXUInt8Value

• TDBXInt8Value

• TDBXInt16Value

• TDBXInt32Value

• TDBXInt64Value

• TDBXJSonValue

• TDBXReaderValue

• TDBXSingleValue

• TDBXStringValue

• TDBXTimeStampValue

• TDBXTimeValue

• TDBXWideCharsValue

• TDBXWideStringValue

• TDBXStreamValue

JSON型

• TJSONArray

• TJSONNumber

• TJSONObject

• TJSONString

• TJSONValue

テーブル型

• TDataSet

• TParams

• TDBXReader

基本型

NULLサポート無し。

varや戻り値もOK

DBXValue型

NULLサポートあり。

varや戻り値はNG

テーブル型

varや戻り値もOK

配列型

(array of …)

サポートされません。

TJSONArrayを使う

(9)

現実的な構成例

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

9

(10)

システム構成例

10

• 複数のDataSnapサーバーをロードバランス

GUIアプリ

DataSnapサーバ

RDBMS

Dat

aS

nap

DataSnap プロトコル

Fir

eD

AC

ドライバ

業務ロジック

SQL文 etc…

GUI

HTTPS

リバースプロキシ

DMZ

HTTP

Apache Nginx ロードバランサ etc…

社内端末

DB管理者等

TCP/IP

(11)

ロードバランスすると

• サーバーメソッド用クラスのライフサイクルとの兼ね合い

Session (デフォルト)

• クライアントアプリケーションからの接続とインスタンスが結びつく

• ステートフル

– ステート(セッション情報)のリプリケーションは??

Invocation

• サーバーメソッドの呼び出しごとにインスタンスの生成&破棄を繰り返す

• ステートレス

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。 11

クライアント

DataSnapサーバ

RDBMS

リクエスト レスポンス 接続クエリー実行 切断 クラス インスタンスクラス インスタンスクラス インスタンスクラス インスタンスクラス インスタンス

ロードバランサ

(12)

DB接続のレイヤ

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

12

(13)

13

Copyright ©2009 Embarcadero Technologies, Inc. All Rights Reserved. 本文書の一部または全部の転載を禁止します。

サーバーメソッドクラスの構造

• 親クラス

TComponent, TDataModule, TDSServerModule

• データアクセス

IBExpress

dbExpress

dbGo(ADO)

FireDAC

etc…

• 親クラスを

TComponentで、データモジュールをプーリング?

• コネクションプーリング

– 独自実装

FireDAC

(14)

DBアクセスモジュールの設計

FireDACで使用する主なコンポーネント

TFDConnection

TFDTable / TFDQuery など

TFDPhys

IB

DriverLink など

TFDGUIxWaitCursor (Providerプロパティは

Console

)

• データモジュール

– データベースアクセスをカプセル化

– サーバーメソッドの処理とデータベース処理を分離

14 DataSnap クライアントアプリ

サーバー

メソッド群

DataSnap サーバープロセス

データ

モジュー

RDBMS

(15)

デモ

- 複数デバイス対応 -

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

(16)

サーバー

& クライアントの例

• サーバー

Delphi 64bit スタンドアロン

TCP/IP + HTTP

TComponent(親) + データモジュール

FireDAC

• クライアント

Delphi VCL

Delphi iOS

Delphi Android

C++Builder OS X

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。 16

(17)

Tips

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

(18)

HTTPSを利用するには?

リバースプロキシで

HTTPSを処理し、HTTPのDataSnapにリダイレクトする

http://blogs.embarcadero.com/teamj/2013/10/29/4096/

DataSnap単体でもOpenSSL(Indyで利用)を使用したHTTPS接続を受付可能

http://blogs.embarcadero.com/teamj/2013/10/30/4103/

Windows ServerのIISを利用する

ISAPI(DLL)モードでDataSnapサーバーを実装

IIS自体でHTTPSを処理する

クライアントは、プロトコルに

https

を指定するだけで

OK

GUIアプリ

DataSnapサーバ

Dat

aS

nap

DataSnap プロトコル

HTTPS

リバースプロキシ

HTTP

(19)

バイナリデータの送受信

TStreamを使う

– 高速

– もちろん、TJSONAarrayにByte配列を入れる方法もOKですが…

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。 19

function TTestServer.Download(…): TStream;

var

memStream: TBytesStream;

begin

Result := nil;

FileName := …;

if FileExists(FileName) then

begin

memStream := TBytesStream.Create;

memStream.LoadFromFile(FileName);

Result := memStream;

end;

end;

procedure TForm1.BtnClick(Sender: TObject);

var

stream: TStream;

b: Byte;

mem: TBytesStream;

begin

stream := TestSV.Download('xyz.jpg');

mem := TBytesStream.Create;

while stream.Read(b, 1) = 1 do

mem.Write(b, 1);

mem.Free;

end;

Server側

Client側

(20)

サーバーメソッドの非同期呼び出しは

?

VCL

(Windows)向けなら OmniThreadLibrary が便利

http://code.google.com/p/omnithreadlibrary/

– 最新版は 3.03a で、

Delphi 2007〜XE5 (32bit/64bit)をサポート

VCL以外

(FireMonkey, iOS, Android)は

TThreadの派生クラスとSynchronizeメソッドなどを組み合わせる

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

参照

関連したドキュメント

北区では、外国人人口の増加等を受けて、多文化共生社会の実現に向けた取組 みを体系化した「北区多文化共生指針」

事  業  名  所  管  事  業  概  要  日本文化交流事業  総務課   ※内容は「国際化担当の事業実績」参照 

郷土学検定 地域情報カード データーベース概要 NPO

法制執務支援システム(データベース)のコンテンツの充実 平成 13

保安業務に係る技術的能力を証する書面 (保安業務区分ごとの算定式及び結果) 1 保安業務資格者の数 (1)

と発話行為(バロール)の関係が,社会構造(システム)とその実践(行

区分 事業名 実施時期

機関室監視強化の技術開発,および⾼度なセ キュリティー技術を適用した陸上監視システム の開発を⾏う...