The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.

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 => 'bar');
  $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.

Note that this module is EXPERIMENTAL and might change without warning!

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.

listen

  my $cb = $pubsub->listen(foo => sub {...});

Subscribe to a channel, there is no limit on how many subscribers a channel can have.

  # 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 => 'bar');

Notify a channel.

unlisten

  $pubsub = $pubsub->unlisten(foo => $cb);

Unsubscribe from a channel.

SEE ALSO

Mojo::Pg, Mojolicious::Guides, http://mojolicio.us.