使用有状态Web服务器是否有意义?

时间:2010-12-30 13:56:30

标签: web-applications architecture scalability

我正在开发一个Web应用程序,它历史上构建在PHP / MySQL堆栈上。

应用程序的其中一个关键操作必须进行一些繁重的计算,这需要迭代整个数据库表的每一行。毋庸置疑,这是一个严重的瓶颈。所以决定用Java重写整个过程。

这给了我们两个好处。一个是Java作为一种语言,比PHP过程快得多。第二个是我们可以在Java应用程序服务器内存中维护整个数据集。所以现在我们可以在内存中进行计算繁重的操作,一切都发生得更快。

这已经工作了一段时间,直到我们意识到我们需要扩展,所以我们现在需要更多的Web服务器。

问题是 - 按照目前的设计,它们都必须保持完全相同的状态。它们都查询数据库,处理数据并将其保存在内存中。但是当您需要更改此数据时会发生什么?所有服务器如何保持一致性?

这种架构对我来说似乎有缺陷。将所有数据保存在内存中的性能优势是显而易见的,但这严重阻碍了可扩展性。

这里的选项有哪些?切换到内存中的键值数据存储?我们应该完全放弃在Web服务器中保持状态吗?

4 个答案:

答案 0 :(得分:4)

现在切换到Erlang: - )

是的,那是个笑话;但有一点道理。问题是:您最初的状态是在外部共享存储库中:数据库。现在,您在内部非共享存储库中(部分地)预先计算了它:Java RAM对象。显而易见的方法是让它仍然预先计算,但在外部共享存储库中,越快越好。

一个简单的答案是memcached。

另一种方法是构建自己的“计算服务器”,它集中了计算任务和(部分)结果。 Web前端进程只访问此服务器。在Erlang中,这将是自然的方式。在其他语言中,你可以做到,更多的工作。检查ZeroMQ的灵感,即使你最终没有使用它(但这是一个非常好的实现)。

答案 1 :(得分:1)

这可能是陈词滥调,但数据总是会扩展以填充您放入的空间。您的数据今天可能都适合内存但我保证在将来的某个时间不会。你需要多长时间才能找到更好的架构。您的申请的有状态只是这个更大问题的症状。

每个人都对整个数据集进行不同的计算吗?这是你可以在一夜之间批量做的事情吗?白天有人可以访问吗?时间敏感度如何?

我认为这些是你需要回答的问题,因为在某些时候你将无法购买足够的记忆来存储你需要的数据。鉴于你现在的位置,这可能听起来很愚蠢,但你应该计划这是真的。我所谈过的许多开发人员并没有考虑成功的样子以及它对他们设计的影响。

答案 2 :(得分:1)

我同意你的观点 - 这听起来很有缺陷,但我需要更多细节才能确定。

你提到了一个大数据集和繁重的计算,但你没有谈论数据如何更新,计算完成时,是一天的数据还是整个数据集等。听起来像是很像批量工作,可以每天离线完成。

如果是这样的话,我不确定网络在哪里。在完成运算后,您的Web用户是否只是在进行自定义查询?数据是只读还是主要是供用户使用?或者他们是在不断改变数据?

我想知道你选择的持久性技术是否会影响事物?也许NoSQL替代方案可能更适合您的问题 - 就像分布式MongoDB集群一样。

答案 3 :(得分:1)

这是一个数据引擎问题,我相信,这是一个网络服务器分发问题。为什么你的(中央)数据库引擎不能进行计算(足够快)?

您可以存储预先计算的值,这些值在基础数据更改时被标记为陈旧,需要重新计算。当数据发生变化时,无需重新计算。您只需要管理更改发生的时间和方式,因为它会影响数据的使用者。