Định dạng nhật ký trò chơi cho máy chủ MMO


12

Nhật ký các sự kiện trò chơi (trái ngược với nhật ký lỗi / gỡ lỗi) cho toàn bộ cụm / phân đoạn rất hữu ích cho MMO thương mại trong môi trường sản xuất trực tiếp, cung cấp hỗ trợ quan trọng cho dịch vụ khách hàng và phương tiện cho phân tích lịch sử.

Dự án mà tôi hiện đang làm việc sử dụng cơ sở dữ liệu quan hệ để lưu trữ tất cả các nhật ký sự kiện trò chơi, và trong khi phương pháp đó hoạt động tốt, đối với tôi, bản chất theo thời gian chỉ đọc của nhật ký sẽ cho phép định dạng lưu trữ hiệu quả hơn .

Tuy nhiên, tôi không chắc bắt đầu tìm hiểu về việc xây dựng các định dạng nhật ký nhị phân tùy chỉnh. Kinh nghiệm của bạn khi tạo định dạng nhật ký tùy chỉnh hoặc bất kỳ bài viết / bài viết được đề xuất nào về chủ đề này là gì?

Câu trả lời:


7

Trong Stendhal, chúng tôi đã giải quyết vấn đề hiệu suất bằng cách thêm các sự kiện trò chơi vào hàng đợi và sau đó xử lý chúng không đồng bộ trong nền .

Trong trường hợp của chúng tôi, các sự kiện không chỉ là các bản ghi mà là các đối tượng có một chút logic bởi vì trong một số trường hợp, chúng tôi cần thực hiện hai lần chèn với một liên kết giữa chúng. Ví dụ: lần đầu tiên một vật phẩm được xử lý trong trò chơi, nó cần được chèn vào bảng vật phẩm trước khi một sự kiện vật phẩm có thể được ghi lại.

Nhưng viết nhật ký chỉ là một mặt của vấn đề:

Những câu hỏi nào bạn muốn trả lời với các bản ghi?

Thật dễ dàng để chỉ đọc nhật ký đầy đủ theo thứ tự thời gian; hoặc để lọc nó cho một người chơi.

Nhưng có thể có những câu hỏi như:

  • Những vật phẩm nào Anton đã đặt trên mặt đất đã được Beth nhặt lên ngày hôm qua? Người chơi nào sở hữu chúng bây giờ? (Anton phàn nàn về món đồ của mình bị đánh cắp)
  • Một người chơi trung bình cần bao nhiêu thời gian để đạt cấp 100? Những người chơi đã được nhanh hơn đáng kể? chỉ dành cho nhân vật đầu tiên?
  • Có người chơi nào xử lý số tiền khổng lồ trong trò chơi không? Nó được thông qua cho người chơi nào? Nếu không có gì có giá trị đổi lại?
  • Là những người chơi yếu có thể giết chết những sinh vật mạnh mà họ không thể giết một cách hợp pháp?
  • ...

Trong Stendhal, chúng tôi sử dụng cơ sở dữ liệu quan hệ cho nhật ký trò chơi vì đó là cách dễ nhất để cho phép truy vấn đặc biệt. Nếu bạn sử dụng định dạng nhật ký tùy chỉnh, về cơ bản bạn phải mã hóa tất cả các truy vấn đó khi có nhu cầu. Và làm điều đó với hiệu suất đầy đủ trở nên khá khó khăn.

Bảng gameEvents của chúng tôi có 51.429.139 hàng (năm ngoái) và chúng tôi có một bảng itemlog chuyên dụng có 60.360.657 hàng (mọi lúc) cho 15.893.831 mặt hàng.


Làm thế nào nhanh chóng là tìm kiếm thông qua cơ sở dữ liệu của bạn? Tôi đã có dữ liệu tương tự với các bản ghi và chúng tôi đã có khoảng 100.000.000 hàng sau ba tháng. Chúng tôi sử dụng MySQL là lưu trữ và hiệu suất của nó là xấu. Truy vấn đơn giản liệt kê tất cả các hành động của người chơi (chỉ 20.000) hàng thường mất hơn 60 giây.
Balon

1
Các truy vấn đơn giản trên các cột chỉ mục là ngay lập tức. Các truy vấn phức tạp có thể mất một chút, 60 giây truy vấn xảy ra, nhưng chúng rất hiếm. Chúng tôi đã lập chỉ mục bảng rất nhiều và đền bù hình phạt khi chèn bằng cách thực hiện chúng không đồng bộ.
Hendrik Brummermann

Hmmm Tôi nghĩ rằng vấn đề của tôi là tập kết quả khá lớn, thường nằm trong khoảng từ 3000 đến 150000 hồ sơ cho một người chơi. Vì vậy, đây có thể là lý do tại sao nó mất nhiều thời gian, bởi vì nó hoạt động rất nhanh cho các tập kết quả nhỏ.
Balon

4

Bạn có ý nghĩa gì bởi hiệu quả? Cho dù đó là kích thước trên đĩa hoặc tốc độ truy vấn, cơ sở dữ liệu quan hệ gần như chắc chắn sẽ đánh bại hoặc bằng định dạng nhị phân độc quyền của bạn và dễ sử dụng và linh hoạt hơn nhiều.

Mỗi bảng bạn sử dụng trong một DB quan hệ khá nhiều cho phép bạn chỉ định cho byte chính xác bao nhiêu không gian trên mỗi hàng bạn sẽ cho phép. Nếu bạn không ghi nhật ký văn bản đơn giản - và "nhật ký sự kiện trò chơi (trái ngược với nhật ký lỗi / gỡ lỗi)" ngụ ý rằng bạn không, hoặc ít nhất là không cần - thì cách tiếp cận trường có chiều rộng cố định của một cơ sở dữ liệu quan hệ khá gần với tối ưu về không gian, điều này làm cho chúng khá nhanh ngay từ đầu. Trên cơ sở dữ liệu quan hệ đó khá tiện lợi trong việc tạo các chỉ mục để truy cập rất nhanh và tối ưu hóa các truy vấn để tận dụng tối đa chúng.

Vì vậy, tôi khuyên bạn nên gắn bó với những gì bạn đã có.


Cảm ơn câu trả lời (và cảm ơn những người khác đã gửi câu trả lời bên dưới)! Tôi càng nghĩ về nó thì dường như RDBMS càng phù hợp với kiểu ghi nhật ký cụ thể này. Sẽ không quá khó để thiết kế định dạng nhật ký tùy chỉnh được lập chỉ mục tốt cho các loại tìm kiếm cơ bản, nhưng với loại truy vấn phức tạp thường được sử dụng bởi CSR và phân tích trò chơi, cần có cách tiếp cận tổng quát hơn - tại thời điểm đó một sản phẩm được thành lập sẽ tốt hơn trong hầu hết các trường hợp.
Charles Ellis

Thiết lập nhật ký sự kiện tùy chỉnh sẽ thuận tiện cho việc phát lại bản ghi demo ala FPS theo trình tự thời gian, nhưng đó là một vấn đề rất khác cần giải quyết. Có ai có kinh nghiệm trong việc phát triển một cái gì đó tương tự như bản ghi demo cho các trò chơi máy khách-máy chủ nhiều người chơi không?
Charles Ellis

Tùy thuộc vào mô hình xử lý logic phía máy chủ của bạn, có thể chỉ cần lưu trữ mọi đầu vào, được đóng dấu với thời gian đến trên máy chủ, có thể được phát lại. Vấn đề có xu hướng phát lại, vì bạn cần phát lại mọi đầu vào đơn lẻ cũng như mô hình hóa bất kỳ yếu tố nào khác (ví dụ: hạt ngẫu nhiên, ngụ ý đầu vào như những thứ thay đổi dựa trên độ trễ, v.v.). Nhưng không có hệ thống một kích cỡ phù hợp cho tất cả ở đây - nó phụ thuộc vào cách máy chủ của bạn hoạt động.
Kylotan

3

Đúng là bạn có thể lưu một vài byte với định dạng tùy chỉnh hoặc chỉ cần nén văn bản, dung lượng lưu trữ rẻ nên nó thực sự không đáng để tối ưu hóa nữa. Điều quan trọng hơn là đối phó với những thứ như bộ đệm và truy vấn I / O, cả hai máy chủ SQL ngoài luồng có thể hoạt động khá tốt. Nếu nó hoạt động cho bạn trên các mặt trận đó, tôi sẽ chạy với nó. Chúng tôi đã viết máy chủ nhật ký đệm riêng của chúng tôi ghi vào các tệp tùy chỉnh và sau đó có một chương trình phân tích cú pháp riêng để đọc nó vào cơ sở dữ liệu cho các truy vấn, tôi không khuyến nghị điều đó.


0

Cơ sở dữ liệu quan hệ ngày nay bị loại vì không hiệu quả, nhưng khi lưu trữ loại nhật ký mà bạn đang nói đến, bạn không thực sự cần hiệu quả vì chúng sẽ không được truy cập liên tục bởi trò chơi hoặc người dùng của nó - chỉ nhóm của bạn mới cần để đọc dữ liệu.

Vì vậy, "hiệu quả" không quan trọng lắm. Điều quan trọng hơn là sắp xếp dữ liệu theo cách giúp bạn dễ dàng kể câu chuyện về những gì người dùng đang làm trong trò chơi. Các nhà phát triển của bạn thường sẽ cần sử dụng dữ liệu này và hiển thị nó trong một giao diện dễ đọc cho các nhà phân tích và nhà phân tích đôi khi sẽ cần truy vấn dữ liệu để đào sâu vào hành vi của người dùng. Chẳng hạn, nếu người chơi đang mua một mặt hàng nào đó trước khi cập nhật, nhưng ngừng mua nó sau khi cập nhật, một nhà phân tích sẽ có lợi bằng cách viết một số truy vấn nhất định phơi bày một số con số về hành vi xung quanh giao dịch đó để xác định lý do tại sao người dùng không còn mua nó nữa. Tốt nhất là họ có ngôn ngữ truy vấn chuẩn để làm việc với tài liệu đó. Nếu họ phải biến những truy vấn này thành định dạng nhị phân tùy chỉnh, công việc của họ sẽ trở nên khó khăn hơn,

Nói chung các sự kiện trò chơi trông giống như thế này (đặc biệt là định dạng của DeltaDNA)

{
 "eventName":"specific event code – eg. gameStarted",
 "userID":"ABCD1-4321a879b185fcb9c6ca27abc5387e914",
 "sessionID":"4879bf37-8566-46ce-9f3b-bd18d6ac614e",
 "eventTimestamp":"yyyy-mm-dd hh:mm:ss.SSS",
 "eventParams":
  {
   "platform":"WEB",
   "param1":"stringParam",
   "param2":true,
   "param3":1234,
   "param4":["a","b","c"]
  },
}

Sự kiện này thường bao gồm tên sự kiện, ID người dùng, ID phiên, dấu thời gian và các tham số cho phép bạn ghi lại bất kỳ dữ liệu nào bạn thấy hữu ích để ghi lại xung quanh sự kiện đó. Và theo kinh nghiệm của tôi, các định dạng cơ sở dữ liệu quan hệ là tốt nhất để ghi lại cấu trúc như vậy.

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.