Комета для пользовательских уведомлений через очередь сообщений - PullRequest
1 голос
/ 24 июня 2010

Мы пытаемся создать приложение, которое должно использовать Comet (AJAX Push) для отправки уведомлений отдельным пользователям.У большинства уведомлений будет довольно низкий тайм-аут.

Поскольку мы работаем с RabbitMQ, было бы проще отправлять сообщения через AMQP.Мне интересно, как лучше всего обращаться с отдельными пользователями, чтобы и сервер 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()

В качестве альтернативы, у сервера комет может быть только один потребитель для очереди, и он должен реализовать собственную легкую очередь сообщений, которая может кэшировать входящие уведомления допользователь подключается и использует их.Это похоже на то, что memcached может быть полезен, но у меня нет опыта с этим.

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

1 Ответ

0 голосов
/ 18 ноября 2011

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

...