botpressのセッションタイムアウト周り(1)
概要
botpressで作成したbotが、ユーザーとの対話中に得た情報を保存できるsessionメモリ周りの動きを追ったメモ(前半)です。 主に以下の事を調査します。
- セッション有効期間の設定はどこを調整すればよいのか
- セッションデータの保存先がどこか
botpressのバージョンはv12.27.0です
Botpressのメモリ
ボットがユーザーに回答を返すために、一連の会話の流れで得た情報を保存しておきた場合があります。 例えば以下のようなデータが、回答の生成に必要になったりします。
- 一連のやりとりでユーザーの入力から得た情報
- 対話中に外部サービスを呼び出した結果のデータ
4種類のメモリ
botpressではそのようなデータの保存に4種類のスコープでメモリを用意しています。
- user
- session
- temp
- bot
各メモリについては、Flow MemoryのVariablesに記載があります。
今回見ていきたい、sessionメモリーについては、「設定された期間データを保持」と説明があります。こちらの保存先、期間設定方法について見ていきます。
タイムアウトのハンドリング処理から追う
セッションタイムアウト時にボットに応答させたり、処理する方法は、 Flow LifecycleのSession Timeoutに3つ記載されています。
(タイムアウトフローによる動作は確認したが、それ以外は私は未確認)
- timeoutという名称のノードをフローに作成する
- タイムアウトフローを作成する(timeoutというフローを作成)して、エントリーノードに動作を設定
- *.flow.jsonにtimeoutNodeとうプロパティと追加して、タイムアウト処理するノード名を記載
DialogJanitorクラス
「timeoutNode」を参照している箇所をソースから探すと、 processTimeoutというメソッドが見つかりそこから遡ると下記フローになり、 setIntervalで定期的によばれる形のようです。
DialogJanitorクラスのrunTaskメソッドを見ると、このあたりが削除周りの処理を行なっていそうです。
セッションの削除処理
runTaskメソッドから呼び出している、deleteExpiredSessionsメソッドでセッション削除を行なっていました。
dialog_sessionsテーブルのsession_expiryカラムが現在時刻より前のレコードを削除する処理のようです。(以下のようなSQLになる)
delete from
`dialog_sessions`
where
session_expiry < '現在時刻’
ということは、セッションメモリの保存先はdialog_sessionsテーブルになりそうです。
また、session_expiryカラムに値をセットする処理追ってみると、どの設定をするとセッションの期限が設定できるのか特定できそうです。
まとめ
- セッションメモリの保存先はdialog_sessionsテーブル
- dialog_sessionsテーブルのsession_expiryカラムに有効期限が設定されている
後半
runTaskメソッドから呼び出している、getExpiredContextSessionIdsメソッドを追います。
Discussion