Daniel, as a simple explanation:

I have:

$ pstree -p $(</opt/WebServices/druid2/run/hypnotoad.pid)
/opt/WebService(7038)─┬─/opt/WebService(7039)
                      ├─/opt/WebService(7040)
                      ├─/opt/WebService(7041)
                      ├─/opt/WebService(7042)
                      ├─/opt/WebService(7043)
                      ├─/opt/WebService(7044)
                      ├─/opt/WebService(7045)
                      ├─/opt/WebService(7046)
                      ├─/opt/WebService(7047)
                      ├─/opt/WebService(7048)
                      ├─/opt/WebService(7049)
                      ├─/opt/WebService(7050)
                      ├─/opt/WebService(7051)
                      ├─/opt/WebService(7052)
                      ├─/opt/WebService(7053)
                      └─/opt/WebService(7054)

I need to subscribe to update notification records from Redis and update
cache - only in process #7038
Workers #7040..7054 must be used only to read cache and send replies to
users in a predictable time.
In my opinion, workers must not be involved in any heavy processing,
because its area of responsibility is user requests - it must reply as soon
as it possible minimizing resources needed to assemble responses.

2017-04-18 3:14 GMT+03:00 Daniel Mantovani <[email protected]>:

> Hi,
>
> I am not sure I fully understand your question, but if you already have
> Redis and you want that only one spawned process receives an event, and
> that on next event next spawned process do the same, you could use queue
> commands from Redis for that (instead of PUB/SUB that would be addressed to
> all childs that are listening to the published key).
>
> So your "publisher" should send events to a queue using for instance,
> RPUSH somelist someevent, and your mojo app should be listening with BLPOP
> somelist 0 (0 means indefinitelly).
>
> For the listening inside your Mojo app, you should take a look on
> Mojo::Redis2.
>
> Just as an example, you could do something like:
>
> use Mojolicious::Lite;
> use Mojo::Redis2;
>
> helper redis => sub { shift->stash->{redis} ||= Mojo::Redis2->new; };
>
> Mojo::IOLoop->next_tick(sub {
> my $c = app->build_controller;
> my $element_get;
> $element_get = sub {
> $c->redis->blpop('myqueue', 0, sub {
> my ($self, $err, $res) = @_;
> $c->app->log->info("Worker $$ received an event from $res->[0]:
> $res->[1]");
> $element_get->(); # get next element from 'myqueue'
> });
> };
> $c->app->log->info("Worker $$ started");
> $element_get->();
> });
>
> get '/' => {text => 'Hello Word!!!'};
>
> app->start;
>
> That way, you will not block the ioloop, and only one child will take next
> event.
> The child that gets the event should rotate just because it is the way
> Redis queues work.
> As stated in the cookbook, you can use "next_tick" to run code whenever a
> new process is spawned.
>
> You can check this code running it with hypnotoad and opening on another
> terminal a redis-cli instance and sending strings to the 'myqueue' list,
> like:
>
> > rpush myqueue whatever "whatever 2" "whatever 3" "whatever 4" "whatever
> 5"
>
> Hope this helps,
>
>
> El jueves, 13 de abril de 2017, 10:46:24 (UTC-3), Ганц Аккерман escribió:
>>
>> Hello!
>>
>> In my hypnotoad application i want to update cache (Cache::FastMmap) on
>> some event, which fired by Redis subscription.
>> But now i have to subscribe on Redis events and update local perl hash in
>> every spawned process, which at the same time serve users requests.
>> How to use only one process to support actualized cache state, so all
>> workers can read information from that cache, but not update it?
>>
>> I think, i need to subscribe on Redis events and maintain cache in the
>> main process, but Mojolicious Cookbook tell me that is impossible (IOLoop
>> not running in the main process).
>> I think Minion is not suitable for me because we use only Redis+MariaDB
>> in our production environments and i cant install PostgreSQL for Minion.
>> So i m in doubt, how to operate cache in traditional way (one auxiliary
>> updater process - many frontend processes-readers).
>>
>> Tell me please, whether is it possible in Mojolicious application running
>> on Mojolicious::Server::Prefork/hypnotoad?
>>
>> Thank you!
>>
> --
> You received this message because you are subscribed to a topic in the
> Google Groups "Mojolicious" group.
> To unsubscribe from this topic, visit https://groups.google.com/d/
> topic/mojolicious/djY6qVG1sTo/unsubscribe.
> To unsubscribe from this group and all its topics, send an email to
> [email protected].
> To post to this group, send email to [email protected].
> Visit this group at https://groups.google.com/group/mojolicious.
> For more options, visit https://groups.google.com/d/optout.
>

-- 
You received this message because you are subscribed to the Google Groups 
"Mojolicious" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/mojolicious.
For more options, visit https://groups.google.com/d/optout.

Reply via email to