socketry / async-redis

MIT License
83 stars 18 forks source link

Wrong subscriptions order in the example leads to wrong results #19

Closed woto closed 5 years ago

woto commented 5 years ago

Hi, just trying to learn to use a library and stucked with a demo example :)

https://github.com/socketry/async-redis#subscriptions When i'm running it, it's freezes like this:

➜  smart git:(B2C-1494) ✗ redis-cli monitor
OK
1561471201.438949 [0 127.0.0.1:49812] "PUBLISH" "status.frontend" "good"
1561471201.439013 [0 127.0.0.1:49810] "SUBSCRIBE" "status.frontend"

Any help appreciate :), thanks.

ioquatix commented 5 years ago

The problem is due to synchronisation.

To keep the example simple, it's written like this.

But obviously subscribing and publishing to the same channel has a race condition. Even in real systems.

A simple fix is probably just to add a time delay:

require 'async/redis'
require 'json'

endpoint = Async::Redis.local_endpoint
client = Async::Redis::Client.new(endpoint)
subscribed = Async::Condition.new

Async.run do |task|
    subscriber = task.async do
        client.subscribe 'status.frontend' do |context|
            type, name, message = context.listen

            pp type, name, message
        end
    end

    task.sleep(5)

    publisher = task.async do
        client.publish 'status.frontend', 'good'
    end
ensure
    client.close
end
woto commented 5 years ago

Hi, thank you for reply. Oh, but i need to be sure that i will not push message to redis until i will not be subscribed. In redis-rb I was able to do it like this:

redis.subscribe_with_timeout(5, "news") do |on|
  on.message do |channel, message|
    redis.unsubscribe if message == "exit"
  end
  on.subscribe do |channel, subscriptions|
    ActionCable.server.broadcast "channel", 'exit'

  end
end

https://github.com/redis/redis-rb/blob/master/examples/pubsub.rb

Is there a possibility to make it?

ioquatix commented 5 years ago

Yes, I updated the example.

woto commented 5 years ago

Great, will try it today. Thank you for all your work!

ioquatix commented 5 years ago

Awesome! If you are using this in a commercial project, please consider sponsoring the project!