Комета для основанного на пользователе уведомления через очередь сообщений
Мы пытаемся создать приложение, которое должно использовать Comet (AJAX Push) для отправки уведомлений отдельным пользователям. У большинства уведомлений будет довольно низкий тайм-аут.
Поскольку мы работаем с RabbitMQ, было бы проще отправлять сообщения через AMQP. Мне интересно, как лучше обращаться с отдельными пользователями, чтобы и сервер Comet, и сервер очередей выполняли простую работу.
Я рассмотрел ряд решений, в том числе использование Carrot с Orbited, Tornado и многое другое.
Если комет-сервер регистрирует одного потребителя (с очередью) для каждого пользователя, то эти потребители должны либо иметь таймаут, либо выбрасываться после каждого использования. Ни одно из решений не кажется очень многообещающим. Я предполагаю, что что-то вроде этого было бы возможно в Торнадо / Морковь:
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, но у меня нет с этим опыта.
Какой будет лучший подход здесь?