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.
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".
reset
$pubsub->reset;
Reset all subscriptions and the database connection. This is usually done after a new process has been forked, to prevent the child process from stealing notifications meant for the parent process.
unlisten
$pubsub = $pubsub->unlisten('foo');
$pubsub = $pubsub->unlisten(foo => $cb);
Unsubscribe from a channel.