基于用户的通知消息队列的Comet实现

1 投票
1 回答
723 浏览
提问于 2025-04-16 00:24

我们正在尝试构建一个应用程序,想要使用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可以派上用场的地方,但我对它没有经验。

在这种情况下,最好的方法是什么呢?

1 个回答

0

我遇到的情况几乎和这个一样,最后我选择了 Socket.IO 来处理客户端的部分,使用 TornadIO 来管理连接,还有 RabbitMQ 来传递消息(通过 pika)。这些组合效果很好,值得一试。

撰写回答