锁存储¶
Rasa 使用一种票据锁机制来确保以正确的顺序处理给定对话 ID 的传入消息,并在主动处理消息时锁定对话。这意味着多个 Rasa 服务器可以作为复制服务并行运行,并且客户端在发送给定对话 ID 的消息时不一定需要寻址同一个节点。
InMemoryLockStore(默认)¶
描述¶
InMemoryLockStore
是默认的锁存储。它在单个进程中维护对话锁。
注意
当多个 Rasa 服务器并行运行时,不应该使用此锁存储。
配置¶
要使用 InMemoryLockStore
不需要任何配置。
ConcurrentRedisLockStore¶
ConcurrentRedisLockStore
是一个新的锁存储,它使用 Redis 作为持久层,可以安全地与多个 Rasa 服务器副本一起使用。参阅迁移部分来了解如何切换到此锁存储。
描述¶
ConcurrentRedisLockStore
使用 Redis 作为已发放票据实例和最后发放票据号的持久层。
票据号从 1 开始,而 RedisLockStore
的初始化从 0 开始,如果票据过期,票据号将不会重新分配给未来的票据。因此,票据号对于票据实例是唯一的。票据号使用 Redis 原子事务 INCR 在持久的最后发放票据号上递增。
ConcurrentRedisLockStore
确保只有一个 Rasa 实例可以在任何时间点处理对话。因此,LockStore
的这个 Redis 实现可以处理不同 Rasa 服务器作为同一会话并行接收的消息。这是运行一组 Rasa 服务器副本的推荐锁存储。
配置¶
要使用 Redis 设置 Rasa,需要执行如下步骤:
- 启动 Redis 实例。
-
将所需的配置添加到
endpoints.yml
:lock_store: type: rasa_plus.components.concurrent_lock_store.ConcurrentRedisLockStore host: <host of the redis instance, e.g. localhost> port: <port of your redis instance, usually 6379> password: <password used for authentication> db: <number of your database within redis, e.g. 0> key_prefix: <alphanumeric value to prepend to lock store keys>
-
要使用 Redis 后端启动 Rasa Core 服务器,请添加
--endpoints
标识,例如:
参数¶
url
(默认:localhost
):Redis 实例 URL。port
(默认:6379
):Redis 运行的端口。db
(默认:1
):Redis 数据库的数量。key_prefix
(默认:None
):锁存储键的前缀。必须是字母数字。password
(默认:None
):用于认证的密码(None
表示不认证)。use_ssl
(默认:False
):通信是否加密。socket_timeout
(默认:10
):超过此时间秒数 Redis 没有响应则引发错误。
迁移指南¶
要从 RedisLockStore
切换到 ConcurrentRedisLockStore
,请在 endpoints.yml
中指定 type
为 ConcurrentRedisLockStore
类的完整模块路径:
lock_store:
type: rasa_plus.components.concurrent_lock_store.ConcurrentRedisLockStore
host: <host of the redis instance, e.g. localhost>
port: <port of your redis instance, usually 6379>
password: <password used for authentication>
db: <number of your database within redis, e.g. 0>
key_prefix: <alphanumeric value to prepend to lock store keys>
你必须将 Redis 锁存储配置中的 url
字段替换为包含 Redis 实例的主机名的 host
字段。
切换到 ConcurrentRedisLockStore
时无需进行数据库迁移。可以使用与之前使用 RedisLockStore
时相同的 Redis 实例和数据库编号。如果使用相同的 Redis 数据库编号,你可能希望删除所有预先存在的键。ConcurrentRedisLockStore
不再需要这些以前的键值项,可以清除数据库。
使用 RedisLockStore
和 ConcurrentRedisLockStore
时存储的键值项没有重叠,因为 RedisLockStore
保留序列化的 TicketLock
实例,而 ConcurrentRedisLockStore
存储单个 Ticket
实例以及最后发出的票据号。ConcurrentRedisLockStore
从持久的 Ticket
实例重新创建 TicketLock
,这允许它处理相同会话 ID 的并发消息。
RedisLockStore¶
描述¶
RedisLockStore
使用 Redis 作为持久层来维护对话锁。这是运行一组 Rasa 服务器副本的推荐锁存储。
配置¶
要使用 Redis 设置 Rasa,需要执行如下步骤:
- 启动 Redis 实例。
-
将所需的配置添加到
endpoints.yml
中: -
要使用 Redis 后端启动 Rasa Core 服务器,请添加
--endpoints
标识,例如:
参数¶
url
(默认:localhost
):Redis 实例 URL。port
(默认:6379
):Redis 运行的端口。db
(默认:1
):Redis 数据库的数量。key_prefix
(默认:None
):锁存储键的前缀。必须是字母数字。username
(默认:None
):用于认证的用户名(None
表示不认证)。password
(默认:None
):用于认证的密码(None
表示不认证)。use_ssl
(默认:False
):通信是否加密。ssl_keyfile
(默认:None
):SSL 私钥路径。ssl_certfile
(默认:None
):SSL 证书路径。ssl_ca_certs
(默认:None
):PEM 格式的串联 CA 证书文件的路径。socket_timeout
(默认:10
):超过此时间秒数 Redis 没有响应则引发错误。
自定义锁存储¶
如果你需要一个无法开箱即用的锁存储,可以实现一个自定义的。通过扩展基类 LockStore
可以完成。
自定义锁存储类必须实现如下基类方法:
get_lock
:从存储中获取conversation_id
的锁,需要conversation_id
文本参数并返回TicketLock
实例。(源代码)save_lock
:提交锁对象到存储,需要类型为TicketLock
的lock
参数并返回None
。(源代码)delete_lock
:从存储中删除conversation_id
的锁,需要conversation_id
文本参数并返回None
。(源代码)
配置¶
将自定义锁存储的模块路径和所需的参数写入 endpoints.yml
中: