NAME
Mojo::Pg::PubSub - Publish/Subscribe
SYNOPSIS
use Mojo::Pg::PubSub;
my $pubsub = Mojo::Pg::PubSub->new(pg => $pg);
my $cb = $pubsub->listen(foo => sub {
my ($pubsub, $payload) = @_;
say "Received: $payload";
});
$pubsub->notify(foo => 'I ♥ Mojolicious!');
$pubsub->unlisten(foo => $cb);
DESCRIPTION
Mojo::Pg::PubSub is a scalable implementation of the publish/subscribe pattern used by Mojo::Pg. It is based on PostgreSQL notifications and allows many consumers to share the same database connection, to avoid many common scalability problems.
All subscriptions will be reset automatically and the database connection re-established if a new process has been forked, this allows multiple processes to share the same Mojo::Pg::PubSub object safely.
EVENTS
Mojo::Pg::PubSub inherits all events from Mojo::EventEmitter and can emit the following new ones.
reconnect
$pubsub->on(reconnect => sub {
my ($pubsub, $db) = @_;
...
});
Emitted after switching to a new database connection for sending and receiving notifications.
ATTRIBUTES
Mojo::Pg::PubSub implements the following attributes.
pg
my $pg = $pubsub->pg;
$pubsub = $pubsub->pg(Mojo::Pg->new);
Mojo::Pg object this publish/subscribe container belongs to.
METHODS
Mojo::Pg::PubSub inherits all methods from Mojo::EventEmitter and implements the following new ones.
json
$pubsub = $pubsub->json('foo');
Activate automatic JSON encoding and decoding with "to_json" in Mojo::JSON and "from_json" in Mojo::JSON for a channel.
# Send and receive data structures
$pubsub->json('foo')->listen(foo => sub {
my ($pubsub, $payload) = @_;
say $payload->{bar};
});
$pubsub->notify(foo => {bar => 'I ♥ Mojolicious!'});
listen
my $cb = $pubsub->listen(foo => sub {...});
Subscribe to a channel, there is no limit on how many subscribers a channel can have. Automatic decoding of JSON text to Perl values can be activated with "json".
# Subscribe to the same channel twice
$pubsub->listen(foo => sub {
my ($pubsub, $payload) = @_;
say "One: $payload";
});
$pubsub->listen(foo => sub {
my ($pubsub, $payload) = @_;
say "Two: $payload";
});
notify
$pubsub = $pubsub->notify('foo');
$pubsub = $pubsub->notify(foo => 'I ♥ Mojolicious!');
$pubsub = $pubsub->notify(foo => {bar => 'baz'});
Notify a channel. Automatic encoding of Perl values to JSON text can be activated with "json".
unlisten
$pubsub = $pubsub->unlisten('foo');
$pubsub = $pubsub->unlisten(foo => $cb);
Unsubscribe from a channel.