I was trying to handle several subscribe channels with only one redis 
client using Mojo::Redis2, but it seems that I'm doing something wrong, I 
end up using as many clients as open subscribed channels I have.

Maybe somebody can take a look at this test code and let me know :

https://github.com/dmanto/test-redis-connections.git

Thanks in advance,

El martes, 5 de agosto de 2014 11:04:45 UTC-3, Jan Henning Thorsen escribió:
>
> I pushed an experimental release to CPAN now:
>
> https://metacpan.org/pod/Mojo::Redis2
>
> -Any- feedback is more than welcome.
>
> On Sunday, June 29, 2014 10:21:28 PM UTC+2, Daniel Mantovani wrote:
>>
>> Perfect then, thanks Jan
>>
>> El domingo, 29 de junio de 2014 03:50:09 UTC-3, Jan Henning Thorsen 
>> escribió:
>>>
>>> The on(message => $channel => ...) API is not going to be part of 
>>> Mojo::Redis2. It will just be on(message => sub { my ($self, $message, 
>>> $channel) = @_ }); The reason for that is to have a consistent API. (on() 
>>> is already defined in Mojo::EventEmitter)
>>>
>>> And yes, it will only have one connection to the Redis server pr. $redis 
>>> object, even though you do $redis->subscribe("channel:$_") for 1..10000;
>>>
>>> I'm planning to have one connection for the pubsub 
>>> <http://redis.io/commands#pubsub> commands, a new connection when you 
>>> call blpop, brpop, brpoplpush <http://redis.io/commands#list>, and one 
>>> connection for everything else. The reason for creating a new connection on 
>>> each blpop(), brpop(), brpoplpush <http://redis.io/commands#list>() is 
>>> that they are blocking on the server side.
>>>
>>>
>>> On Saturday, June 28, 2014 2:12:01 AM UTC+2, Daniel Mantovani wrote:
>>>>
>>>> Yes it absolutly matters, I need a different channel per connected 
>>>> websocket
>>>>
>>>> So if I understood correctly inside my websocket route I could write 
>>>> something like:
>>>>
>>>> my $applianceid = ... (some unique identifier for each appliance, I get 
>>>> it from a custom header)
>>>> my $redis = Mojo::Redis2->new;
>>>> $redis->on(message => "myapp:$applianceid", sub {
>>>>   my ($rself, $msg) = @_;
>>>>   .....
>>>>   do something with the received redis msg
>>>>   .....
>>>>   $tx->send($something); # use my transaction object to send some data 
>>>> to my connected appliance
>>>>
>>>>   etc
>>>>
>>>> });
>>>> ...
>>>>
>>>> and still use just one redis client despite I may have thousands of 
>>>> websocket clients connected and subscribed to different channels 
>>>> ("myapp:$applianceid")?
>>>>
>>>>  In this case I think the solution would be perfect, I don´t care using 
>>>> one extra redis client for publishing, that I guess I will be able to 
>>>> share 
>>>> among all websockets.
>>>>
>>>>  So at the end of the day I will be using just two redis clients per 
>>>> toad when running on hypnotoad... is that right or I missunderstood?
>>>>
>>>>
>>>> El viernes, 27 de junio de 2014 10:11:52 UTC-3, Jan Henning Thorsen 
>>>> escribió:
>>>>>
>>>>> I had some typos:
>>>>> I meant subscribing to "foo" and then "bar". (not sure if that matters 
>>>>> for the example though)
>>>>> Also the $old comments should be "now there is two connections to the 
>>>>> Redis database".
>>>>>
>>>>> On Friday, June 27, 2014 3:09:35 PM UTC+2, Jan Henning Thorsen wrote:
>>>>>>
>>>>>> Mojo::Redis2 can (or at least it will be able to) (p)subscribe 
>>>>>> multiple times, using just one connection. I will try to illustrate the 
>>>>>> difference to be sure I understand you: 
>>>>>>
>>>>>>   my $old = Mojo::Redis->new;
>>>>>>   my $s1 = $old->subscribe("foo");
>>>>>>   my $s2 = $old->subscribe("foo");
>>>>>>   # now you two connections to the Redis database
>>>>>>
>>>>>>   my $new = Mojo::Redis2->new;
>>>>>>   $new->subscribe("foo");
>>>>>>   $new->subscribe("foo");
>>>>>>   # still just one connection to the Redis database, since 
>>>>>> Mojo::Redis2 is re-using the same subscribe connection
>>>>>>
>>>>>> Unfortunatly, issuing (P)SUBSCRIBE will only allow "subscribe like" 
>>>>>> commands <http://redis.io/commands/subscribe>, which renders any 
>>>>>> Redis module unable to do PUBLISH and SUBSCRIBE over the same database 
>>>>>> connection. 
>>>>>>
>>>>>> On Friday, June 27, 2014 3:00:20 PM UTC+2, Daniel Mantovani wrote:
>>>>>>>
>>>>>>>   Hi Jan, I´ve using Mojo::Redis and find it very convenient as the 
>>>>>>> glue that allows to comunicate non-blocking among different processes 
>>>>>>> (toads) when running hypnotoad (using subscribe and publish, just as 
>>>>>>> the 
>>>>>>> "Websocket example" in the module's synopsis).
>>>>>>>
>>>>>>>  Something I would suggest for you to take a look is related to the 
>>>>>>> scalling of simultaneos redis clients needed for a realtime app. I 
>>>>>>> understand that you would need a dedicated "subscribe" client plus a 
>>>>>>> "publish" per connected websocket, if you follow the mencioned example.
>>>>>>>
>>>>>>>  That could be a problem depending on the nature of your app. In my 
>>>>>>> case I was working on an app that will have thousand of appliances with 
>>>>>>> very low traffic but allways on, so I ended up using Mojo ::Redis with 
>>>>>>> something like a psubscribe "app:*" client per toad, and just one 
>>>>>>> publishing client (probably blocking) also per toad (Anyway  I'm not 
>>>>>>> sure 
>>>>>>> how this solution will scale in the field, we will see in the 
>>>>>>> followings 
>>>>>>> months probably).
>>>>>>>
>>>>>>>   Hope you can add to Mojo::Redis2 some kind of support for a 
>>>>>>> solution that allows to share psubscribe redis connections among many 
>>>>>>> users 
>>>>>>> on a single process or toad.
>>>>>>>
>>>>>>> BR,
>>>>>>> Daniel
>>>>>>>
>>>>>>> El jueves, 26 de junio de 2014 09:24:00 UTC-3, Jan Henning Thorsen 
>>>>>>> escribió:
>>>>>>>>
>>>>>>>> Hi,
>>>>>>>>
>>>>>>>> I'm trying to make a new Redis driver for Mojolicious that makes 
>>>>>>>> sense. Me and Marcus Ramberg has been maintaining Mojo::Redis, but I 
>>>>>>>> see 
>>>>>>>> some issues with the API:
>>>>>>>>
>>>>>>>> * No blocking support
>>>>>>>> * Really poor error handling
>>>>>>>> * Trying to be clever with BLPOP and SUBSCRIBE, using an overloaded 
>>>>>>>> on() method
>>>>>>>> * Some really weird bugs that that I can't seem to figure out (Got 
>>>>>>>> one project at work which fail on random)
>>>>>>>> * Public methods that is confusing: connect(), connected(), 
>>>>>>>> disconnect() (?), protocol_redis() and timeout()
>>>>>>>>
>>>>>>>> So now I want to make a new version that Makes Sense (tm). The 
>>>>>>>> project is currently just a branch under the old mojo-redis repo: 
>>>>>>>> https://github.com/marcusramberg/mojo-redis/tree/v2
>>>>>>>>
>>>>>>>>
>>>>>>>> # What I need help with
>>>>>>>>
>>>>>>>> 1. Look if the API makes sense.
>>>>>>>> 2. Look at the code to see if it makes sense.
>>>>>>>> 3. Tell me when something is awkward or plain wrong.
>>>>>>>> 4. Figure out if ->execute() makes sense and/or if it could be 
>>>>>>>> replace with something "nicer"
>>>>>>>> I often do many commands at once, so what execute() fix is this:
>>>>>>>>
>>>>>>>>   Mojo::IOLoop->delay(
>>>>>>>>     sub {
>>>>>>>>       my ($delay) = @_;
>>>>>>>>       $redis->get(foo => $delay->begin);
>>>>>>>>       $redis->get(bar => $delay->begin);
>>>>>>>>       $redis->get(baz => $delay->begin);
>>>>>>>>     },
>>>>>>>>     sub {
>>>>>>>>       my ($delay, $foo_err, $foo, $bar_err, $bar, $baz_err, $baz) = 
>>>>>>>> @_;
>>>>>>>>       # ^ ONE MILLION ARGUMENTS!!
>>>>>>>>     },
>>>>>>>>   );
>>>>>>>>
>>>>>>>> 5. Does it make sense for one $redis object to have multiple 
>>>>>>>> connections to the database?
>>>>>>>> This is one of the things I built in to the new module: blpop(), 
>>>>>>>> subscribe(), ... will make a new connection to the database instead of 
>>>>>>>> user 
>>>>>>>> of the module need to remember which method is blocking or take over 
>>>>>>>> the 
>>>>>>>> connection. But does it really make sense?
>>>>>>>>
>>>>>>>> 6. I need a method for UNSUBSCRIBE
>>>>>>>> The module inherit from Mojo::EventEmitter, so I can't really use 
>>>>>>>> the unsubscribe() method to UNSUBSCRIBE from channels. Got an idea for 
>>>>>>>> an 
>>>>>>>> alternative way, or some fancy hack to make it work with 
>>>>>>>> unsubscribe()? 
>>>>>>>> I've been considering $redis->unsubscribe(message => $channel_name); 
>>>>>>>> but it 
>>>>>>>> kind of breaks the signature.
>>>>>>>>
>>>>>>>> 7. Do Mojo::Redis2 really need "encoding" attribute?
>>>>>>>> Why isn't this always UTF-8? I don't get the encoding attribute, 
>>>>>>>> but I kept it because of legacy from the other redis modules.
>>>>>>>>
>>>>>>>> 8. What do you think about pipelined()?
>>>>>>>> Please have a look at 
>>>>>>>> https://github.com/marcusramberg/mojo-redis/blob/v2/t/pipelined.t
>>>>>>>>
>>>>>>>> 9. ???
>>>>>>>>
>>>>>>>>
>>>>>>>> # What is done (might be redesigned though)
>>>>>>>>
>>>>>>>> * I got basic redis methods working blocking and non-blocking
>>>>>>>> * I got (p)subscribe methods working and (p)message events
>>>>>>>> * I got pipelining working.
>>>>>>>>
>>>>>>>

-- 
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 http://groups.google.com/group/mojolicious.
For more options, visit https://groups.google.com/d/optout.

Reply via email to