Người chơi tự động / xếp hàng


8

Tôi đang sử dụng Node.js và Redis. Tôi đang cố gắng đưa ra một cách đáng tin cậy để tự động hóa người chơi. Có một máy chủ phù hợp và sau đó nhiều máy chủ trò chơi được thiết lập.

Sau đây là những gì tôi cần phải xảy ra:

  1. Người chơi gửi yêu cầu tham gia với loại trò chơi (nhỏ / vừa, v.v.)
  2. Máy chủ phù hợp sẽ thêm người chơi vào loại trò chơi hiện tại đang chờ người chơi
  3. Máy chủ trò chơi gửi cho người chơi ID trò chơi

Hiện tại tôi đã thực hiện điều này như sau:

  1. Máy chủ phù hợp lắng nghe trò chơi: queue: small bằng BRPOP
  2. Kiểm tra nếu trò chơi: queue: small: id = id tồn tại
  3. Kiểm tra xem trò chơi: id: độ dài người dùng là <= 6 (người chơi tối đa)
  4. Thêm người chơi vào trò chơi: id: danh sách người dùng nếu có
  5. Nếu thời lượng trò chơi bây giờ là 6, nó sẽ xóa trò chơi: queue: small: id

Nếu máy chủ phù hợp tìm thấy trò chơi: queue: small: id bị thiếu, nó sẽ hoạt động như sau:

  1. Trò chơi INCR: nextGameId
  2. Đặt trò chơi: queue: small: id cho ID được tạo trước đó
  3. Thêm ID trò chơi vào trò chơi: queue: chờ đợi

Các máy chủ trò chơi chờ sử dụng BRPOP cho các trò chơi mới. Khi họ nhận được một, họ đợi cho đến khi trò chơi có tối thiểu 2 người dùng thì bắt đầu hẹn giờ. Nếu họ không điền vào thời gian đó, họ sẽ bắt đầu với những người dùng họ có và sau đó xóa trò chơi: queue: small: id (do đó buộc người mai mối yêu cầu một trò chơi mới).

Trong khi phương pháp của tôi đang hoạt động, tôi không tin nó sẽ hoạt động tốt trong sản xuất và nó có vẻ rất phức tạp. Tôi có thể thấy tiềm năng cho các vấn đề sau:

  • Máy chủ trò chơi gặp sự cố sau khi chấp nhận ID trò chơi từ danh sách chờ dẫn đến việc người dùng được thêm vào trò chơi: id: người dùng nhưng không có gì xảy ra với họ (bản thân sự cố không phải là vấn đề, nhưng người dùng tiếp tục được thêm vào hàng đợi trò chơi đó là )
  • Nếu người dùng ngắt kết nối và trò chơi chưa bắt đầu, máy chủ trò chơi sẽ xóa người dùng khỏi trò chơi: id: danh sách người dùng. Trong khi đang trong quá trình thực hiện điều đó, máy chủ mai mối có thể thêm người dùng vào danh sách và nghĩ rằng trò chơi đã đầy, do đó loại bỏ nó khỏi hàng đợi.

Suy nghĩ ban đầu của tôi là thay đổi thành một hàng người dùng đang chờ một loại trò chơi. Tuy nhiên, điều này trình bày thêm các vấn đề:

  • Nếu máy chủ mà người dùng kết nối gặp sự cố, nó sẽ không xóa người dùng khỏi hàng đợi, do đó khiến người dùng đó được đưa vào trò chơi khi họ không tồn tại. Tôi có thể sử dụng các bộ được sắp xếp để lưu trữ thời gian của yêu cầu và thăm dò ý kiến ​​khách hàng cho đến khi nhận được ID trò chơi nhưng điều này có nghĩa là tôi không biết khách hàng đó đã đợi bao lâu và do đó không biết có nên bắt đầu trò chơi không với ít người dùng hơn.
  • Không đưa người dùng vào trò chơi, họ không có khả năng xem những gì người dùng đã tham gia, cũng không có khả năng trò chuyện với người dùng đang chờ đợi (vì điều đó yêu cầu ID trò chơi).

Không có cách nào tôi thiết lập điều này cảm thấy đúng vì vậy tôi đã hy vọng ai đó có thể đưa ra một số gợi ý tốt hơn. Tôi thực sự cần phải giữ các máy chủ trò chơi và máy chủ mai mối riêng biệt để phát triển chúng theo yêu cầu.


Vấn đề cơ sở dữ liệu tôi đã giải quyết ở đây: stackoverflow.com/questions/15172556/ Khăn
Chris Evans

Trong Kiểm tra nếu trò chơi: queue: small: id = id tồn tại , Làm thế nào để bạn có được ID?
Rayon

Câu trả lời:


1

Lỗi đầu tiên và quan trọng nhất của bạn là sử dụng cơ sở dữ liệu cho hàng đợi trực tiếp, dữ liệu đó tốt hơn nhiều được lưu trữ trong bộ nhớ quy trình trong quy trình mai mối. Hãy để các quá trình giao tiếp với nhau trực tiếp. Sau đó, bạn cũng bị ép buộc rất nhiều rằng trách nhiệm duy nhất của máy chủ mai mối là loại bỏ người chơi khỏi hàng đợi khi họ được đưa vào một trò chơi, đúng như vậy.

Nói chung hơn về việc mai mối, trì hoãn các quyết định về trận đấu chính xác sẽ diễn ra cho đến khi trò chơi bắt đầu, nếu bạn có 3 người chơi phù hợp với trò chơi 4 người, đừng quyết định rằng họ phải chơi loại trò chơi đó trước khi có cũng là người chơi thứ 4, có thể mất nhiều thời gian để người chơi đó đến và một số người trong số họ có thể bỏ việc chờ đợi trong thời gian đó. Một cách thực hiện tốt cho việc này là có một hàng đợi cho từng loại trò chơi và đưa từng người chơi vào tất cả các hàng đợi phù hợp với yêu cầu của họ, sau đó khi một hàng đợi đầy đủ bắt đầu trò chơi và loại bỏ những người chơi có liên quan khỏi tất cả các hàng đợi của họ.


Tôi đã sử dụng Redis như xử lý hàng đợi tốt. Ban đầu, tôi đã quản lý việc mai mối trong chính máy chủ và nó hoạt động rất tốt nhưng tôi đã tìm thấy hai vấn đề với cách tiếp cận này: Tôi không thể tìm cách mở rộng quy mô và thứ hai là máy chủ yêu cầu trò chơi mới bắt đầu trên máy chủ khác như thế nào. Nó có thể gửi tin nhắn cho tất cả mọi người nhưng sau đó tải sẽ không được cân bằng?
Chris Evans

1
@ChrisEvans Bạn không nên lo lắng quá nhiều về việc chia tỷ lệ, một quy trình mai mối đơn giản có thể xử lý hàng ngàn lần khởi động trò chơi mỗi giây. Nếu bạn chỉ viết mã tốt, bạn sẽ không cần mai mối để mở rộng quy mô cho nhiều quy trình, ngay cả khi bạn có hàng triệu khách hàng. Đối với việc cân bằng tải trên các máy chủ trò chơi, cách tiếp cận vòng tròn đơn giản trong đó mỗi máy chủ trò chơi lần lượt có một trò chơi mới có hiệu quả hợp lý nếu các máy chủ thường có thể xử lý một số lượng lớn các trò chơi. Nếu không, bạn có thể định kỳ hỏi các máy chủ trò chơi rằng họ bận như thế nào, điều đó không phải xảy ra một lần cho mỗi trò chơi mới.
aaaaaaaaaaaa
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.