SlideShare una empresa de Scribd logo
1 de 42
Descargar para leer sin conexión
Tarantalk
Smalltalk と Lua と Tuple DBMS
第96回Smalltalk勉強会
合同会社ソフトウメヤ 梅澤真史
Tarantalkとは
● 永続化機能付きLuaとPharoがコラボできる
○ https://github.com/mumez/Tarantalk
● Qiitaの記事
■ 「SmalltalkからLuaをevalする」
■ 「TarantalkでSmalltalkからDBを操る」
Tarantool
● No SQLの注目株
○ ThoughtWorks Technology RadarのAssess段階
○ ロシア製。Mail.ruで使われている
■ Heavy workloads: our use cases of Tarantool
● Tupleの永続化をサポート
○ KVSよりも構造化
○ RDBよりは軽量
● Luaの実行エンジンであり、Luaで拡張できる
○ https://tarantool.org/rocks.html
■ queue, RDBとの接続など
"Get your data in RAM. Get compute close to data. Enjoy the performance."
Tarantoolのインストール
● Tarantoolの入手
○ https://tarantool.org/download.html
■ 様々なプラットフォームに対応
○ Macなら
Tarantoolの起動
● 適当なディレクトリ(taranとか)を作成、移動し
● 3 + 4
● クライアントの接続受付
ユーザの権限設定
● 接続用ユーザの登録
● アクセス権限の付与
Tarantalkのインストール
● Catalog Browserから
○ ’tarantool’で検索し、”install stable version”
● あるいはMetacelloでロード
Tarantalkの構成
● Tarantalk-Core
○ Tarantoolに対するConnector
■ Stickベースなので自動reconnectする
○ バイナリプロトコルの実装
■ MessagePackゆえ軽量
● Tarantalk-Objects
○ OO的なAPIを提供するラッパー群
■ TrTarantalk, TrSpace, TrIndexなど
接続の確認
● TrTarantalk>>connect:で接続
○ URLでユーザ名、パスワードを指定
● pingしてみる
● 非同期APIなのでブロックしない
○ TrRequestが即座に返ってくる
■ ifDone:ifError:などで後で結果を受け取る
接続の解放
● TrTarantalk>>releaseで切断
● TrTarantalk class >> releaseAll
○ 全ての接続を一度に解放
Hello, Tarantalk
● Luaの実行エンジンとして
○ evalWithReturn: で 3 + 4 を実行
○ 結果をifDone:ifFailed: で得る
さらに複雑なeval
こんにちは の世界へ
● モジュールをrequire
● 引数で値を渡す(evalWithReturn:arguments:)
● 結果を同期的に得る(valueThen:)
関数のcall (1)
関数 の登録
● Luaの関数を登録して呼び出し可能にする
関数のcall (2)
● 登録したLuaの関数をPharo側から呼び出せる
○ call: funcName
○ call: funcName arguments: args
● 起動時に読み込むscript.lua(後述)でよく使う関数を登録しておく
永続化のためのデータモデル
● Key-Valueや表ではない
○ SpaceとTuple
○ https://tarantool.org/doc/book/box/data_model.html
● Tupleの集合を格納する
● Spaceの中にTupleが入る
○ Tupleのフィールドに複数の検索Indexを定義できる
Spaceの作成
● TrTarantalk>>ensureSpaceNamed:で生成
○ すでに存在する場合は既存のspaceが返される
● TrTarantalk>>userSpacesでSpaceの一覧を得る
http://ws.stfx.eu/HROST5KMRK6A
Indexの作成
● Tupleの特定フィールド(群)に対して作成
○ プライマリインデックスは必須
○ インデックスの種類やフィールドの型をoptionsで指定できる
● インデックスの種類で検索の性質が変わる
○ TREE 順序付けされたキー
○ HASH キーの順序が不定、挿入が早い
○ BITSET コンパクト、キーに対するビット操作
○ RTREE 空間インデックス
Tupleの格納
本家サイト
のオンライン
書籍
本家サイト
ユーザ会
ユーザのためのハブサイト 勉強会も毎月やっています
● TrSpace>>insert:を使う
○ フィールドが増減しても良い
○ インデックスが張られたフィールドの型は合わせておく
Tupleの取得
本家サイト
● TrIndex>>select系のメソッド群がある
● selectHaving: keys
ユーザ会
ユーザ会 ユーザのためのハブサイト
勉強会も毎月やっています 本家サイト
● select: iteratorSymbol having: keys offset: offset limit: limit
○ #<, #<=, #>, #>=, #eq, #req, #bitsAnySet, #bitsAllSet, #overlaps, #neighbour
など、シンボルでキーの列挙の仕方を決められる
Tupleの更新
● TrIndex>>updateHaving: keys performing: updatingBlock
○ 更新するフィールドのインデックスを指定
○ フィールド値の代入はassign:
■ add:, subtract:, insert:, splice:from:to: なども
の本家です
● TrSpace>>replace: aTuple
○ 既存のタプルを置き換え、または挿入
Tupleの削除
● TrIndex>>deleteHaving: keys
○ キーで指定したタプルを削除
"=> "
"=>Space '512' does not exist"
● TrSpace>>truncate
○ Spaceを空にする
● TrSpace>>drop
○ Spaceごと削除
例: タグDB (1)
● プログラミング言語に付与されたタグを管理したいとする
プログラミング言語 タグ
Lua dynamic
Lua embeddable
Smalltalk dynamic
Smalltalk object-oriented
Smalltalk message-passing
Erlang dynamic
Erlang message-passing
...
例: タグDB (2)
● Spaceを用意
● プライマリIndexを用意
○ partsTypes:で両要素を指定することで重複したエントリーを排除
http://ws.stfx.eu/M5TS5QWD0L76
例: タグDB (3)
● セカンダリIndexを用意
○ タグからプログラミング言語を引けるようにする
○ タグは重複して良いのでisUnique: falseに
例: タグDB (4)
● データ投入
例: タグDB (5)
● Smalltalkに付与されたタグ一覧
○ selectHaving: でキーの一部を指定しているところがミソ
"=>
"
例: タグDB (6)
● 'dynamic'タグのついた言語一覧
○ セカンダリの方でselectHaving:
"=> "
● 集計もしてみる
○ countHaving:
"=> "
LuaRocksによる拡張
● Tarantool用リポジトリに各種パッケージがある
○ https://tarantool.org/rocks.html
■ http, mqtt, queue, コネクションプール、RDB接続、
expire指定、sharding、avro-schemaなど
● LuaRocksが必要
○ Luaのパッケージマネージャ
■ Luaのインストールと共に入る
○ Macなら
■ 5.1系が無難
LuaRocksの設定
● Tarantool用リポジトリの設定を追加
● luarocks install 'モジュール名'で新規モジュールをインストールできる
script.luaの記述
● Tarantool起動時に初期化用スクリプトを指定できる
○ モジュールをrequireしておく
○ 自分で拡張した関数なども記述しておく
● 例: httpクライアントモジュールを導入し、3301で起動
○ 対話コンソールも開いておく
tarantool script-http.lua
例: Webhookの追加 (1)
● タグDBにWebhookを追加する
○ タグの変更があったら、特定URLにpostして通知
○ Tarantoolのトリガー機能と、httpモジュールを使って実現
● space_obj:on_replace(triggeredFunction)で変更時に呼ばれる
関数を設定
○ script.luaに以下の記述を加えてテスト
例: Webhookの追加 (2)
● httpクライアントの利用
○ jsonモジュールと組み合わせ、JSONのpostを行うようにする
○ tags_changedの中で使うようにscript.luaを書き換え
例: Webhookの追加 (3)
● Pharo側にTeapotでWebhookのハンドラを作成して確認
○ Catalog Browserから Teapotを入れる
○ ワークスペースで以下を”do it”
● タグ更新の度にインスペクタが開く
例: メッセージキューの導入 (1)
● 永続化キューを介してタプルをやり取りする
○ TTL, TTR, Delay, 優先度, sub queuesなどを指定できる
■ https://github.com/tarantool/queue
○ Tubeと呼ばれるキューを作成
■ サプライヤー側がtubeにtaskをput
■ コンシューマ側がtubeからtaskをtake、終わったらack
● script.luaでqueueをrequire
例: メッセージキューの導入 (2)
● FIFOキューの利用例
● Tarantalkからevalで上記のAPIを利用
タスクの登録
タスクの消費
取得 秒でタイムアウト
タスクの で完了を知らせる
例: メッセージキューの導入 (3)
● script.luaでキューを用意しておく
● Tarantalkから'queue.tube.tags_tube'で参照し、APIをevalする
http://ws.stfx.eu/N2Q1UVW3V8ZF
例: メッセージキューの導入 (4)
● tagSpaceにタグを追加すると共に、キューにも追加
● 別イメージや別プロセスから、好きなタイミングでtaskを取り出しての
処理が可能に
例: メッセージキューの導入 (5)
● キューを監視してタスクを消費
タスクの取得
タスクの情報を使い、何らかの処理
  タスク完了を通知
http://ws.stfx.eu/PTCIIAPVBS6O
例: メッセージキューの導入 (6)
● タグランキング DBを別途作成し、同期してみる
タグ スコア
dynamic 30
cool 23
... ...
例: メッセージキューの導入 (5)
● タスクが取得できたらランキングの該当スコアを更新
スコアの加算
Tarantube
● Tarantubeで更に簡単に
の 作成
に を追加
定期的にタスクを取得して実行
まとめ
● TarantalkでSmalltalkとLuaはいい感じで連携できる
● Tuple DBは軽量で高速。インデックスの特徴を活かした検索
が可能
● LuaRocksの拡張モジュールも実用性高い
● メッセージキューについてはTarantubeが利用できる

Más contenido relacionado

La actualidad más candente

tcpdumpとtcpreplayとtcprewriteと他。
tcpdumpとtcpreplayとtcprewriteと他。tcpdumpとtcpreplayとtcprewriteと他。
tcpdumpとtcpreplayとtcprewriteと他。
(^-^) togakushi
 
Hokkaido.cap#10 実践パケット解析まとめ
Hokkaido.cap#10 実践パケット解析まとめHokkaido.cap#10 実践パケット解析まとめ
Hokkaido.cap#10 実践パケット解析まとめ
Panda Yamaki
 
Hokkaido.cap#5 ケーススタディ(ネットワークの遅延と戦う:後編)
Hokkaido.cap#5 ケーススタディ(ネットワークの遅延と戦う:後編)Hokkaido.cap#5 ケーススタディ(ネットワークの遅延と戦う:後編)
Hokkaido.cap#5 ケーススタディ(ネットワークの遅延と戦う:後編)
Panda Yamaki
 
Hokkaido.cap#8 ケーススタディ(セキュリティ解析:後編)
Hokkaido.cap#8 ケーススタディ(セキュリティ解析:後編)Hokkaido.cap#8 ケーススタディ(セキュリティ解析:後編)
Hokkaido.cap#8 ケーススタディ(セキュリティ解析:後編)
Panda Yamaki
 

La actualidad más candente (20)

CpawCTF 勉強会 Network
CpawCTF 勉強会 NetworkCpawCTF 勉強会 Network
CpawCTF 勉強会 Network
 
Hokkaido.cap#3 ケーススタディ(基礎編)
Hokkaido.cap#3 ケーススタディ(基礎編)Hokkaido.cap#3 ケーススタディ(基礎編)
Hokkaido.cap#3 ケーススタディ(基礎編)
 
tcpdumpとtcpreplayとtcprewriteと他。
tcpdumpとtcpreplayとtcprewriteと他。tcpdumpとtcpreplayとtcprewriteと他。
tcpdumpとtcpreplayとtcprewriteと他。
 
Hokkaido.cap#10 実践パケット解析まとめ
Hokkaido.cap#10 実践パケット解析まとめHokkaido.cap#10 実践パケット解析まとめ
Hokkaido.cap#10 実践パケット解析まとめ
 
IPv6アドレスでお絵かき
IPv6アドレスでお絵かきIPv6アドレスでお絵かき
IPv6アドレスでお絵かき
 
DPDKを用いたネットワークスタック,高性能通信基盤開発
DPDKを用いたネットワークスタック,高性能通信基盤開発DPDKを用いたネットワークスタック,高性能通信基盤開発
DPDKを用いたネットワークスタック,高性能通信基盤開発
 
Hokkaido.cap#5 ケーススタディ(ネットワークの遅延と戦う:後編)
Hokkaido.cap#5 ケーススタディ(ネットワークの遅延と戦う:後編)Hokkaido.cap#5 ケーススタディ(ネットワークの遅延と戦う:後編)
Hokkaido.cap#5 ケーススタディ(ネットワークの遅延と戦う:後編)
 
Hokkaido.cap #osc11do Wiresharkを使いこなそう!
Hokkaido.cap #osc11do Wiresharkを使いこなそう!Hokkaido.cap #osc11do Wiresharkを使いこなそう!
Hokkaido.cap #osc11do Wiresharkを使いこなそう!
 
import dpkt したよ #ssmjp 2014/02/28
import dpkt したよ #ssmjp 2014/02/28import dpkt したよ #ssmjp 2014/02/28
import dpkt したよ #ssmjp 2014/02/28
 
Varnishのログの眺め方
Varnishのログの眺め方Varnishのログの眺め方
Varnishのログの眺め方
 
10年ぶりの ニューラルネットワーク
10年ぶりの ニューラルネットワーク10年ぶりの ニューラルネットワーク
10年ぶりの ニューラルネットワーク
 
Iron Python / Iron Ruby で .NET Programming
Iron Python / Iron Ruby で .NET ProgrammingIron Python / Iron Ruby で .NET Programming
Iron Python / Iron Ruby で .NET Programming
 
Hokkaido.cap#8 ケーススタディ(セキュリティ解析:後編)
Hokkaido.cap#8 ケーススタディ(セキュリティ解析:後編)Hokkaido.cap#8 ケーススタディ(セキュリティ解析:後編)
Hokkaido.cap#8 ケーススタディ(セキュリティ解析:後編)
 
CTF for ビギナーズ ネットワーク講習資料
CTF for ビギナーズ ネットワーク講習資料CTF for ビギナーズ ネットワーク講習資料
CTF for ビギナーズ ネットワーク講習資料
 
tokyo.vcl発表資料(VarnishCache3.0新機能とVUPの仕方)
tokyo.vcl発表資料(VarnishCache3.0新機能とVUPの仕方)tokyo.vcl発表資料(VarnishCache3.0新機能とVUPの仕方)
tokyo.vcl発表資料(VarnishCache3.0新機能とVUPの仕方)
 
Tarantubeでメッセージキューを使い倒す
Tarantubeでメッセージキューを使い倒すTarantubeでメッセージキューを使い倒す
Tarantubeでメッセージキューを使い倒す
 
Neo4j and Tableau getting started with the Panama Papers
Neo4j and Tableau getting started with the Panama PapersNeo4j and Tableau getting started with the Panama Papers
Neo4j and Tableau getting started with the Panama Papers
 
20071204
2007120420071204
20071204
 
Spannerに関する技術メモ
Spannerに関する技術メモSpannerに関する技術メモ
Spannerに関する技術メモ
 
Scapy presentation
Scapy presentationScapy presentation
Scapy presentation
 

Similar a Tarantalk

Trac 0.12 と今後の動向および Trac への貢献 - tanabata.trac 2010-07-07
Trac 0.12 と今後の動向および Trac への貢献 - tanabata.trac 2010-07-07Trac 0.12 と今後の動向および Trac への貢献 - tanabata.trac 2010-07-07
Trac 0.12 と今後の動向および Trac への貢献 - tanabata.trac 2010-07-07
Jun Omae
 
Boost.Flyweight
Boost.FlyweightBoost.Flyweight
Boost.Flyweight
gintenlabo
 

Similar a Tarantalk (20)

[GKE & Spanner 勉強会] Cloud Spanner の技術概要
[GKE & Spanner 勉強会] Cloud Spanner の技術概要[GKE & Spanner 勉強会] Cloud Spanner の技術概要
[GKE & Spanner 勉強会] Cloud Spanner の技術概要
 
Inside of Asakusa DSL
Inside of Asakusa DSLInside of Asakusa DSL
Inside of Asakusa DSL
 
CouchDB JP & BigCouch
CouchDB JP & BigCouchCouchDB JP & BigCouch
CouchDB JP & BigCouch
 
SpringOne 2016 報告 Reactive APIの設計・実装・使用
SpringOne 2016 報告 Reactive APIの設計・実装・使用SpringOne 2016 報告 Reactive APIの設計・実装・使用
SpringOne 2016 報告 Reactive APIの設計・実装・使用
 
Trac 0.12 と今後の動向および Trac への貢献 - tanabata.trac 2010-07-07
Trac 0.12 と今後の動向および Trac への貢献 - tanabata.trac 2010-07-07Trac 0.12 と今後の動向および Trac への貢献 - tanabata.trac 2010-07-07
Trac 0.12 と今後の動向および Trac への貢献 - tanabata.trac 2010-07-07
 
Kuduを調べてみた #dogenzakalt
Kuduを調べてみた #dogenzakaltKuduを調べてみた #dogenzakalt
Kuduを調べてみた #dogenzakalt
 
Flutterを体験してみませんか
Flutterを体験してみませんかFlutterを体験してみませんか
Flutterを体験してみませんか
 
Boost.Flyweight
Boost.FlyweightBoost.Flyweight
Boost.Flyweight
 
Lagopus performance
Lagopus performanceLagopus performance
Lagopus performance
 
アプリ開発者、DB 管理者視点での Cloud Spanner 活用方法 | 第 10 回 Google Cloud INSIDE Games & App...
アプリ開発者、DB 管理者視点での Cloud Spanner 活用方法 | 第 10 回 Google Cloud INSIDE Games & App...アプリ開発者、DB 管理者視点での Cloud Spanner 活用方法 | 第 10 回 Google Cloud INSIDE Games & App...
アプリ開発者、DB 管理者視点での Cloud Spanner 活用方法 | 第 10 回 Google Cloud INSIDE Games & App...
 
今秋リリース予定のPostgreSQL11を徹底解説
今秋リリース予定のPostgreSQL11を徹底解説今秋リリース予定のPostgreSQL11を徹底解説
今秋リリース予定のPostgreSQL11を徹底解説
 
大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニック
大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニック大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニック
大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニック
 
Container communication on lattice #2
Container communication on lattice #2Container communication on lattice #2
Container communication on lattice #2
 
eBPFを用いたトレーシングについて
eBPFを用いたトレーシングについてeBPFを用いたトレーシングについて
eBPFを用いたトレーシングについて
 
C# design note sep 2014
C# design note sep 2014C# design note sep 2014
C# design note sep 2014
 
PostgreSQL 12の話
PostgreSQL 12の話PostgreSQL 12の話
PostgreSQL 12の話
 
Hadoopのシステム設計・運用のポイント
Hadoopのシステム設計・運用のポイントHadoopのシステム設計・運用のポイント
Hadoopのシステム設計・運用のポイント
 
ゆるふわLinux-HA 〜PostgreSQL編〜
ゆるふわLinux-HA 〜PostgreSQL編〜ゆるふわLinux-HA 〜PostgreSQL編〜
ゆるふわLinux-HA 〜PostgreSQL編〜
 
ゲームのインフラをAwsで実戦tips全て見せます
ゲームのインフラをAwsで実戦tips全て見せますゲームのインフラをAwsで実戦tips全て見せます
ゲームのインフラをAwsで実戦tips全て見せます
 
Cpu cache arch
Cpu cache archCpu cache arch
Cpu cache arch
 

Más de Masashi Umezawa

Más de Masashi Umezawa (20)

第142回Smalltalk勉強会 - PharoJSで作るWebアプリケーション
第142回Smalltalk勉強会 - PharoJSで作るWebアプリケーション第142回Smalltalk勉強会 - PharoJSで作るWebアプリケーション
第142回Smalltalk勉強会 - PharoJSで作るWebアプリケーション
 
FileManで楽々ファイル操作
FileManで楽々ファイル操作FileManで楽々ファイル操作
FileManで楽々ファイル操作
 
TruffleSqueakの紹介
TruffleSqueakの紹介TruffleSqueakの紹介
TruffleSqueakの紹介
 
SmalltalkBoltでUFFI入門
SmalltalkBoltでUFFI入門SmalltalkBoltでUFFI入門
SmalltalkBoltでUFFI入門
 
TaskItの紹介
TaskItの紹介TaskItの紹介
TaskItの紹介
 
Smalltalk勉強会 - 過去、現在、そして未来へ のその後
Smalltalk勉強会 - 過去、現在、そして未来へ のその後Smalltalk勉強会 - 過去、現在、そして未来へ のその後
Smalltalk勉強会 - 過去、現在、そして未来へ のその後
 
Revealing ALLSTOCKER
Revealing ALLSTOCKERRevealing ALLSTOCKER
Revealing ALLSTOCKER
 
TarandocでJSONを永続化
TarandocでJSONを永続化TarandocでJSONを永続化
TarandocでJSONを永続化
 
Dockerizing pharo
Dockerizing pharoDockerizing pharo
Dockerizing pharo
 
今からでも遅くないSmalltalk入門
今からでも遅くないSmalltalk入門今からでも遅くないSmalltalk入門
今からでも遅くないSmalltalk入門
 
VerStixの紹介
VerStixの紹介VerStixの紹介
VerStixの紹介
 
Oldtalk - あのころの処理系は今
Oldtalk - あのころの処理系は今Oldtalk - あのころの処理系は今
Oldtalk - あのころの処理系は今
 
Pyonkeeを鳴らす
Pyonkeeを鳴らすPyonkeeを鳴らす
Pyonkeeを鳴らす
 
Smalltalk勉強会 - 過去、現在、そして未来へ
Smalltalk勉強会 - 過去、現在、そして未来へSmalltalk勉強会 - 過去、現在、そして未来へ
Smalltalk勉強会 - 過去、現在、そして未来へ
 
Smalltalkと型について
Smalltalkと型についてSmalltalkと型について
Smalltalkと型について
 
Introduction of Pharo 5.0
Introduction of Pharo 5.0Introduction of Pharo 5.0
Introduction of Pharo 5.0
 
Why!? Smalltalk
Why!? SmalltalkWhy!? Smalltalk
Why!? Smalltalk
 
Pillarの紹介
Pillarの紹介Pillarの紹介
Pillarの紹介
 
Scrumの紹介とXPプロジェクトへの適用(Scrum and XP)
Scrumの紹介とXPプロジェクトへの適用(Scrum and XP)Scrumの紹介とXPプロジェクトへの適用(Scrum and XP)
Scrumの紹介とXPプロジェクトへの適用(Scrum and XP)
 
NanoStrand
NanoStrandNanoStrand
NanoStrand
 

Tarantalk