Совместное использование базы данных между Twisted и Django - PullRequest
9 голосов
/ 19 февраля 2011

Я разрабатываю многопользовательский игровой сервер, который использует Django для веб-сервера (внешний интерфейс HTML, аутентификация пользователей, игры, таблица лидеров и т. Д.) И Twisted для обработки соединений между игроками и играми и для взаимодействия с самими играми.Игровой сервер, веб-сервер и база данных могут работать на разных компьютерах.

Каков «лучший» способ создания общей базы данных, который поддерживает дальнейшие изменения в схеме базы данных.Должен ли я попытаться включить ORM Django в Twisted framework и использовать deferreds, чтобы сделать его неблокирующим?Должен ли я застрять при создании и обслуживании двух отдельных схем / интерфейсов баз данных, одна в модели Django, а другая с использованием twisted.enterprise.row?

Аналогично, при аутентификации пользователя я должен использовать функцию аутентификации пользователя twisted или попробоватьвключить модули Django в игровой сервер для обработки аутентификации пользователя на игровой стороне?

Ответы [ 2 ]

10 голосов
/ 19 февраля 2011

Прежде всего, я бы определил, зачем вам Джанго и Твист. Предполагая, что вы знакомы с Twisted, достаточно использовать twisted.web и auth, и вы сможете повторно использовать слой базы данных как для внешнего, так и для внутреннего приложений.

В качестве альтернативы вы могли бы взглянуть на это по-другому, что Twisted делает лучше в качестве игрового сервера? Вы надеетесь поддержать больше игроков (больше одновременных соединений) или что-то еще? Учтите, что если вам необходимо использовать многопотоковое соединение внутри витой для блокирования доступа к базе данных, вы, скорее всего, не сможете эффективно / надежно поддерживать сотни одновременных потоков. Помните, что в python есть глобальная блокировка интерпретатора, поэтому потоки не обязательно являются лучшим способом масштабирования.

Вам также следует подумать, почему вы хотите использовать базу данных SQL и ORM. Есть ли в вашей игре данные, которые действительно лучше всего подходят для хранения в реляционной базе данных? Возможно, стоит изучить что-то вроде MongoDB или другой базы данных значений ключей или объектов для хранения состояния игры. Многие из этих хранилищ NoSQL имеют как блокирующие драйверы для использования в Django, так и неблокирующие драйверы для использования в Twisted (например, txmongo).

Тем не менее, если вы не можете использовать Django и Twisted, есть несколько способов встроить блокирующий доступ к БД в неблокирующий Twisted сервер.

  1. adbapi (использует витой пул потоков)
  2. Непосредственное использование пула витых нитей с использованием реактором.deferToThread
  3. В Storm ORM есть ветвь, обеспечивающая поддержку Twisted (она обрабатывает вызовы deferToThread внутри)
  4. SAsync - это библиотека, которая пытается заставить SQLAlchemy работать асинхронно
  5. Скручено взаимодействовать через RPC с процессом, управляющим блокирующей БД

Таким образом, вы должны иметь возможность самостоятельно управлять объектами Django ORM, импортируя их в скрученном виде и очень осторожно совершая вызовы в реактор.deferToThread. Существует много возможных проблем при работе с этими объектами в витой форме, так как некоторые объекты ORM могут выдавать SQL при доступе / установке свойства и т. Д.

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

2 голосов
/ 19 февраля 2011

Я бы просто отказался от Django ORM, это еще не все, и было бы затруднительно получить доступ вне контекста Django (посмотрите на работу, которая требовалась, чтобы Django поддерживал несколько баз данных).Для доступа к базе данных Twisted всегда требуются потоки (даже с twisted.adbapi), а потоки предоставляют вам доступ к любому ORM, который вы выберете.SQLalchemy был бы хорошим выбором.

...