2011-02-19 40 views
8

Tôi đang phát triển một máy chủ chơi trò chơi nhiều người sử dụng Django cho máy chủ web (HTML frontend, xác thực người dùng, trò chơi có sẵn, bảng xếp hạng, v.v.) và Xoắn để xử lý các kết nối giữa người chơi và trò chơi và để giao tiếp với các trò chơi. Máy chủ trò chơi, máy chủ web và cơ sở dữ liệu có thể chạy trên các máy khác nhau.Chia sẻ cơ sở dữ liệu giữa Twisted và Django

Cách "tốt nhất" để kiến ​​trúc sư cơ sở dữ liệu được chia sẻ, theo cách hỗ trợ thay đổi lược đồ cơ sở dữ liệu trong tương lai. Tôi có nên thử kết hợp ORM của Django trong khung công tác Twisted và sử dụng hoãn lại để làm cho nó không bị chặn không? Tôi có nên bị mắc kẹt khi tạo và duy trì hai lược đồ/giao diện cơ sở dữ liệu riêng biệt, một trong mô hình của Django và một trong mô hình khác bằng cách sử dụng twisted.enterprise.row?

Tương tự, với xác thực người dùng, tôi có nên sử dụng chức năng xác thực người dùng của xoắn hay cố gắng đưa mô-đun Django vào máy chủ trò chơi để xử lý xác thực người dùng ở phía trò chơi không?

+0

Lưu ý rằng twisted.enterprise.row đã không được dùng nữa trong gần ba năm và có thể sẽ sớm bị xóa ngay bây giờ. –

Trả lời

10

Trước hết, tôi muốn xác định lý do bạn cần cả Django và Twisted. Giả sử bạn cảm thấy thoải mái với Twisted khi sử dụng twisted.web và auth sẽ dễ dàng đủ và bạn sẽ có thể sử dụng lại lớp cơ sở dữ liệu của mình cho cả giao diện người dùng và ứng dụng phụ trợ.

Hoặc bạn có thể xem nó theo cách khác, Twisted làm tốt hơn như một máy chủ trò chơi là gì? Bạn có hy vọng hỗ trợ nhiều người chơi hơn (nhiều kết nối đồng thời hơn) hay cái gì khác không? Hãy xem xét rằng nếu bạn phải sử dụng threaded trong vòng xoắn để làm chặn truy cập cơ sở dữ liệu mà bạn có nhiều khả năng sẽ không thể có hiệu quả/đáng tin cậy hỗ trợ hàng trăm chủ đề đồng thời. Hãy nhớ rằng python có một khóa thông dịch toàn cục để các luồng không nhất thiết phải là cách tốt nhất để mở rộng quy mô.

Bạn cũng nên xem xét lý do tại sao bạn đang tìm cách sử dụng Cơ sở dữ liệu SQL và ORM. Trò chơi của bạn có dữ liệu thực sự phù hợp nhất để được lưu trữ trong cơ sở dữ liệu quan hệ không? Có lẽ nó đáng xem xét một cái gì đó như MongoDB hoặc một khóa-giá trị hoặc cơ sở dữ liệu đối tượng khác để lưu trữ trạng thái trò chơi. Nhiều người trong số các cửa hàng NoSQL có cả hai trình điều khiển chặn để sử dụng trong Django và trình điều khiển không chặn để sử dụng trong Twisted (txmongo ví dụ).

Điều đó nói rằng, nếu bạn đã chết đặt trên bằng cách sử dụng cả Django và Twisted có một vài kỹ thuật để nhúng chặn truy cập DB vào một máy chủ không chặn Twisted.

  1. adbapi (sử dụng xoắn bơi thread)
  2. Sử dụng trực tiếp các hồ bơi thread xoắn sử dụng reactor.deferToThread
  3. The Storm ORM có một chi nhánh cung cấp hỗ trợ Twisted (nó xử lý deferToThread gọi trong nội bộ)
  4. SAsync là một thư viện cố gắng làm cho SQLAlchemy hoạt động theo cách Async
  5. Đã tương tác xoắn qua RPC với quy trình quản lý việc chặn DB

Vì vậy, bạn sẽ có thể quản lý các đối tượng ORM Django mình bằng cách nhập chúng trong xoắn và đang rất cẩn thận thực hiện cuộc gọi đến reactor.deferToThread. Có nhiều vấn đề có thể xảy ra khi làm việc với các đối tượng này trong một số đối tượng ORM có thể phát hành SQL khi truy cập/thiết lập thuộc tính, v.v.

Tôi nhận thấy đây không nhất thiết là câu trả lời bạn mong đợi nhưng có lẽ chi tiết hơn về những gì bạn đang hy vọng đạt được và lý do tại sao bạn chọn những công nghệ cụ thể này sẽ cho phép mọi người có được câu trả lời tốt hơn cho bạn.

+0

Bạn cũng có thể xem câu hỏi này khá giống: http://stackoverflow.com/questions/3017101/twisted-sqlalchemy-and-the-best-way-to-do-it – stderr

+0

+1 cho "tại sao không chỉ một ngăn xếp "tình cảm. Twisted là tuyệt vời cho các loại sao chổi của công cụ, tôi muốn nói chỉ cần sử dụng nó để phục vụ HTTP là tốt. Tôi làm. – jpsimons

2

tôi sẽ chỉ cần tránh các Django ORM, nó không phải là tất cả những gì và nó sẽ là một nỗi đau để truy cập bên ngoài của một bối cảnh Django (chứng kiến ​​sự việc mà đã được yêu cầu để làm cho Django hỗ trợ nhiều cơ sở dữ liệu). Truy cập cơ sở dữ liệu được xoắn luôn đòi hỏi các luồng (ngay cả với twisted.adbapi), và các luồng cung cấp cho bạn quyền truy cập vào bất kỳ ORM nào bạn chọn. SQLalchemy sẽ là một lựa chọn tốt.

Các vấn đề liên quan