Нужна помощь в понимании кометы в Python (с Джанго) - PullRequest
29 голосов
/ 10 апреля 2011

Потратив на это два полных дня, я все еще не могу понять все варианты и конфигурации Comet в Python.Я прочитал все ответы здесь, а также все сообщения в блоге, которые я мог найти.Мне кажется, что сейчас у меня начинается кровотечение, поэтому я приношу извинения за то, что что-то не так с этим вопросом.

Я совершенно новичок во всем этом, все, что я делал раньше, было простосайты реального времени с бэкэндом PHP / Django на Apache.

Моя цель - создать приложение для чата в реальном времени;надеюсь, привязанный к Django для пользователей, аутентификации, шаблонов и т. д.

Каждый раз, когда я читаю об инструменте, он говорит, что мне нужен другой инструмент поверх него, он ощущается как бесконечныйchain.

Прежде всего, кто-нибудь может классифицировать все инструменты, необходимые для этой работы?
Я читал о различных серверах, сетевых библиотеках, движках, скриптах Java для клиентской стороны, и я незнать что еще.Я никогда не предполагал, что это будет такой комплекс.

Twisted / Twisted Web кажется популярным, но я не имею ни малейшего представления, чтобы интегрировать его или что еще мне нужно (думаю, мне нужен клиент-сторона JS как минимум).

Если я правильно понимаю, Орбитальный построен на Скручен, нужно ли что-нибудь еще с ним?

Gevent и Eventlet в той же категории, что и Twisted?Сколько еще мне нужно с ними?

Откуда такие вещи, как Celery, RabbitMQ или магазины KV, такие как Redis, входят в это?Я не очень понимаю концепцию очереди сообщений.Являются ли они необходимыми и какую услугу они предоставляют?

Существуют ли какие-либо полные учебные пособия по приложениям чата, на которые я должен обратить внимание?

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

Ответы [ 3 ]

8 голосов
/ 11 апреля 2011

Вы можете использовать Socket.IO.Для этого есть обработчики gevent и tornado.Смотрите мой блог на Gevent-socketio с Джанго здесь: http://codysoyland.com/2011/feb/6/evented-django-part-one-socketio-and-gevent/

5 голосов
/ 12 апреля 2011

Я чувствую вашу боль от того, что мне пришлось пройти то же исследование за последние несколько месяцев.У меня еще не было времени разобраться с соответствующей документацией, но у меня есть рабочий пример использования Django с socket.io и tornadio при http://bitbucket.org/virtualcommons/vcweb - я надеялсяустановить прямую связь со стороны сервера Django с процессом сервера tornadio с использованием очередей (т. е. логика в представлении django помещает сообщение в очередь, которая затем обрабатывается программой tornadio, которая выдвигает версию этого сообщения в кодировке json всемзаинтересованные подписчики), но еще не полностью реализовали эту часть.В настоящее время я настроил его так:

  1. внешний сервер торнадо (tornadio) , работающий на другом порту, принимающий запросы socket.io и работающий с моделями Django,Единственные записи, которые этот серверный процесс делает в базу данных, - это сообщения чата, которые необходимо сохранить.Он имеет полный доступ ко всем моделям Django и т. Д., И все взаимодействия в режиме реального времени должны проходить непосредственно через этот процесс сервера.
  2. Шаблонные страницы Django, требующие доступа в режиме реального времени, включают в себя javascript socket.io и устанавливают прямые соединения с сервером tornadio

Я смотрел на orbited , hookbox и gevent , но решил пойти с socket.io + tornado, так как он, казалось, позволял мне самый чистый код javascript + python.Хотя я могу ошибаться, только начав изучать Python / Django за последний год.

3 голосов
/ 10 сентября 2012

Redis относится к постоянному слою, который также поддерживает нативную публикацию / подписку .Таким образом, вместо ситуации, когда вы опрашиваете базу данных в поисках новых сообщений, вы можете подписаться на канал и получать сообщения для вас.

Я нашел рабочий пример типа системы, которую вы описываете.Волшебство происходит в представлении socketio :

def socketio(request):
    """The socket.io view."""
    io = request.environ['socketio']
    redis_sub = redis_client().pubsub()
    user = username(request.user)

    # Subscribe to incoming pubsub messages from redis.
    def subscriber(io):
        redis_sub.subscribe(room_channel())
        redis_client().publish(room_channel(), user + ' connected.')
        while io.connected():
            for message in redis_sub.listen():
                if message['type'] == 'message':
                    io.send(message['data'])
    greenlet = Greenlet.spawn(subscriber, io)

    # Listen to incoming messages from client.
    while io.connected():
        message = io.recv()
        if message:
            redis_client().publish(room_channel(), user + ': ' + message[0])

    # Disconnected. Publish disconnect message and kill subscriber greenlet.
    redis_client().publish(room_channel(), user + ' disconnected')
    greenlet.throw(Greenlet.GreenletExit)

    return HttpResponse()

Шаг за шагом перейдите в представление:

  1. Настройте socket.io, получите redisклиент и текущий пользователь
  2. Используйте Gevent для регистрации «подписчика» - он принимает входящие сообщения от Redis и перенаправляет их в браузер клиента.
  3. Запускает «издатель», который принимает сообщения отsocket.io (из браузера пользователя) и помещает их в Redis
  4. Повторяйте, пока сокет не отсоединится

Поваренная книга Redis дает чуть больше деталей наRedis сторона, а также обсуждение, как вы можете сохранить сообщения.

По поводу остальной части вашего вопроса: Twisted - это сетевая библиотека, основанная на событиях, в этом приложении ее можно считать альтернативой Gevent.Это мощный и трудный для отладки в моем опыте.

Celery - это «распределенная очередь задач» - в основном, она позволяет распределять единицы работы по нескольким машинам.«Распределенный» угол означает, что между машинами требуется какой-то вид транспорта.Сельдерей поддерживает несколько видов транспорта, включая RabbitMQ (и Redis тоже).

В контексте вашего примера, Celery будет уместен, только если вам придется выполнять какую-то дорогостоящую обработку каждого сообщения, например, поиск ненормативной лексики или что-то в этом роде.Тем не менее, что-то должно было бы инициировать задачу Celery, поэтому для обратного вызова socket.io должен быть некоторый код, прослушивающий.

(На случай, если вы не совсем запутались, можно сделать сам Celery).использовать Gevent как основную библиотеку параллелизма.)

Надеюсь, это поможет!

...