Postgres
Detailed information on the Postgres configuration store component
Component format
To set up an Postgres configuration store, create a component of type configuration.postgres
apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
name: <NAME>
spec:
type: configuration.postgres
version: v1
metadata:
- name: connectionString
value: "host=localhost user=postgres password=example port=5432 connect_timeout=10 database=config"
- name: table # name of the table which holds configuration information
value: "[your_configuration_table_name]"
- name: connMaxIdleTime # max timeout for connection
value : "15s"
Warning
The above example uses secrets as plain strings. It is recommended to use a secret store for the secrets as described here.
Spec metadata fields
Field | Required | Details | Example |
---|---|---|---|
connectionString | Y | The connection string for PostgreSQL. Default pool_max_conns = 5 | “host=localhost user=postgres password=example port=5432 connect_timeout=10 database=dapr_test pool_max_conns=10” |
table | Y | table name for configuration information. | configTable |
Set up Postgres as Configuration Store
- Start Postgres Database
- Connect to the Postgres database and setup a configuration table with following schema -
Field | Datatype | Nullable | Details |
---|---|---|---|
KEY | VARCHAR | N | Holds “Key” of the configuration attribute |
VALUE | VARCHAR | N | Holds Value of the configuration attribute |
VERSION | VARCHAR | N | Holds version of the configuration attribute |
METADATA | JSON | Y | Holds Metadata as JSON |
CREATE TABLE IF NOT EXISTS table_name (
KEY VARCHAR NOT NULL,
VALUE VARCHAR NOT NULL,
VERSION VARCHAR NOT NULL,
METADATA JSON );
- Create a TRIGGER on configuration table. An example function to create a TRIGGER is as follows -
CREATE OR REPLACE FUNCTION configuration_event() RETURNS TRIGGER AS $$
DECLARE
data json;
notification json;
BEGIN
IF (TG_OP = 'DELETE') THEN
data = row_to_json(OLD);
ELSE
data = row_to_json(NEW);
END IF;
notification = json_build_object(
'table',TG_TABLE_NAME,
'action', TG_OP,
'data', data);
PERFORM pg_notify('config',notification::text);
RETURN NULL;
END;
$$ LANGUAGE plpgsql;
- Create the trigger with data encapsulated in the field labelled as
data
notification = json_build_object(
'table',TG_TABLE_NAME,
'action', TG_OP,
'data', data);
- The channel mentioned as attribute to
pg_notify
should be used when subscribing for configuration notifications - Since this is a generic created trigger, map this trigger to
configuration table
CREATE TRIGGER config
AFTER INSERT OR UPDATE OR DELETE ON configTable
FOR EACH ROW EXECUTE PROCEDURE notify_event();
- In the subscribe request add an additional metadata field with key as
pgNotifyChannel
and value should be set to samechannel name
mentioned inpg_notify
. From the above example, it should be set toconfig
Note
When calling subscribe
API, metadata.pgNotifyChannel
should be used to specify the name of the channel to listen for notifications from Postgres configuration store.
Any number of keys can be added to a subscription request. Each subscription uses an exclusive database connection. It is strongly recommended to subscribe to multiple keys within a single subscription. This helps optimize the number of connections to the database.
Example of subscribe HTTP API -
curl --location --request GET 'http://<host>:<dapr-http-port>/configuration/postgres/subscribe?key=<keyname1>&key=<keyname2>&metadata.pgNotifyChannel=<channel name>'
Related links
Last modified September 28, 2022: postgres configuration store (#2800) (84402ba8)