基于用户的消息队列通知彗星

时间:2010-06-24 17:21:16

标签: python comet amqp tornado orbited

我们尝试构建应该使用Comet(AJAX Push)向个人用户发送通知的应用程序。大多数通知的超时时间都相当短。

当我们运行RabbitMQ时,最简单的方法是通过AMQP发送消息。我想知道解决个人用户的最佳方式是什么,以便Comet服务器和队列服务器都能轻松完成。

我已经研究了许多解决方案,包括使用 Carrot与轨道,龙卷风等等。

如果彗星服务器为每个用户注册一个消费者(带有队列),那么这些消费者要么必须保持超时,要么在每次使用后丢弃。两种解决方案似乎都没有前景。我想在龙卷风/胡萝卜中可以做到这样的事情:

class MainHandler(tornado.web.RequestHandler):
    @tornado.web.asynchronous
    def get(self):
        user_id = 123

        consumer = Consumer(connection=conn, queue="feed", exchange="feed", routing_key=user_id)
        consumer.register_callback(self.message_received)
        consumer.wait()

    def message_received(self, message_data, message):
        self.write(simplejson.dumps(message_data))
        message.ack()
        consumer.close()

        self.finish()

或者,彗星服务器只能有一个队列消费者,并且必须实现自己的轻量级消息队列,该队列可以缓存传入通知,直到用户连接并使用它们。这似乎是memcached可能有用的东西,但我没有经验。

这里最好的方法是什么?

1 个答案:

答案 0 :(得分:0)

我的用例几乎相同,最终以Socket.IO为客户端,TornadIO用于处理连接,RabbitMQ用于消息传递(通过pika)。效果很好,值得尝试。