39
Laravel meet NewSQL Laravel Meetup Tokyo Vol.5 Yuuki Takezawa / 竹澤 有貴

Laravel meetup5(Laravel meet NewSQL/VoltDB )

Embed Size (px)

DESCRIPTION

Laravel&VoltDB 最新鋭phpフレームワークLaravelと新たなデータベース代表VoltDBを扱う発表内容です

Citation preview

Page 1: Laravel meetup5(Laravel meet NewSQL/VoltDB )

Laravel meet NewSQLLaravel Meetup Tokyo Vol.5 Yuuki Takezawa / 竹澤 有貴

Page 2: Laravel meetup5(Laravel meet NewSQL/VoltDB )

Profile• php, node.js,javascript, DB(RDBMS, NoSQL)

• GitHub : ytake (https://github.com/ytake)

• facebook (https://www.facebook.com/yuuki.takezawa)

• qiita : ytake (http://qiita.com/ytake)

• twitter : ytake (https://twitter.com/ex_takezawa)

• ごく稀に答えるマン

Page 3: Laravel meetup5(Laravel meet NewSQL/VoltDB )

よく使ってるもの

Page 4: Laravel meetup5(Laravel meet NewSQL/VoltDB )

そしてNewSQL

Page 5: Laravel meetup5(Laravel meet NewSQL/VoltDB )

NewSQLの紹介も混ぜつつ Laravelの拡張は簡単だよ!

っていう話です

Page 6: Laravel meetup5(Laravel meet NewSQL/VoltDB )

–RDBMS

膨大なデータに対応するのがしんどい トランザクション最強

Page 7: Laravel meetup5(Laravel meet NewSQL/VoltDB )

–NoSQL

膨大なデータと速度なら任せて!  SQL、トランザクションなにそれ

Page 8: Laravel meetup5(Laravel meet NewSQL/VoltDB )

–NewSQL

膨大なデータと速度とトランザクション  フルスタックエンジニア

Page 9: Laravel meetup5(Laravel meet NewSQL/VoltDB )

phper的に使いやすいのは VoltDB, NuoDB

(たぶん)

Page 10: Laravel meetup5(Laravel meet NewSQL/VoltDB )

今回とりあげるのは

Page 11: Laravel meetup5(Laravel meet NewSQL/VoltDB )

VoltDB• Michael Stonebraker design

• インメモリデータベース

• ACIDに準拠した関係データベースシステム

• JavaストアドプロシージャからのSQLアクセスをサポート(@AdHocクエリーあり)

• スケーラビリティ、信頼性、高可用性、高スループット

• 国内だとさくらインターネットのDDoS攻撃監視で導入されてます

• json APIもち

• yahoo(USA)広告配信サーバでフル活用されてるらしい

Page 12: Laravel meetup5(Laravel meet NewSQL/VoltDB )

なぜNewSQLなのか

Page 13: Laravel meetup5(Laravel meet NewSQL/VoltDB )

近い将来、国内でも 様々なアプリケーションが誕生し、

NoSQLとRDBMS併用も厳しくなってくる (かもしれない)

Page 14: Laravel meetup5(Laravel meet NewSQL/VoltDB )

SQL文が使用できる、 という事は

導入するのも比較的簡単なはず NoSQLより使える人が多いはず

Page 15: Laravel meetup5(Laravel meet NewSQL/VoltDB )

分散で威力発揮

Page 16: Laravel meetup5(Laravel meet NewSQL/VoltDB )
Page 17: Laravel meetup5(Laravel meet NewSQL/VoltDB )

シングルノードで 53,000 トランザクション/秒 (transactions per second / TPS)

の処理能力を持つ。 同一のハードウェア上での他の DBMS の処理能

力は 1,155 TPS である。 スケーラビリティはほぼ線形であり,12 ノードからなるクラスタで上記処理を実行した場合の処

理能力は 560,000 TPS であった。

Page 18: Laravel meetup5(Laravel meet NewSQL/VoltDB )

VoltDB createTableCREATE TABLE users ( user_id INTEGER UNIQUE NOT NULL, username VARCHAR(40) NOT NULL, password VARCHAR(64) NOT NULL, remember_token VARCHAR(128) DEFAULT NULL, created_at TIMESTAMP NOT NULL, PRIMARY KEY(user_id)); CREATE INDEX UsersIndex ON users (username, password, remember_token);

見慣れたSQL文

Page 19: Laravel meetup5(Laravel meet NewSQL/VoltDB )

VoltDB stored ProcedureCREATE PROCEDURE Auth_rememberToken AS SELECT * FROM users WHERE user_id = ?

AND remember_token = ?;PARTITION PROCEDURE Auth_rememberToken ON

TABLE users COLUMN user_id;

!

CREATE PROCEDURE Auth_updateToken AS UPDATE users SET remember_token = ?

WHERE user_id = ?;PARTITION PROCEDURE Auth_updateToken ON

TABLE users COLUMN user_id PARAMETER 1;

Page 20: Laravel meetup5(Laravel meet NewSQL/VoltDB )

VoltDB java実装public class Gets extends VoltCacheProcBase{ private final SQLStmt select = new SQLStmt(

"SELECT Key, Flags, Value, CASVersion, Expires FROM cache WHERE Key = ? AND Expires > ? AND CASVersion > -1;"); public VoltTable[] run(String[] keys) { final int now = baseInit(keys); voltExecuteSQL();

for(String key : keys) voltQueueSQL(select, key, now); return voltExecuteSQL(true); }}

Page 21: Laravel meetup5(Laravel meet NewSQL/VoltDB )

NewSQLとLaravelでナウい?

Page 22: Laravel meetup5(Laravel meet NewSQL/VoltDB )
Page 23: Laravel meetup5(Laravel meet NewSQL/VoltDB )

VoltDB providers for Laravel https://github.com/ytake/Laravel.VoltDB

Page 24: Laravel meetup5(Laravel meet NewSQL/VoltDB )

Laravelを拡張する• フレームワークをカスタマイズするのは当たり前

• 気に食わない所のカスタマイズのしやすさ

• Managerクラスをいじりまくれ!

• コンテナをいじりまくれ!

• extend

Page 25: Laravel meetup5(Laravel meet NewSQL/VoltDB )

voltdb-phpクライアントを ビルドするところから始まる

Page 26: Laravel meetup5(Laravel meet NewSQL/VoltDB )

PDOでサポートされていないので QueryBuilder, Eloquent実装はパス

(ストアドプロシージャ利用が主なので需要無いはず) voltdbのjavaクラスがjdbc使っていて、

phpで実装する意味があまり無い

Page 27: Laravel meetup5(Laravel meet NewSQL/VoltDB )

とりあえずDB拡張$this->app[‘db’]->extend(‘voltdb', function($config) { // return new Client(

new \Ytake\VoltDB\Client(

new VoltClient, new Parse

), $config);});

Page 28: Laravel meetup5(Laravel meet NewSQL/VoltDB )

DB実装ストアドプロシージャ、@AdHocクエリーを

サポートする様に実装

$sql = "SELECT * FROM users";

\DB::connection(‘voltdb')->select($sql);

ほぼそのままで使える様にしよう!

Page 29: Laravel meetup5(Laravel meet NewSQL/VoltDB )

JSON API実装$this->client->request('http://localhost')->post([ 'Procedure' => 'addUser', 'Parameters' => [1, "voltdb"] ])->getResult();

折角なので、JSON APIは Facadeにしよう!

Page 30: Laravel meetup5(Laravel meet NewSQL/VoltDB )

JSON API Facade$this->app->bindShared('voltdb-api', function($app) { return new HttpClient($app['config'], new Parse); });

class VoltDBFacade extends Facade{ protected static function getFacadeAccessor() { return 'voltdb-api'; }} !

Page 31: Laravel meetup5(Laravel meet NewSQL/VoltDB )

JSON API Facadeあとはaliasにカッコいい名前で登録するだけ!

'VoltDBApi' => 'Ytake\LaravelVoltDB\VoltDBFacade',

\VoltDBApi::request()->post([ 'Procedure' => 'addUser', 'Parameters' => [1, "voltdb"] ])->getResult();

cool!

Page 32: Laravel meetup5(Laravel meet NewSQL/VoltDB )

Facade

名前はなんでもいいです

abcdefgHogeFugaPiyo::request()

Page 33: Laravel meetup5(Laravel meet NewSQL/VoltDB )

Authも拡張$this->app['auth']->extend('voltdb', function($app) { // $default = $app['config']->get('laravel-voltdb::default.auth.database', $this->default); return new \Illuminate\Auth\Guard( new VoltDBUserProvider( $app['db']->connection($default), $app['hash'], $app['config'] ), $app['session.store'] );});

Page 34: Laravel meetup5(Laravel meet NewSQL/VoltDB )

Auth実装をVoltDB向けにpublic function retrieveByCredentials(array $credentials) { $sql = "SELECT * FROM {$this->table} WHERE "; $query = $this->buildQuery($credentials); $user = $this->connection->selectOne($sql . implode(" AND ", $query)); if (!is_null($user)) { return new VoltDBUser((array) $user, $this->config); }}

Auth::attempt([]);

Page 35: Laravel meetup5(Laravel meet NewSQL/VoltDB )

コマンド実装

Artisanコマンドは Artisan::add以外にも ServiceProviderで

追加する事も可

Page 36: Laravel meetup5(Laravel meet NewSQL/VoltDB )

コマンド実装$this->app['command.voltdb.info'] = $this->app->share(function($app) { return new \Ytake\LaravelVoltDB\Console\InformationCommand;});$this->commands('command.voltdb.info');

$ php artisan ytake:voltdb-info

Page 37: Laravel meetup5(Laravel meet NewSQL/VoltDB )

_ __ ____ ____ ____| | / /___ / / /_/ __ \/ __ )| | / / __ \/ / __/ / / / __ || |/ / /_/ / / /_/ /_/ / /_/ /|___/\____/_/\__/_____/_____/

Page 38: Laravel meetup5(Laravel meet NewSQL/VoltDB )

拡張しまくって、 Laravelをいじり倒そう!

Page 39: Laravel meetup5(Laravel meet NewSQL/VoltDB )

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