Postgres Storage

The database schema for the Postgres SQL Stream Store driver consists of two tables, a custom data type, and multiple functions.

Database Schema Initialization

Database initialization can be accomplished in one of two ways: from the library itself or manually.

Initializing the database via the library is relatively straight forward:

var settings = new PostgresStreamStoreSettings("Host=localhost;Port=5432;User Id=postgres;Database=yourdatabase");

using (var streamStore = new PostgresStreamStore(settings))
{
  await streamStore.CreateSchemaIfNotExists();
}

This will create the Postgres SQL Stream Store database objects under the schema public.

The other way is to manually run each of the scripts found here - starting with Tables.sql and excluding DropAll.sql. Be careful to replace the string __schema__ in each of the sql scripts with your schema (defaults to public).

Settings

Constructor

Takes a connection string.

CreateStreamNotifier

Allows overriding of the stream store notifier.

Schema

The schema SQL Stream Store should place database objects into. Defaults to public.

ExplainAnalyze

Loads the auto_explain module and turns it on for all queries. Useful for index tuning. Defaults to false;

GetUtcNow

A delegate to return the current UTC now. Used in testing to control timestamps and time related operations. If not set, the database server will control the timestamp.

LogName

The log name used for any of the log messages.

ScavengeAsynchronously

Allows setting whether or not deleting expired (i.e., older than maxCount) messages happens in the same database transaction as append to stream or not.

This does not effect scavenging when setting a stream's metadata - it is always run in the same transaction.

ConnectionFactory

Allows overriding the way a NpgsqlConnection is created, given a connection string.

The default implementation simply passes the connection string into the NpgsqlConnection constructor.

DisableDeletionTracking

Disables stream and message deletion tracking. Will increase performance, however subscribers won't know if a stream or a message has been deleted. This can be modified at runtime.

Notes

Scaling

In order to scale properly, we recommend that you put a connection pooling solution in front, e.g. pgbouncer.