Daemon

デーモンは、ワークフローを定期的に実行するサービスです。シナリオと同様に、ワークフローエディタで自由に定義してすぐに動作させることができます。シナリオとは異なり、トランザクションサービスとは連携しません。トランザクション処理を定期的に動作させたい場合は、デーモンからシナリオやATOMを呼び出すことで実現できます。

デーモンが保有する属性

属性 概要 備考
name デーモンの名前を指定します。 ユニークである必要があります。
category デーモンのカテゴリを指定します。 カテゴリはデーモンを分類するためのラベルですが、カテゴリと同一名称のConfigサービスを定義している場合、デーモンが呼び出されたときに自動的にデーモンの名前空間にインポートされます。
詳細については、Docs » 名前空間 » リファレンス » Scenarioにおけるプログラミングの章を参照してください。
execute count デーモンを繰返し実行する回数を指定します。 デフォルトは-1が設定され、デーモンが活性状態の間、定期間隔で無限に実行されます。
interval デーモンを実行する間隔を指定します。 デフォルトは60秒です。ここで指定した間隔は、デーモンの実行完了後からカウントダウンされます。
status デーモンのステータスを指定します。 activeを指定すると、デーモンは定期的に実行されます。
inactiveを指定すると、定期的な実行を停止します。
global_variables グローバル変数を指定します。 デーモンでは複数のコマンドを配置できますが、コマンド間で使用される変数はここで宣言する必要があります。グローバル変数定義のセットを他のシナリオまたはデーモンと共有する場合は、
VariableGroupサービスを使用できます。

コマンドの動作と記述方法は、シナリオと同じです。コマンドの詳細とフロー制御については、Docs » Scenario » シナリオを参考にしてください。

Note

デーモンは、マスターノードのマスタープロセスでのみ稼働します。従ってクラスタ環境で競合動作することはありません。


Daemonに関するトラブルシューティング

負荷増大による影響

負荷増大によりヘルスチェックエラーが発生したり、ScenarioPodがダウンするといった報告があります。
Daemonで実行するシナリオ処理の負荷増大(特にtransactionデータサイズ増加)や、SCPを用いたファイル転送などが原因の可能性があります。 対策として、Daemonで負荷のかかる処理を避ける、処理間隔を長くするなどの負荷軽減策を検討してください。

新規環境デプロイ時にDaemonがアクティブにならない

新規環境をデプロイした際に Daemon がアクティブにならない場合があります。
これはDaemonの定義ファイルでremainCount = 0が設定されていると、Daemonはアクティブにならないといった仕様によるものです。 remainCountをNoneなどの値に変更してください。

stg環境以降の仕様

stg以降の環境では仕様上、デプロイ時にDaemonが自動でアクティブ化されます。
自動アクティブ化を回避したい場合は、設定ファイルにactivateDaemonson:falseを追加してください。

Warning

v23.2LTS-patch20231225以前の不具合について
何らかの理由でサービスが一時停止した際、サービスの復帰後にDaemonの定期処理が停止する事象が確認されております。 本事象を避けるためには最新バージョンにアップデートしてください。


Deamonの再起動方法

Daemonを再起動するには、Scenarioのインタラクティブシェルで以下のコマンドを実行してください。

>>> from axis.boot.context import SystemContext↵
... c = SystemContext.getinstance()↵
... d = c.__daemon__↵
... d.shutdownall()↵
... ↵
↵
>>> print(Daemon.status())↵
... ↵
↵
{}
>>> await c.restart_daemon()↵
... ↵
↵
>>> print(Daemon.status())↵
... ↵
↵
{'Daemon1': <TimerHandle IOLoop._run_callback>, 'Daemon2': <TimerHandle IOLoop._run_callback>}

shutdownall()restart_daemon()の代わりにshutdown(daemon_name)startup(daemon_name)を使用し、特定のDaemonを操作することも可能です。