Blog Brocade Japan

Stackstorm/BWCでのConcurrent Policyの利用について

by Shigetoshi Tani on ‎04-25-2017 09:05 PM - last edited on ‎04-25-2017 09:16 PM by aokuhara (1,214 Views)

StackStorm/BWCでは、オプションで特定のアクションについて同時実行数を制限するポリシー(Concurrent Policy)をサポートしています。同時実行数を制限し、それを越える場合にリクエストを延期、遅延、キャンセルを指定することができます。同時にリクエストが来た場合には、平行して処理するのか、制限数を設けて順に処理させるのか、などの指定が柔軟に行えます。

そのセットアップと、動作についてご紹介します。bwc.jpg

 

  • Redis サーバのインストール&セットアップ
  • StackStorm/BWCのRedis設定
  • 同時実行数の制御ポリシー

環境:
StackStrom/BWC 2.2.1 (Ubuntu16.0.4)
Redis Server v3.0.6(Ubuntu16.04)

 

  • Redis サーバのインストール&セットアップ

RedisサーバをUbuntu16.04へインストールします。

$ sudo apt install redis-server

ネットワーク設定およびパスワードを設定します。

$ sudo vi /etc/redis/redis.conf
....
#bind 127.0.0.1
bind 10.0.1.xxx  <<<< RedisサーバのインタフェースのIPを指定
....
# requirepass foobared
requirepass hoge  <<<<<外部からアクセスするパスワードを指定

変更を完了したら、Redisサーバをリスタートします。

$ sudo systemctl restart redis-server

 

  • StackStorm/BWCのRedis設定

StackStorm/BWC側でRedisのPythonライブラリをインストールします。

$ sudo su
$ source /opt/stackstorm/st2/bin/activate
$ pip install redis

バックエンドのRedis接続の設定をします。Redisサーバで指定したパスワードを使います。

$ vi /etc/st2/st2.conf
...
[coordination]
url = redis://:hoge@10.0.1.xxx:6379

変更完了後に、StackStorm/BWCをリスタートします。

$ sudo st2ctl restart
  • 同時実行数の制御ポリシー

実際に同時実行のポリシーを動かしてみます。
ポリシー用のディレクトリを準備します。

$ sudo mkdir /opt/stackstorm/pack/default/policies

同時実行制御のポリシーのYamlを作成します。

$ cat myaction.yaml
---
name: my_action.concurrency
description: limit executions
enabled: true
resource_ref: default.test_policy
policy_type: action.concurrency
parameters:
  action: delay
  threshold: 1

ポリシーを読み込ませます。

$ st2ctl reload --register-policies

なお10秒以上かかるワークフローとそれを起動するルールを準備します。

ubuntu@bwc221:/opt/stackstorm/packs/default/actions/workflows$ cat test_policy.yaml
---
version: '2.0'

default.test_policy:
  input:
    - foo
  tasks:
    task1:
      # [235, 26]
      action: core.local
      input:
        cmd: "date >> ~/<% $.foo %>;sleep 10"
      on-success:
        - task2
    task2:
      # [105, 128]
      action: core.local
      input:
        cmd: "date -R>> ~/<% $.foo %>"

ubuntu@bwc221:/opt/stackstorm/packs/default/rules$ cat test_policy.yaml
---
name: "test_policy"
pack: "default"
description: "policy test"
enabled: true

trigger:
  type: "core.st2.webhook"
  parameters:
    url: "policy"

action:
  ref: "default.test_policy"
  parameters:
    foo: "{{ trigger.body.foo }}"

以下のスクリプトを実行し、10回分のアクションのリクエストを送ります。

#!/bin/bash
x=0
while [ $x -lt 10 ];
do
curl -v -k -H 'Content-Type:application/json' -H 'X-Auth-Token:60a01748c24340859ea6b430b2ed0b36' -d '{"foo":"test"}' https://10.0.1.xxx/api/v1/webhooks/policy
((x++))
done;

StackStorm/BWC側では、送られてきたリクエストでしきい値を超えたものはDelayとされ、前のリクエストが完了してから、つぎのアクションが実行されます。

root@bwc221:/home/stanley# st2 execution list -n 10
+----------------------------+---------------------+--------------+-------------------------+-----------------------------+-------------------------------+
| id                         | action.ref          | context.user | status                  | start_timestamp             | end_timestamp                 |
+----------------------------+---------------------+--------------+-------------------------+-----------------------------+-------------------------------+
| + 58fed52409a68e2c1eed8fc3 | default.test_policy | stanley      | succeeded (16s elapsed) | Tue, 25 Apr 2017 04:48:36   | Tue, 25 Apr 2017 04:48:52 UTC |
|                            |                     |              |                         | UTC                         |                               |
| + 58fed52409a68e2c1eed8fc8 | default.test_policy | stanley      | running (23s elapsed)   | Tue, 25 Apr 2017 04:48:36   |                               |
|                            |                     |              |                         | UTC                         |                               |
|   58fed52509a68e2c1eed8fcd | default.test_policy | stanley      | delayed                 | Tue, 25 Apr 2017 04:48:37   |                               |
|                            |                     |              |                         | UTC                         |                               |
|   58fed52509a68e2c1eed8fd2 | default.test_policy | stanley      | delayed                 | Tue, 25 Apr 2017 04:48:37   |                               |
|                            |                     |              |                         | UTC                         |                               |
|   58fed52509a68e2c1eed8fd7 | default.test_policy | stanley      | delayed                 | Tue, 25 Apr 2017 04:48:37   |                               |
|                            |                     |              |                         | UTC                         |                               |
|   58fed52509a68e2c1eed8fdc | default.test_policy | stanley      | delayed                 | Tue, 25 Apr 2017 04:48:37   |                               |
|                            |                     |              |                         | UTC                         |                               |
|   58fed52509a68e2c1eed8fe1 | default.test_policy | stanley      | delayed                 | Tue, 25 Apr 2017 04:48:37   |                               |
|                            |                     |              |                         | UTC                         |                               |
|   58fed52509a68e2c1eed8fe6 | default.test_policy | stanley      | delayed                 | Tue, 25 Apr 2017 04:48:37   |                               |
|                            |                     |              |                         | UTC                         |                               |
|   58fed52609a68e2c1eed8feb | default.test_policy | stanley      | delayed                 | Tue, 25 Apr 2017 04:48:38   |                               |
|                            |                     |              |                         | UTC                         |                               |
|   58fed52609a68e2c1eed8ff0 | default.test_policy | stanley      | delayed                 | Tue, 25 Apr 2017 04:48:38   |                               |
|                            |                     |              |                         | UTC                         |                               |
+----------------------------+---------------------+--------------+-------------------------+-----------------------------+-------------------------------+

すべての処理が終わったところで書き込んだファイルを見ると、task1 "date"-> task2 "date -R"の順で処理されていることがわかります。

/home/stanley# cat test
Tue Apr 25 13:48:37 JST 2017
Tue, 25 Apr 2017 13:48:48 +0900
Tue Apr 25 13:48:52 JST 2017
Tue, 25 Apr 2017 13:49:03 +0900
Tue Apr 25 13:49:07 JST 2017
Tue, 25 Apr 2017 13:49:18 +0900
Tue Apr 25 13:49:22 JST 2017
Tue, 25 Apr 2017 13:49:33 +0900
Tue Apr 25 13:49:37 JST 2017
Tue, 25 Apr 2017 13:49:48 +0900
Tue Apr 25 13:49:52 JST 2017
Tue, 25 Apr 2017 13:50:03 +0900
Tue Apr 25 13:50:07 JST 2017
Tue, 25 Apr 2017 13:50:18 +0900
Tue Apr 25 13:50:22 JST 2017
Tue, 25 Apr 2017 13:50:33 +0900
Tue Apr 25 13:50:37 JST 2017
Tue, 25 Apr 2017 13:50:48 +0900
Tue Apr 25 13:50:52 JST 2017
Tue, 25 Apr 2017 13:51:03 +0900

なお、ポリシーでの指定がない場合は、以下のようにtask1"date"がほぼ同時に実行開始され、task2"date -R"も平行して処理されます。

/home/stanley# cat test
Tue Apr 25 02:00:21 UTC 2017
Tue Apr 25 02:00:22 UTC 2017
Tue Apr 25 02:00:22 UTC 2017
Tue Apr 25 02:00:23 UTC 2017
Tue Apr 25 02:00:25 UTC 2017
Tue Apr 25 02:00:26 UTC 2017
Tue Apr 25 02:00:27 UTC 2017
Tue Apr 25 02:00:27 UTC 2017
Tue Apr 25 02:00:27 UTC 2017
Tue Apr 25 02:00:28 UTC 2017
Tue, 25 Apr 2017 02:00:31 +0000
Tue, 25 Apr 2017 02:00:33 +0000
Tue, 25 Apr 2017 02:00:33 +0000
Tue, 25 Apr 2017 02:00:34 +0000
Tue, 25 Apr 2017 02:00:36 +0000
Tue, 25 Apr 2017 02:00:37 +0000
Tue, 25 Apr 2017 02:00:39 +0000
Tue, 25 Apr 2017 02:00:39 +0000
Tue, 25 Apr 2017 02:00:40 +0000
Tue, 25 Apr 2017 02:00:41 +0000

ポリシーについては、StackStorm/BWCのドキュメントに説明がありますので、合わせてご覧ください。

https://docs.stackstorm.com/reference/policies.html

 

StackStorm Slack日本語チャネル】

SlackのStackstorm-communityチームに登録されている方はそのまま#community-japanへ参加できます。まだの方はこちら!!