我们尝试构建应该使用 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 可能有用的东西,但我没有这方面的经验。
这里最好的方法是什么?