Laravel meetup5(Laravel meet NewSQL/VoltDB )
-
Upload
yuuki-takezawa -
Category
Technology
-
view
532 -
download
5
description
Transcript of Laravel meetup5(Laravel meet NewSQL/VoltDB )
Laravel meet NewSQLLaravel Meetup Tokyo Vol.5 Yuuki Takezawa / 竹澤 有貴
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)
• ごく稀に答えるマン
よく使ってるもの
そしてNewSQL
NewSQLの紹介も混ぜつつ Laravelの拡張は簡単だよ!
っていう話です
–RDBMS
膨大なデータに対応するのがしんどい トランザクション最強
–NoSQL
膨大なデータと速度なら任せて! SQL、トランザクションなにそれ
–NewSQL
膨大なデータと速度とトランザクション フルスタックエンジニア
phper的に使いやすいのは VoltDB, NuoDB
(たぶん)
今回とりあげるのは
VoltDB• Michael Stonebraker design
• インメモリデータベース
• ACIDに準拠した関係データベースシステム
• JavaストアドプロシージャからのSQLアクセスをサポート(@AdHocクエリーあり)
• スケーラビリティ、信頼性、高可用性、高スループット
• 国内だとさくらインターネットのDDoS攻撃監視で導入されてます
• json APIもち
• yahoo(USA)広告配信サーバでフル活用されてるらしい
なぜNewSQLなのか
近い将来、国内でも 様々なアプリケーションが誕生し、
NoSQLとRDBMS併用も厳しくなってくる (かもしれない)
SQL文が使用できる、 という事は
導入するのも比較的簡単なはず NoSQLより使える人が多いはず
分散で威力発揮
シングルノードで 53,000 トランザクション/秒 (transactions per second / TPS)
の処理能力を持つ。 同一のハードウェア上での他の DBMS の処理能
力は 1,155 TPS である。 スケーラビリティはほぼ線形であり,12 ノードからなるクラスタで上記処理を実行した場合の処
理能力は 560,000 TPS であった。
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文
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;
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); }}
NewSQLとLaravelでナウい?
VoltDB providers for Laravel https://github.com/ytake/Laravel.VoltDB
Laravelを拡張する• フレームワークをカスタマイズするのは当たり前
• 気に食わない所のカスタマイズのしやすさ
• Managerクラスをいじりまくれ!
• コンテナをいじりまくれ!
• extend
voltdb-phpクライアントを ビルドするところから始まる
PDOでサポートされていないので QueryBuilder, Eloquent実装はパス
(ストアドプロシージャ利用が主なので需要無いはず) voltdbのjavaクラスがjdbc使っていて、
phpで実装する意味があまり無い
とりあえずDB拡張$this->app[‘db’]->extend(‘voltdb', function($config) { // return new Client(
new \Ytake\VoltDB\Client(
new VoltClient, new Parse
), $config);});
DB実装ストアドプロシージャ、@AdHocクエリーを
サポートする様に実装
$sql = "SELECT * FROM users";
\DB::connection(‘voltdb')->select($sql);
ほぼそのままで使える様にしよう!
JSON API実装$this->client->request('http://localhost')->post([ 'Procedure' => 'addUser', 'Parameters' => [1, "voltdb"] ])->getResult();
折角なので、JSON APIは Facadeにしよう!
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'; }} !
JSON API Facadeあとはaliasにカッコいい名前で登録するだけ!
'VoltDBApi' => 'Ytake\LaravelVoltDB\VoltDBFacade',
\VoltDBApi::request()->post([ 'Procedure' => 'addUser', 'Parameters' => [1, "voltdb"] ])->getResult();
cool!
Facade
名前はなんでもいいです
abcdefgHogeFugaPiyo::request()
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'] );});
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([]);
コマンド実装
Artisanコマンドは Artisan::add以外にも ServiceProviderで
追加する事も可
コマンド実装$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
_ __ ____ ____ ____| | / /___ / / /_/ __ \/ __ )| | / / __ \/ / __/ / / / __ || |/ / /_/ / / /_/ /_/ / /_/ /|___/\____/_/\__/_____/_____/
拡張しまくって、 Laravelをいじり倒そう!
ご清聴ありがとうございました