Multiprocess deployments

Problem

The simple usage shown in the Quickstart works fine when your deployed application uses a single process (i.e., a single app instance). However, chances are you are using something like uWSGI, and your application is served using several processes/workers.

If this is the case, when one of the workers (app instances) updates its configuration values, the rest of the workers will still have their old configuration values. If these old values are then updated, your application workers will have inconsistent configuration variables all the way.

Solution (kind of)

In version 0.2.0, Flask-WaffleConf introduced support for multprocess deployments by allowing these processes to listen for and send updates through a Redis channel.

Version 0.3.0 introduced a simpler approach by using stat information from a plain file in the filesystem.

The mode to use can be configured setting the value of the WAFFLE_WATCHTYPE variable (see Configuration).

Note

As both approaches use threads, the GIL should be taken into account, although it should not be much of an issue performance-wise.

Note

Application servers (such as uWSGI) may require additional configuration to enable threads in hosted applications. For uWSGI, for instance, the --enable-threads and --lazy-apps flags are needed.

Setup for multiprocess deployments

Changed in version 0.3.0: gevent support was removed as the implementation was not correct.

File watching

Using a file is the simplest approach for notifications and does not require any additional dependencies. Simply set WAFFLE_WATCHTYPE to 'file' and change the WAFFLE_WATCHER_FILE to a valid filesystem path. If it does not exist, it will be created automatically.

Added in version 0.3.0.

Redis pub/sub

Using Redis for notifications requires a valid connection to a Redis server (usually in localhost), as well as the redis-py module. Local installation in Debian systes would be done like this:

apt-get install redis-server

pip install redis

Next, it is necessary to set additional configuration variables in the configuration of the application:

# Enable multiprocess use
WAFFLE_MULTIPROC = True

# Redis host (defaults to 'localhost')
WAFFLE_REDIS_HOST = 'MY_HOST'

# Redis port (defaults to 6379)
WAFFLE_REDIS_PORT = 6379

# The channel to listen and send signals to (defaults to 'waffleconf')
WAFFLE_REDIS_CHANNEL = 'MY_CHANNEL'

Once the extension is initialized, the listener will be automatically created.

Note

Configuring the extension to use Redis without the redis-py module installed will fallback to the default file watcher configuration.