leporo / tornado-redis

Asynchronous Redis client that works within Tornado IO loop.
666 stars 162 forks source link

guarantee messages order #106

Open akoidan opened 6 years ago

akoidan commented 6 years ago

I have a stackoverflow question here.

Is it possible to consume redis messages within same order as they were published? E.g. see code below:

def __init__(self):
    self.async_redis_publisher = tornadoredis.Client(port=TORNADO_REDIS_PORT)
    self.async_redis = tornadoredis.Client(port=TORNADO_REDIS_PORT)

@engine
def listen(self, channels):
    yield Task(self.async_redis.subscribe, channels)
    self.async_redis.listen(self.pub_sub_message)

def pub_sub_message(self, message):
    print(current_time, message)

# code below represents 2 different *web socket messages* within same thread and same insntance of class
def on_ws_message(self): 
   self.async_redis_publisher.publish('1', 'message1') # also prints time to be sure about order
   # some timeout or e.g. another request 
   self.async_redis_publisher.publish('1', 'message2') # also prints time to be sure about order

redis-cli: monitor:

 1514312168.031272 [0 127.0.0.1:53314] "PUBLISH" "1" "message2"
 1514312168.035996 [0 127.0.0.1:53314] "PUBLISH" "1" "message1"