🤖

botpressのセッションタイムアウト周り(2)

2022/05/20に公開

概要

botpressで作成したbotが、ユーザーとの対話中に得た情報を保存できるsessionメモリ周りの動きを追ったメモ(後半)です。
前半はbotpressのセッションタイムアウト周り(1)になります

後半では以下がわかります。

  • セッションの有効期限の設定には2つの設定がある
  • ユーザーへの応答とデータの削除タイミングが異なる

botpressのバージョンはv12.27.0です
https://github.com/botpress/botpress/tree/v12.27.0

コンテキストのリセット

runTaskメソッドから呼び出している、getExpiredContextSessionIdsメソッドです。
このメソッドによって抽出されたセッションIDに対して、セッションタイムアウトのハンドリング処理が実行されるようです
これがrunTaskメソッドのコメントにあるコンテキストのリセットに該当するのでしょうか。
https://github.com/botpress/botpress/blob/ea35dcf747756691f376d3b35a4f614c925d1b2b/packages/bp/src/core/dialog/sessions/session-repository.ts#L83-L102

メソッドの中見はdialog_sessionテーブルに下記のようなSQLを実行して対象のセッションIDを抽出しています。 条件としては以下の条件を満たすもののようです。

  • context_expiryカラムが現時刻より前
  • contextカラムに何かしら情報が入っている?
sql
sselect
	`id`
from
	`dialog_sessions`
where
	context_expiry < '<現在時刻>' and
	context <> '{}'
order by
	`modified_on` asc limit 250

セッション削除対象は、session_expireカラムだったのに、こちらはcontext_expiryカラムを対象として検索しているようです。

timeoutIntervalとsessionTimeoutInterval

DialogJanitorの_processSessionTimeoutメソッド呼び出しを追っていくと、「_updateState」メソッドの呼び出しに辿り着きます。
ここの中でdialog_sessionsテーブルののsession_expiryカラムとcontext_expiryカラムの更新を行なっています。

createExpiry関数

設定から、セッションの期間を読み取って、セッションの有効期限を決めている処理はこの関数でした。
timeoutIntervalとsessionTimeoutIntervalという二つ設定を読み取り、有効期限を作成してます。

  • context
    • context_expiryカラムに設定される値で、 現時刻にtimeoutIntervalを加算した時刻
  • session
    • session_expiryカラムに設定される値で、現時刻にsessionTimeoutIntervalを加算した時刻

https://github.com/botpress/botpress/blob/ea35dcf747756691f376d3b35a4f614c925d1b2b/packages/bp/src/core/dialog/sessions/expiry.ts#L19-L32

まとめ

  • セッションタイムアウトの期限には2つの設定項目がある
  • timeoutIntervalが実質のセッションの有効期間の設定
    • この期限がきれるとタイムアウトフローなどが実施
  • sessionTimeoutIntervalはセッションデータの有効期限の設定
    • この期限がきれるとdialog_sessionsテーブルからセッションデータが削除される
  • timeoutIntervalよりsessionTimeoutIntervalを長く設定する事が前提
    • 現状の実装だと、同じ期間を設定するとデータ削除処理が先に実行されそう

Discussion