Yuv*_*dam 9 architecture scalability web-applications
我正在开发一个Web应用程序,它历史上构建在PHP/MySQL堆栈上.
其中一个应用程序的关键操作必须进行一些繁重的计算,这需要迭代整个数据库表的每一行.毋庸置疑,这是一个严重的瓶颈.所以决定用Java重写整个过程.
这给了我们两个好处.一个是Java作为一种语言,比PHP过程快得多.第二个是我们可以在Java应用程序服务器内存中维护整个数据集.所以现在我们可以在内存中进行计算繁重的操作,一切都发生得更快.
这工作了一段时间,直到我们意识到我们需要扩展,所以我们现在需要更多的Web服务器.
问题是 - 通过当前的设计,它们都必须保持完全相同的状态.它们都查询数据库,处理数据并将其保存在内存中.但是当您需要更改此数据时会发生什么?所有服务器如何保持一致性?
这种架构对我来说似乎有缺陷.将所有数据保存在内存中的性能优势是显而易见的,但这严重阻碍了可伸缩性.
这里有什么选择?切换到内存中的键值数据存储?我们应该完全放弃在Web服务器中保持状态吗?
现在切换到 Erlang :-)
是的,那是个笑话;但有一点道理。问题是:您最初将状态存储在外部共享存储库中:数据库。现在,您已经(部分)在内部非共享存储库中预先计算了它:Java RAM 对象。最明显的方法是仍然预先计算它,但在外部共享存储库中,速度越快越好。
一个简单的答案是 memcached。
另一种方法是构建自己的“计算服务器”,它集中计算任务和(部分)结果。Web 前端进程只访问该服务器。在 Erlang 中,这将是自然的方式。在其他语言中,你仍然可以做到,只是需要做更多的工作。检查 ZeroMQ 以获得灵感,即使您最终没有使用它(但它是一个非常好的实现)。