我正在开发一个多用户Java Web应用程序,通过传递将在我们的服务器上在沙盒中执行的代码,客户端可以使用webapp API来执行潜在的顽皮内容。
例如,客户端可能会编写一个影响其他客户端性能的紧密while(true)循环。
你们能想出办法将这些行为造成的损害限制在其他客户的表现吗?
我们正在将Glassfish用于我们的应用程序服务器。
答案 0 :(得分:2)
暂停问题表明,计算机无法可靠地识别不会终止的代码。
可靠地执行此操作的唯一方法是在单独的JVM中执行代码,然后在操作系统超时时请求操作系统关闭。 JVM没有超时可以处理更多任务,因此您可以重复使用它。
答案 1 :(得分:2)
另一个想法是字节码检测。在加载客户端发送的代码之前,请对其进行操作,以便在每个循环和每个方法调用(或方法条目)中添加一个短暂的休眠。
这可以避免客户端堵塞整个CPU,直到完成为止。当然,它们仍然会阻塞一个Thread对象(占用一些内存),而且每个客户端都会减速,而不仅仅是恶意客户端。也许让第一个尝试自由,然后每次尝试缩放等待时间(如果线程必须等待其他原因,再将其设置为下一步)。
答案 2 :(得分:1)
现代应用服务器使用线程池来获得更好的性能。问题是,一个坏苹果可以破坏这一堆。您需要的是一个具有一个线程或每个请求进程的应用服务器。当然会有折衷。但操作系统将处理确保处理时间均匀分配 注意:在研究了一点之后,您需要的是一个引擎,它将根据请求创建另一个进程。如果不是,用户可以通过使用无限循环的servlet然后发布多个请求来削弱servlet引擎。或者他可以简单地在他的代码中执行System.exit并让所有人都失望。
答案 3 :(得分:1)
您可以使用父线程在已建议的单独线程中启动每个请求,但随后使用ThreadMXBean类监视线程使用的CPU时间。然后你可以让父线程杀死任何行为不端的线程。当然,如果您可以为线程应该或不应该使用多少CPU时间建立某种合理的标准。也许规则可能是某个初始时间加上每秒挂钟时间的额外金额是否合适?
我会让这些客户端请求线程的优先级低于负责监视它们的线程。