Lock Stores

You are viewing documentation for our open source project which is maintained by the community. If you want to get started building assistants with Rasa please check out our latest documentation here.

Rasa uses a ticket lock mechanism to ensure that incoming messages for a given conversation ID are processed in the right order, and locks conversations while messages are actively processed. This means multiple Rasa servers can be run in parallel as replicated services, and clients do not necessarily need to address the same node when sending messages for a given conversation ID.

InMemoryLockStore (default)

This lock store should not be used when multiple Rasa servers are run parallel.

ConcurrentRedisLockStore

Rasa Pro Only

Rasa Pro License

You'll need a license to get started with Rasa Pro. Get it here

ConcurrentRedisLockStore is a new lock store that uses Redis as a persistence layer and is safe for use with multiple Rasa server replicas.
See the migration section to learn how to switch to this lock store.

Description

The ConcurrentRedisLockStore uses Redis as a persistence layer for instances of issued tickets and the last issued ticket number.

The ticket number initialization begins at 1, in contrast to that of theRedisLockStore which begins at 0.
If the ticket expires, the ticket number will not be reassigned to future tickets; as a result ticket numbers are unique to ticket instances. Ticket numbers are incremented using the Redis atomic transaction INCR on the persisted last issued ticket number.

The ConcurrentRedisLockStore ensures that only one Rasa instance can handle a conversation at any point in time.
Therefore, this Redis implementation of the LockStore can handle messages received in parallel for the same conversation by different Rasa servers.
This is the recommended lock store for running a replicated set of Rasa servers.

Configuration

To set up Rasa with Redis the following steps are required:

  1. Start your Redis instance
  2. Add required configuration to your 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>
  1. To start the Rasa Core server using your Redis backend, add the --endpoints flag, e.g.:
rasa run -m models --endpoints endpoints.yml

Parameters

Migration Guide

To switch from the RedisLockStore to the ConcurrentRedisLockStore, specify the complete module path to the ConcurrentRedisLockStore class as type in 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>

You must replace the url field in the redis lock store configuration with a field host containing the hostname of the redis instance. No database migration is required when switching to the ConcurrentRedisLockStore. You can use the same Redis instance and database number as you did previously when using the RedisLockStore.
You may want to delete all the preexisting keys if using the same Redis database number. These former key-value items are no longer required by the ConcurrentRedisLockStore and the database can be cleared.

There is no overlap in key-value items stored when using the RedisLockStore and the ConcurrentRedisLockStore, because the RedisLockStore persists serialized TicketLock instances while the ConcurrentRedisLockStore instead stores individual Ticket instances, as well as the last issued ticket number.
The ConcurrentRedisLockStore recreates the TicketLock from the persisted Ticket instances, which allows it to handle concurrent messages for the same conversation ID.

RedisLockStore

  1. Start your Redis instance
  2. Add required configuration to your endpoints.yml
lock_store:
  type: "redis"
  url: <url 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>
  1. To start the Rasa Core server using your Redis backend, add the --endpoints flag, e.g.:
rasa run -m models --endpoints endpoints.yml

Custom Lock Store

If you need a lock store which is not available out of the box, you can implement your own. This is done by extending the base class LockStore.

Your custom lock store class must also implement the following methods:

Configuration

Put the module path to your custom event broker and the parameters you require in your endpoints.yml:

lock_store:
  type: path.to.your.module.Class
  url: localhost
  a_parameter: a value
  another_parameter: another value