O slideshow foi denunciado.
Seu SlideShare está sendo baixado. ×

Tarantubeでメッセージキューを使い倒す

Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Próximos SlideShares
NanoStrand
NanoStrand
Carregando em…3
×

Confira estes a seguir

1 de 29 Anúncio

Mais Conteúdo rRelacionado

Diapositivos para si (20)

Mais de Masashi Umezawa (20)

Anúncio

Mais recentes (20)

Tarantubeでメッセージキューを使い倒す

  1. 1. Tarantube Smalltalk でメッセージキュー Smalltalk勉強会2017 合同会社ソフトウメヤ 梅澤真史
  2. 2. Tarantubeとは ● 永続化機能付きメッセージキュー ○ http://smalltalkhub.com/#!/~MasashiUmezawa/Tarantube ● Tarantoolのqueueモジュールのラッパー ○ わずか3クラスで作られている ■ TrTube ■ TrTubeTask ■ TrTubeOptionsBuilder
  3. 3. Tarantubeの例 tarantalk := TrTarantalk connect: 'taran:talk@localhost:3301'. "FIFOのtube作成" tube := tarantalk ensureTubeNamed: 'my_tube'. "tubeにtaskを追加" 1 to: 10 do: [:idx | tube putTaskWith: idx asString]. "定期的にタスクを取得して実行" tube repeatTakeTaskIfAvailable: [:task | Transcript cr; show: {task. task data}. task done].
  4. 4. Tarantool ● No SQLの注目株 ○ ThoughtWorks Technology RadarのAssess段階 ○ ロシア製。Mail.ruで使われている ■ Heavy workloads: our use cases of Tarantool ● Tupleの永続化をサポート ○ KVSよりも構造化、RDBよりは軽量 ● Luaの実行エンジンであり、Luaで拡張できる ○ queue, RDBとの接続など ● 1.8系列からLuaに加えてSQLも使える
  5. 5. Tarantoolのインストール ● Tarantoolの入手 ○ https://tarantool.org/en/download/download.html ■ 様々なプラットフォームに対応 ○ Macなら brew install tarantool --HEAD
  6. 6. Tarantoolの起動 ● 適当なディレクトリ(taranとか)を作成、移動し ● 3 + 4 ● クライアントの接続受付 tarantool> 3 + 4 tarantool tarantool> box.cfg{listen = 3301}
  7. 7. ユーザの権限設定 ● 接続用ユーザの登録 box.schema.user.grant('taran', 'read,write,execute', 'universe') box.schema.user.create('taran', {password = 'talk'}) ● アクセス権限の付与 参考: SmalltalkからLuaをevalする
  8. 8. queueモジュールの導入 ● tarantoolctlで tarantoolctl rocks install queue ● tarantoolのコンソールからrequireすると使える tarantool> queue = require('queue') tarantool> queue.stats()
  9. 9. config.luaでの起動 ● お決まりの設定を書いておくと便利 box.cfg{listen = 3301, work_dir = 'queue_db'} box.schema.user.create('taran', {password = 'talk', if_not_exists=true}) box.schema.user.grant('taran', 'read,write,execute', 'universe', nil, {if_not_exists=true}) queue = require('queue') require('console').start() tarantool config.lua ● config.luaの例
  10. 10. Tarantubeのインストール ● Catalog Browserから ○ 'tarantube'で検索し、"install stable version" ● あるいはMetacelloでロード Metacello new smalltalkhubUser: 'Pharo' project: 'MetaRepoForPharo60'; configuration: 'Tarantube'; version: #stable; get; load.
  11. 11. Tarantubeの構成 ● Tarantalk-Core ○ TrTube ■ いわゆるキュー ○ TrTubeTask ■ キューに積まれるタスク。 任意のデータを保持できる ○ TrTubeOptionsBuilder ■ 各種オプション指定のためのビルダー
  12. 12. Tubeの生成 ● TrTarantalk>>connect:で接続 ○ URLでユーザ名、パスワードを指定 ● ensureTubeNamed:type:setting:でTubeを生成 ○ ensureTybeNamed:type:で明示的に指定しない場合 シンプルなfifoキューとなる tarantalk := TrTarantalk connect: 'taran:talk@localhost:3301'. tube := tarantalk ensureTubeNamed: 'my_tube'.
  13. 13. Tubeの種類 ● fifo ○ もっともシンプルなキュー ● fifottl ○ TTL(time to live), TTR(time to run), Priority, Delay などが 指定できる高機能なキュー ● utube ○ グループ化できるキュー。グループごとにfifoで処理される ● utubettl ○ utubeの高機能版 (TTL, TTR, Priority, Delay…) ● https://github.com/tarantool/queue#queue-types
  14. 14. Taskの投入(put) ● TrTube>>putTaskWith:setting:で投入 ○ 任意のデータ、及びdelayなどのオプションを指定できる tube putTaskWith: 'hello'. tube putTaskWith: 'he--llo--' setting:[:opts| opts delay: 20].
  15. 15. Tarantubeの例 (再び) tarantalk := TrTarantalk connect: 'taran:talk@localhost:3301'. "FIFOのtube作成" tube := tarantalk ensureTubeNamed: 'my_tube'. "tubeにtaskを追加" 1 to: 10 do: [:idx | tube putTaskWith: idx asString]. "定期的にタスクを取得して実行" tube repeatTakeTaskIfAvailable: [:task | Transcript cr; show: {task. task data}. task done].
  16. 16. 実行結果は... ● Transcript に以下のように表示
  17. 17. consoleからの状態確認 ● config.lua でconsoleをstart させておく require('console').start() ● queue.stats() ○ タスクの状態、呼び出しの状態が一覧表示される tarantool> queue.stats()
  18. 18. delayを試してみる "fifottlのtube作成" ttlTube := tarantalk ensureTubeNamed: 'ttl_tube' type: 'fifottl'. "tubeにtaskを追加" ttlTube putTaskWith: 'delayed' setting: [:opts | opts delay: 10]. 1 to: 10 do: [:idx | ttlTube putTaskWith: idx asString]. "定期的にタスクを取得して実行" ttlTube repeatTakeTaskIfAvailable: [:task | Transcript cr; show: {task. task data}. task done].
  19. 19. 実行結果は... ● 10秒後に'delayed'のタスクが実行される
  20. 20. ttlを試してみる "タスク取得を止めておく" ttlTube stopTaking. "取得したタスクを実行する度に2秒ほど待つようにする" ttlTube repeatTakeTaskIfAvailable: [:task | Transcript cr; show: {task. task data}. 2 seconds wait. task done ifFailed: [:ex | ex inspect]]. "tubeにTTLが5秒のtaskを追加" 1 to: 10 do: [:idx | ttlTube putTaskWith: idx asString setting: [:opts | opts ttl: 5]].
  21. 21. 実行結果は... ● 2つまで成功。3つ目はdoneに失敗
  22. 22. utubeで詰まりにくく "utubeのtube作成" uTube := tarantalk ensureTubeNamed: 'u_tube' type: 'utube'. "偶数、奇数のグループ指定でtaskを追加" 1 to: 10 do: [:idx | uTube putTaskWith: idx asString setting: [:opts | opts utube: (idx rem: 2) asString]]. uTube takeTask done. pending := uTube takeTask. "2番目をdoneにしない" uTube repeatTakeTaskIfAvailable: [:task | Transcript cr; show: {task. task data}. task done].
  23. 23. 実行結果は... ● 偶数グループは詰まる ● 奇数グループが実行を続ける
  24. 24. buryとkick (1) "タスクを一時退避" pending bury. ● 偶数グループも実行される
  25. 25. buryとkick (2) "一時退避していたタスクをキューに戻す" uTube kick: 1. ● 2番目のタスクも実行される
  26. 26. luaでburyするには ● tarantoolctl connect 'user:pass@host:port' ○ あるいはconsoleでもよい queue.tube.u_tube:bury(box.space.u_tube.index.status:select('r')[1][1]) ● 管理用には覚えておくと便利 ○ https://github.com/tarantool/queue#fields-of-the-spac e-associated-with-each-queue
  27. 27. 接続の解放 ● TrTarantalk>>releaseで切断 ● TrTarantalk class >> releaseAll ○ 全ての接続を一度に解放 tarantalk release. TrTarantalk releaseAll.
  28. 28. 事例は? ● ALLSTOCKER でメール送信のキューとして使用中 ○ アプリサーバのPharoからのリクエストで送信メールを永続 キューにためる ○ 別のPharoがキューから取り出し、SendGrid, TwilioのAPI経 由で送信
  29. 29. まとめ ● Tarantubeでメッセージキューをわりと簡単に Pharoに導入できる ○ 永続化される安心感 ○ 軽量だがそれなりに高機能 ● そろそろSmalltalkHubからGitHubに移動したい

×