1

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

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

我研究了许多解决方案,包括将 Carrot与 Orbited、Tornado 等一起使用。

如果彗星服务器为每个用户注册一个消费者(使用队列),那么这些消费者要么必须保持超时,要么在每次使用后被丢弃。这两种解决方案似乎都不是很有希望。我想在 Tornado/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()

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

这里最好的方法是什么?

4

1 回答 1

0

我有几乎相同的用例,最终使用Socket.IO用于客户端,TornadIO用于处理连接,RabbitMQ 用于消息传递(通过pika)。效果不错,值得一试。

于 2011-11-17T21:49:50.713 回答