Комета для основанного на пользователе уведомления через очередь сообщений

Мы пытаемся создать приложение, которое должно использовать 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, но у меня нет с этим опыта.

Какой будет лучший подход здесь?

1 ответ

У меня был почти такой же вариант использования, и в итоге я получил Socket.IO для клиентской стороны, TornadIO для обработки соединений и RabbitMQ для передачи сообщений (через pika). Работает довольно хорошо, стоит попробовать.

Другие вопросы по тегам