2011-08-04 43 views
8

Tôi đã phát triển Trò chơi Poker trực tuyến. Nhưng tôi cứ va vào tường. Tôi muốn thực hiện các giải thưởng vào hệ thống, nhưng tôi muốn chúng trở nên năng động. Có nghĩa là tôi không muốn biên dịch lại cho mọi giải thưởng mà tôi muốn thêm vào.Triển khai Hệ thống giải thưởng động

Tôi đã nghĩ đến việc sử dụng mã Python cho mỗi giải thưởng. Sau đó, khi máy chủ kiểm tra xem liệu người dùng có đủ điều kiện cho giải thưởng hay không, nó chạy tập lệnh python với Jython (máy chủ có trong Java và Netty NIO) và nếu hàm trả về một giá trị nào đó, tôi trao giải thưởng cho người dùng. Mà có thể làm việc nhưng có thể có một kỹ thuật hiệu quả hơn ra khỏi đó sẽ không buộc tôi phải chạy hàng trăm kịch bản python mỗi khi tôi cần phải kiểm tra xem một người dùng có một giải thưởng.

Và khi nào là thời điểm tốt nhất để thực hiện các kiểm tra này? Tôi đã suy nghĩ về một hệ thống móc, nơi tôi sẽ chỉ định các móc như ([onconnect] [ondisconnect] [chatmessage.received]). Mà cũng có thể làm việc nhưng cảm thấy một chút thô và tôi vẫn sẽ phải chạy tất cả các kịch bản từ cơ sở dữ liệu.

+1

Trong Java thuần túy, sự năng động mà bạn tìm kiếm có thể đạt được bằng cách sử dụng OSGi – earcam

+0

Suy nghĩ về nó, vì vậy tôi tạo ra như một hệ thống plugin cho các giải thưởng? Mỗi giải thưởng là một Giao diện mà máy chủ gọi trong Jar và sau đó kiểm tra xem người dùng có nhận được giải thưởng hay không. Nhưng hiệu suất đạt mức nào khi tải 20 bình chọn mỗi lần với các giải thưởng mỗi lần tôi kiểm tra? Hoặc tôi có thể làm bộ nhớ đệm ... mmmm –

+0

j.w. tại sao bạn quan tâm đến việc tải 20 lọ? Đây là hình phạt một lần trong khi khởi động máy chủ (đây là mã máy chủ phải không?). Ngoài ra, để tải các lớp của bạn một cách hiệu quả từ các tệp jar, hãy xem: http://download.oracle.com/javase/1.3/docs/guide/jar/jar.html#Index%20File%20Specification –

Trả lời

6

Nếu tôi là bạn, tôi sẽ có một quy trình hoàn toàn riêng biệt cấp giải thưởng. Nó chạy có lẽ một lần một ngày trên cơ sở dữ liệu nằm bên dưới chứa tất cả dữ liệu người chơi/trò chơi của bạn.

Ứng dụng khách hàng cốt lõi của bạn biết về giải thưởng, nhưng tất cả những gì họ biết về chúng là dữ liệu được tải từ DB - một cái gì đó như tiêu đề, hình ảnh, mô tả, có thể bao nhiêu người có giải thưởng, v.v. (dựa trên các bảng DB), người đã giành được giải thưởng.

Quy trình "giải thưởng" của bạn chỉ cần chạy ở chế độ hàng loạt, một lần mỗi ngày/giờ v.v., và cấp giải thưởng mới cho người chơi đủ điều kiện. Sau đó, ứng dụng cốt lõi đối mặt với khách hàng thông báo cho họ nhưng không thực sự phải biết những thông minh về cách cấp chúng. Điều này mang lại cho bạn sự tự do để biên dịch lại và chạy lại chương trình giải thưởng của bạn bất cứ khi nào bạn muốn mà không có tác động ứng dụng cốt lõi.

Cách tiếp cận khác, tùy thuộc vào mức độ hạn chế của giải thưởng của bạn, sẽ là viết giao diện quy tắc đơn giản cho phép bạn xác định quy tắc trong dữ liệu. Đó là lý tưởng để đạt được những gì bạn mô tả, nhưng đó là một chút công việc không có nhiều phần thưởng, theo ý kiến ​​của tôi.

PS - khi chạy một thứ như máy chủ poker trực tuyến, bạn sẽ luôn gặp phải các phiên bản của sự cố này. Bạn hoàn toàn cần phải phát triển một cách để triển khai mã mới mà không làm mất dịch vụ của bạn hoặc có một cửa sổ thời gian chết. Làm việc xung quanh một giải pháp mã java-centric cho giải thưởng sẽ không giải quyết vấn đề đó cho bạn trong thời gian dài. Bạn nên xem xét các tài liệu về việc chạy các dịch vụ 24/7 thực sự, có một vài cách để giải quyết vấn đề và nó thực sự không phải là khó khăn trong những ngày này.

+0

Cảm ơn một số mẹo hay. Nether thậm chí còn nghĩ đến việc có một quy trình riêng biệt để xử lý logic giải thưởng. Đã cố gắng tìm kiếm một số thông tin nhưng không thể tìm thấy bất kỳ điều gì hữu ích, bạn có thể chỉ cho tôi một số tài liệu vì tôi thực sự muốn xem cách một số công ty đạt được Dịch vụ 24/7. –

+0

Tôi nghĩ rằng cách tiếp cận tách là tốt nhất. Không có lý do gì bạn cần phải thực hiện việc tính toán mỗi khi bạn nhìn thấy người dùng, mỗi ngày một lần là tốt, và sau đó lần sau khi họ đăng nhập vào máy chủ thấy rằng người này đã được cấp một giải thưởng. – nflacco

+0

Cảm ơn. Làm tôi suy nghĩ một chút. Muốn chia nó giữa bạn và câu trả lời khác nhưng chỉ có thể trao giải và bạn đã cho tôi cái nhìn đầu tiên. –

2

Theo như tôi hiểu bạn, có thể bạn không phải chạy các quy trình bên ngoài từ ứng dụng của mình hoặc cũng không sử dụng OSGI. Chỉ cần tạo một giao diện Java đơn giản và triển khai từng plugin ('giải thưởng') như một lớp thực hiện giao diện. Sau đó bạn có thể chỉ cần biên dịch bất kỳ plugin mới nào và tải nó dưới dạng tệp lớp từ ứng dụng của bạn tại thời gian chạy bằng cách sử dụng Class.forName(String className). Bất kỳ logic nào bạn cần từ một plugin như vậy sẽ được chứa trong các phương thức trên giao diện.

http://download.oracle.com/javase/1,5.0/docs/api/java/lang/Class.html#forName(java.lang.String)

+0

Tôi đồng ý với câu trả lời của bạn nhưng, tôi cũng muốn thêm rằng bằng cách sử dụng hệ thống chuẩn hóa (ví dụ: OSGI) để tải các trình cắm thêm sẽ giúp nhà phát triển duy trì mã như vậy. Class.forName (...) như một ví dụ rất dễ viết, nhưng khi nói đến xử lý lỗi, quản lý cá thể trở thành cơn ác mộng và đột nhiên bạn dành thời gian cho một vấn đề đã được giải quyết (ví dụ, bởi OSGI) chứ không phải trò chơi của bạn . –

3

Có một số lựa chọn tôi có thể nghĩ:

  • OSGi như mô tả ở trên - nó đi kèm với một chi phí, nhưng có lẽ là giải pháp chung chung và năng động nhất trên mạng
  • Nếu bạn mở để khởi động lại (không biên dịch lại), một bộ sưu tập các lọ trong một thư mục nổi tiếng và mùa xuân sẽ cung cấp cho bạn một giải pháp rẻ hơn nhưng không kém phần chung chung. Chỉ cần có đậu thưởng của bạn thực hiện một giao diện tiêu chuẩn, được đậu, và để cho con số mùa xuân @Autowire tất cả các giải thưởng có sẵn vào kiểm tra của bạn.
  • Nếu bạn trao giải thực thi là khá chuẩn, và sự khác biệt duy nhất giữa các giải thưởng là chính quy tắc, bạn có thể có một số loại cấu hình theo kịch bản. Nhiều tùy chọn ở đó, từ python bạn mô tả (ngoại trừ tôi muốn đi cho một vài kịch bản lớn quản lý tất cả các giải thưởng), để biểu thức thông thường cơ bản, với LUA và Drools ở giữa. Trong mọi trường hợp, bạn đang xem xét một số loại quy tắc kiến ​​trúc động cơ, linh hoạt về những gì giải thưởng có thể kích hoạt nhưng không cung cấp tính linh hoạt cao về giải thưởng có thể dẫn đến (ví dụ: hoàn hảo cho thành tích).
3

Một số ý kiến ​​cho câu trả lời với những ý tưởng hàng loạt: Implementing a Dynamic Award System

Đó quá trình hàng loạt có thể trên máy chủ/máy riêng biệt, vì vậy bạn có thể biên dịch lại ứng dụng hoặc khởi động lại máy chủ bất cứ lúc nào. Có giải thưởng mới có thể được xử lý bằng cách sử dụng ví dụ cách tiếp cận được đề cập với việc thêm các lọ và khởi động lại máy chủ, cũng có thể thực hiện các tác vụ mới mẻ bất cứ lúc nào và cứ thế. Vì vậy, ứng dụng cốt lõi của bạn đang chạy 99% thời gian, máy chủ batch có thể được khởi động lại thường xuyên. Vì vậy, hàng loạt máy riêng biệt là tốt để có.

Khi bạn cần triển khai phiên bản ứng dụng cốt lõi mới, tôi nghĩ bạn chỉ có thể dừng, triển khai và bắt đầu với thông báo bảo trì cho người dùng. Cách tiếp cận đó được sử dụng ngay cả với các phòng chơi poker hàng đầu với phần mềm tuyệt vời (ví dụ: FullTiltPoker đã làm như vậy, ngay bây giờ nó bị hỏng do mất giấy phép, nhưng trang web của họ nói 'Cập nhật hệ thống' :)).

Do đó, một cách tiếp cận để cập nhật phiên bản là triển khai lại/khởi động lại sau giờ làm việc.

Một cách tiếp cận khác là cập nhật theo thời gian thực. Như một quy luật, nó được thực hiện bằng cách di chuyển người dùng theo từng nhóm sang phiên bản mới. Vì vậy, đồng thời một số người dùng đang sử dụng phiên bản cũ, một số mới. Không phải là khá mát mẻ cho phần mềm poker là người dùng với các phiên bản khác nhau có thể tương tác. Nhưng nếu bạn chắc chắn về khả năng tương thích của các phiên bản, bạn có thể đi theo cách tiếp cận đó, kiểm tra phiên bản máy khách của người dùng ví dụ khi đăng nhập.

Trong câu trả lời của tôi, tôi đã cố gắng nói rằng bạn không cần phải giới thiệu 24/7 hỗ trợ logic cho mã của bạn. Để lại các vấn đề sẵn có của hệ thống cho phần cứng (failovers, loadbalancers, vv). Bạn có thể làm theo bất kỳ kỹ thuật nào bạn đã sử dụng để viết mã, chỉ bạn cần nhớ rằng logic cốt lõi cốt lõi của bạn được triển khai không thường xuyên (ví dụ: mỗi tuần một lần) và phần lô có thể được cập nhật/khởi động lại bất cứ lúc nào nếu cần.

+1

Cảm ơn mở rộng tuyệt vời cho câu trả lời khác. –

+0

Muốn cung cấp cho bạn một số tiền thưởng nhưng chỉ có thể trả lời cho một câu trả lời. Cảm ơn! –

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