/
LoadBalancer.pm
87 lines (56 loc) · 1.63 KB
/
LoadBalancer.pm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
package Plack::Middleware::Proxy::LoadBalancer;
use strict;
use warnings;
use parent 'Plack::Middleware';
use Plack::Util::Accessor qw/backends/;
our $VERSION = '0.01';
sub select_backend {
my $self = shift;
if ( ref $self->backends eq 'ARRAY' ) {
return $self->backends->[ int( rand( @{ $self->backends } ) ) ];
}
elsif ( ref $self->backends eq 'HASH' ) {
return (
sort { $b->{value} <=> $a->{value} }
map { { value => rand() * $self->backends->{$_}, host => $_ }; }
keys %{ $self->backends }
)[0]->{host};
}
else {
return $self->backends;
}
}
sub call {
my ( $self, $env ) = @_;
my $url = $self->select_backend();
$env->{'plack.proxy.remote'} = $self->select_backend;
$self->app->($env);
}
1;
__END__
=head1 NAME
Plack::Middleware::Proxy::LoadBalancer - Simple load balancer
=head1 SYNOPSIS
use Plack::Builder;
use Plack::App::Proxy;
builder {
enable "Proxy::LoadBalancer", backends => ['10.0.0.1:8080', '10.0.0.1:8081'];
Plack::App::Proxy->new()->to_app;
};
=head1 DESCRIPTION
Plack::Middleware::Proxy::LoadBalancer allow you to define several backends.
=head1 OPTIONS
=over 4
=item backends
enable "Proxy::LoadBalancer", backends => '10.0.0.1:8080';
Or
enable "Proxy::LoadBalancer", backends => ['10.0.0.1:8080', '10.0.0.1:8081'];
Or
enable "Proxy::LoadBalancer", backends => {'10.0.0.1:8080' => 0.4, '10.0.0.1:8081' => 0.5, '10.0.0.1:8002' => 0.3};
More than one backend can be defined. Weight can be given to backends.
=back
=head1 AUTHOR
Franck Cuny
=head1 SEE ALSO
L<Plack::App::Proxy>
=cut