2011-08-04 181 views
8

我一直在开发一个在线扑克游戏。但是我一直在打墙。我想在系统中实施奖励,但我希望他们充满活力。这意味着我不想重新编译我想添加的每个奖项。实施动态奖励系统

我曾考虑过为每个奖项使用Python代码。然后,当服务器检查用户是否有资格获得奖励时,它将使用Jython运行python脚本(服务器位于Java和Netty NIO中),并且如果该函数返回某个值,则将奖励颁发给用户。哪个可以工作,但是可能有更高效的技术,每当我需要检查用户是否获得奖励时,都不会强制我运行数百个Python脚本。

什么时候做这些检查的最佳时机?我已经讨论了一个钩子系统,我将在其中指定钩子([onconnect] [ondisconnect] [chatmessage.received])。这也可以工作,但感觉有点粗糙,我仍然必须运行数据库中的所有脚本。

+1

在纯Java中,您寻求的动力可以通过使用OSGi – earcam

+0

来实现,因此我想创建一个类似于插件系统的奖项?每个奖项都是服务器在Jar中调用的接口,然后检查用户是否应该获得奖励。但是,什么是加载性能的影响,每次检查20个罐子,每个都有奖项?或者我可以做缓存...... mmmm –

+0

j.w.为什么你关心装20个罐子?这是服务器启动时的一次性惩罚(这是服务器代码的权利?)。此外,要有效地从jar文件加载您的类,请参阅:http://download.oracle.com/javase/1.3/docs/guide/jar/jar.html#Index%20File%20Specification –

回答

6

如果我是你,我会有一个完全独立的过程,授予奖励。它可能每天在包含所有玩家/游戏数据的底层数据库上运行一次。

您的核心面向客户的应用程序知道奖励,但它所知道的是从数据库加载的数据 - 如标题,图像,描述,可能有多少人获得奖励等,以及(基于数据库表格)获奖者。

您的“授予权”过程只需按批处理模式运行,每天一次/小时等,并为合格玩家授予新奖项。然后面向客户的核心应用程序会通知他们,但实际上并不需要知道如何授予他们的智慧。这让您可以随时自由重新编译和重新运行您的奖项大师,无需核心应用程序影响。

另一种方法,取决于您的奖励受到多少约束,将编写一个简单的规则接口,允许您定义数据中的规则。这对于实现你所描述的内容来说是理想的,但在我看来,这对于没有多少奖励来说是相当多的工作。

PS - 在运行诸如在线扑克服务器之类的东西时,您会一直遇到此问题的版本。您绝对需要开发一种部署新代码的方式,而不会导致您的服务中断或停机时间窗口。围绕一个以Java为中心的代码解决方案来获得奖励并不会为您长期解决这个问题。您应该查看有关运行真正24/7服务的文献,解决该问题的方法有很多,现在其实并不困难。

+0

感谢一些好的提示。虚空甚至想到有一个单独的流程来处理奖励逻辑。试图谷歌搜索一些信息,但找不到任何有用的东西,你可能会指点我的一些文献,因为我真的很感兴趣,看看如何一些公司实现24/7服务。 –

+0

我认为分离方法是最好的。没有理由在每次看到用户时都需要进行计算,一天一次都没问题,然后下次登录服务器时就会看到此人已被授予奖励。 – nflacco

+0

谢谢。让我想一点。想要在你和其他答案之间分割它,但只能奖励一个,而你给了我第一个见解。 –

2

据我了解,您可能不需要从应用程序运行外部进程,也不需要使用OSGI。 只需创建一个简单的Java接口并实现每个插件('奖励')作为实现接口的类。然后您可以简单地编译任何新插件,并使用Class.forName(String className)在运行时从应用程序中将它作为类文件加载。 您需要从这样的插件中获取的任何逻辑都将包含在接口的方法中。

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

+0

我同意你的回答,但是,我还想补充一点,使用标准化系统(例如OSGI)来加载插件会使开发人员重新维护这些代码。的Class.forName(...)作为一个例子很容易编写,但是当涉及到错误处理时,实例管理变成了一场噩梦,突然之间你花时间解决了已经解决的问题(例如,由OSGI)而不是你的游戏。 –

3

有许多的选择,我能想到的:如上所述

  • OSGi的 - 这是有代价的,但可能是最通用的,动态的解决方案在那里
  • 如果您打开重新启动(只是不重新编译),一个众所周知的文件夹和弹簧的瓶子集合给你一个更便宜,但同样通用的解决方案。只需让你的奖励实现一个标准的界面,豆,让春天的形象@Autowire所有可用的奖项进入你的检查。
  • 如果您的奖励执行是相当标准的,奖励之间的唯一差异是规则本身,您可以进行某种脚本配置。那里有很多选择,从你描述的python(除了我会为管理所有奖项的几个大脚本),到基本的正则表达式,LUA和Drools在中间。在所有情况下,您都在寻找某种规则引擎架构,该规则引擎架构在奖励可触发的方面具有灵活性,但在奖励可能导致的(即完美成就)方面不提供很大的灵活性。
3

一些评论答案与批次的想法: Implementing a Dynamic Award System

该批处理过程可以在单独的服务器/设备,这样你就可以重新编译应用程序或在任何时间重新启动服务器。通过添加罐子和重新启动服务器等方式,可以使用上述方法来处理新奖项,还可以随时引入新的批处理作业等。因此,您的核心应用程序正在运行99%的时间,批处理服务器可以经常重新启动。所以单独的批处理机器是很好的。

当您需要部署新版本的核心应用程序时,我认为您可以停止,部署并启动维护通知给用户。即使是顶级扑克室也可以使用这种方法,例如FullTiltPoker这样做,现在由于许可证丢失而停止使用,但是他们的网站上说'System Update':))。

因此,版本更新的一种方法是在非工作时间重新部署/重新启动。

另一种方法是实时更新。通常,它是通过将用户逐一迁移到新版本来完成的。所以同时一些用户使用旧版本,一些新的。对于扑克软件来说不是很酷,不同版本的用户可以互动。但是,如果您确定版本的“兼容性”,则可以采用该方法,例如在登录时检查用户的客户端版本。

在我的回答中,我试图说你不需要为你的代码引入24/7支持逻辑。为硬件留下系统可用性问题(故障转移,负载均衡等)。您可以遵循任何用于编写代码的好技术,只需要记住关键的核心逻辑不会频繁部署(例如每周一次),并且可以随时更新/重新启动批处理部分(如果需要的话)。

+1

感谢对其他答案的很好的扩展。 –

+0

想给你一些赏金,但只能给一个答案。谢谢! –