[SP-pm] Jobs

Alceu Rodrigues de Freitas Junior glasswalk3r at yahoo.com.br
Thu Sep 19 13:05:33 PDT 2013


Acho que vale mais a pena perder um tempo (se houver disponível) um 
gerenciador de fila que nem o RabbitMQ ou X (sendo X o que você achar 
mais bonito) e usar publisher/subscriber para não ter que haver pooling, 
sem contar que o sistema deve garantir a entrega de mensagens e outras 
cositas mais.

[]'s
Alceu

Em 19-09-2013 16:57, Tiago Peczenyj escreveu:
> uma coisa q eu fazia na globo era
>
> preciso fazer X, então crio um arquivo X no diretorio "incoming"
>
> tenho um processo q ficam fazendo pooling no diretorio incoming. chegou
> algo? move pra workdir e trabalha nele. terminou? manda pro outdir.
>
> pra ter mais de um processo, basta ter mais de um workdir com alguma
> coisa diferenciando (vc cria processos P1 .. P4, workdir/P1 .. workdir/P4)
>
> fora outras milhares de coisa. meh. puta trabalho.
>
>
> 2013/9/19 Gabriel Andrade <gabiruh at gmail.com <mailto:gabiruh at gmail.com>>
>
>
>     On Sep 19, 2013, at 3:41 PM, Renato Santos <renato.cron at gmail.com
>     <mailto:renato.cron at gmail.com>> wrote:
>      > $cliente_redis->rpush( $nome_da_fila => "json ou alguma coisa
>     assim contendo o id/caminho da imagem" );
>      >
>      >
>      > e ai, em um 'worker' você teria o código assim:
>      >
>      > while (my $item_da_fila = get_item  ){
>      >  ...
>      > }
>      >
>      >
>      > sub get_item {
>      >
>      >    my ( $list, $item )  = $cliente_redis->blpop( $nome_da_fila, 0 );
>      >
>      >    if (defined $item) {
>      >          return decode_json $item
>      >     }else{
>      >         # timeout, mas como ta 0, nunca devieria entrar aqui!
>      >     }
>      > }
>      >
>      >
>      > Ai você ainda pode ter, por exemplo, 10 workers, ou 100, etc..
>      >
>      >
>
>     Utilizando uma abordagem parecida com a que o Cron sugeriu, eu
>     costumo já encapsular todas
>     as ações específicas de uma tarefa em um objeto serializado em JSON
>     utilizando
>     o MooseX::Storage.
>
>     O processo que consome a fila de-serializa o objeto e executa um
>     método ->run(), por exemplo,
>     que já sabe o que deve fazer.
>
>     ---
>
>     package Role::Job;
>
>     use Moose::Role
>     use MooseX::Storage;
>     with Storage( format => [ JSONpm => { json_opts => { utf8 => 1 } } ] );
>
>     requires 'run';
>
>
>     package Job::Foo;
>
>     use Moose;
>     with 'Role::Job';
>
>     has quux;
>     has bar;
>
>     sub run {
>        my ($self, %args) = @_;
>        (...)
>     }
>
>     package Job;
>
>     use Moose;
>
>     use MooseX::Types::LoadableClass qw(LoadableClass);
>     use JSON qw(decode_json);
>
>     has queue;
>     has logger;
>     has db;
>
>     sub collect {
>        my $self = shift;
>        while(my $msg = $self->queue->recv){
>          my $data       = decode_json($msg);
>          my $class_name = $data->{__CLASS__} or next;
>          my $job_class      = to_LoadableClass( $data->{__CLASS__} );
>
>          next unless $job_class;
>
>          my $job = $jog_class->thaw($json_msg);
>
>          $job->run( queue => $self->queue, db => $self->db, logger =>
>     $self->logger );
>        }
>     }
>
>
>     Aí, então é só fazer depois:
>
>        $queue->publish(fila_de_jobs => Job::Foo->new(bar => 2, quux =>
>     'yomoma')->freeze);
>
>     E em outro script:
>
>         use Worker;
>
>         Worker->new(db => $db, queue => $queue, logger => $logger)->collect;
>
>     =begin disclaimer
>         Sao Paulo Perl Mongers: http://sao-paulo.pm.org/
>       SaoPaulo-pm mailing list: SaoPaulo-pm at pm.org
>     <mailto:SaoPaulo-pm at pm.org>
>       L<http://mail.pm.org/mailman/listinfo/saopaulo-pm>
>     =end disclaimer
>
>
>
>
> --
> Tiago B. Peczenyj
> Linux User #405772
>
> http://about.me/peczenyj
>
>
> =begin disclaimer
>     Sao Paulo Perl Mongers: http://sao-paulo.pm.org/
>   SaoPaulo-pm mailing list: SaoPaulo-pm at pm.org
>   L<http://mail.pm.org/mailman/listinfo/saopaulo-pm>
> =end disclaimer
>



More information about the SaoPaulo-pm mailing list