基于用户的通知消息队列的Comet实现
我们正在尝试构建一个应用程序,想要使用Comet(AJAX推送)来向个别用户发送通知。大多数通知的超时时间都比较短。
因为我们正在使用RabbitMQ,所以通过AMQP发送消息是最简单的。我在想,如何才能方便地给每个用户发送消息,这样Comet服务器和队列服务器的工作都能轻松一些。
我查看了很多解决方案,包括使用Carrot配合Orbited、Tornado等。
如果Comet服务器为每个用户在队列中注册一个消费者,那么这些消费者要么需要设置超时,要么在每次使用后就被丢弃。这两种方案似乎都不太理想。我想在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可以派上用场的地方,但我对它没有经验。
在这种情况下,最好的方法是什么呢?