6f786d307e2ab0e589afeee8f4834d1474010dbc
[dbsrgits/DBIx-Class.git] / lib / DBIx / Class / Storage / DBI / Replicated / Balancer / Random.pm
1 package DBIx::Class::Storage::DBI::Replicated::Balancer::Random;
2
3 use Moose;
4 with 'DBIx::Class::Storage::DBI::Replicated::Balancer';
5
6 =head1 NAME
7
8 DBIx::Class::Storage::DBI::Replicated::Balancer::Random - A 'random' Balancer
9
10 =head1 SYNOPSIS
11
12 This class is used internally by L<DBIx::Class::Storage::DBI::Replicated>.  You
13 shouldn't need to create instances of this class.
14     
15 =head1 DESCRIPTION
16
17 Given a pool (L<DBIx::Class::Storage::DBI::Replicated::Pool>) of replicated
18 database's (L<DBIx::Class::Storage::DBI::Replicated::Replicant>), defines a
19 method by which query load can be spread out across each replicant in the pool.
20
21 This Balancer uses L<List::Util> keyword 'shuffle' to randomly pick an active
22 replicant from the associated pool.  This may or may not be random enough for
23 you, patches welcome.
24
25 =head1 ATTRIBUTES
26
27 This class defines the following attributes.
28
29 =head1 METHODS
30
31 This class defines the following methods.
32
33 =head2 next_storage
34
35 Returns an active replicant at random.  Please note that due to the nature of
36 the word 'random' this means it's possible for a particular active replicant to
37 be requested several times in a row.
38
39 =cut
40
41 sub next_storage {
42   my $self = shift @_;
43   my @active_replicants = $self->pool->active_replicants;
44   my $count_active_replicants = $#active_replicants +1;
45   my $random_replicant = int(rand($count_active_replicants));
46   
47   return $active_replicants[$random_replicant];
48 }
49
50 =head1 AUTHOR
51
52 John Napiorkowski <john.napiorkowski@takkle.com>
53
54 =head1 LICENSE
55
56 You may distribute this code under the same terms as Perl itself.
57
58 =cut
59
60 __PACKAGE__->meta->make_immutable;
61
62 1;