SlideShare a Scribd company logo
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が利用できる

More Related Content

PDF
Hokkaido.cap#4 ケーススタディ(ネットワークの遅延と戦う:前編)
PDF
Stream processing and Norikra
PDF
Hokkaido.cap#7 ケーススタディ(セキュリティ解析:前編)
PPTX
高度に最適化された移植可能なメモリマネージャ
PDF
Complex Event Processing on Ruby, Fluentd and Norikra #rubykaigi
PDF
fluent-plugin-norikra #fluentdcasual
PDF
Discretized Streams: Fault-Tolerant Streaming Computation at Scaleの解説
PPT
Gr sakuraでtinet
Hokkaido.cap#4 ケーススタディ(ネットワークの遅延と戦う:前編)
Stream processing and Norikra
Hokkaido.cap#7 ケーススタディ(セキュリティ解析:前編)
高度に最適化された移植可能なメモリマネージャ
Complex Event Processing on Ruby, Fluentd and Norikra #rubykaigi
fluent-plugin-norikra #fluentdcasual
Discretized Streams: Fault-Tolerant Streaming Computation at Scaleの解説
Gr sakuraでtinet

What's hot (20)

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

Similar to Tarantalk (11)

PDF
Elasticsearch入門 pyfes 201207
PDF
Scala による自然言語処理
PDF
Scalaノススメ
PDF
Object-Funcational Analysis and design
PDF
Scalaプログラミング・マニアックス
PDF
今日から使おうSmalltalk
PDF
TarandocでJSONを永続化
PDF
ドキュメンテーションを加速するストレスフリーの作図ツール『blockdiag』 jus2011年6月勉強会
PPTX
Scala勉強会 初心者向けハンズオン前編
PDF
アルゴリズム+データ構造勉強会(9)
PDF
文字列処理
Elasticsearch入門 pyfes 201207
Scala による自然言語処理
Scalaノススメ
Object-Funcational Analysis and design
Scalaプログラミング・マニアックス
今日から使おうSmalltalk
TarandocでJSONを永続化
ドキュメンテーションを加速するストレスフリーの作図ツール『blockdiag』 jus2011年6月勉強会
Scala勉強会 初心者向けハンズオン前編
アルゴリズム+データ構造勉強会(9)
文字列処理
Ad

More from Masashi Umezawa (20)

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

Tarantalk