Blue/Greenデプロイメントにおいて旧系のデーモンなどの処理を抑止する方法はありますか


Scenarioサーバで実行されるDaemon、Scheduleサーバの予約実行、Reflectorサーバのメトリック送信は、マルチノードで実行してはいけない処理であることからマスターノードでのみ実行されます。Blue/Greenデプロイメントでは、一時的にダブルマスター状態となるため、冗長に処理が動作してしまう可能性があります。
本問題を回避するためには、旧系のマスターノードに対して以下のAPIを呼び出す必要があります。API呼び出しによって該当マスターノードはDaemon実行やSchedule実行、メトリック送信を停止します。

マスター処理を抑制するAPI

PATCH /services
{
    "master_suppression": true
}

マスター処理の抑制を解除するAPI

PATCH /services
{
    "master_suppression": false
}


マスターの状態の確認
マスター処理抑制モードは、GET /servicesの応答で確認することができます。

>>> r = await callout(url="http://scenario:9000/services")↵
... print(json.loads(r.body)["master_suppression"])↵
... ↵
↵
False
>>>

Tip

calloutを使用する場合、エンドポイントのデフォルト値がAPIGWとなっているため、指定しないとAPIGWの master_suppression の値を参照します。利用する場合は上記のように明示的に scenario / schedule / reflector サーバーを指定してください。


また、上記の抑制操作をREPLで行う場合は、Runtime組込オブジェクトに対して以下のように操作することができます。

>>> runtime = Runtime()↵
... print(runtime.ismaster())↵...マスターノードであることを確認
... ↵
↵
True
>>> print(runtime.context.master_suppression)↵...マスター抑制モードを確認
... ↵
↵
False
>>> runtime.context.master_suppression = True↵...マスター抑制モードに設定(Daemon/予約発火/メトリック送信は停止します)
... print(runtime.context.master_suppression)↵
... ↵
↵
True
>>> runtime.context.master_suppression = False↵...マスター抑制モードを解除(Daemon/予約発火/メトリック送信が再開します)
... print(runtime.context.master_suppression)↵
... ↵
↵
False
>>>