0

这更像是一个概念性问题,但也欢迎针对(JBoss 等)等开源产品的特定答案。

如果我的企业应用程序需要扩展并且我想选择横向扩展模型(而不是纵向扩展)模型,那么多个应用服务器实例将如何保留一段代码/数据的单例语义?

示例:假设我有一个 ID 生成类,其逻辑要求将其实例化为单例。此类可能会或可能不会与底层数据库对话。现在,我将如何确保在向外扩展时维护此类的单例语义?

其次,是否有一本书或在线资源既列出了这些概念性问题又提出了解决方案?

编辑:一般来说,如何处理应用服务器层中的通用应用程序状态以允许应用程序横向扩展?我应该进一步探索哪些设计模式、软件组件/产品等?

4

1 回答 1

1

你越往外扩展,你就越不能以原子方式管理全局静态。换句话说,如果您有 100 台服务器需要共享状态(知道在 ID 生成单例类中下一个 ID 是哪个 ID),那么我所知道的没有一种技术可以快速、原子地为您获取该 ID。

关于 ID 生成,数据必须在机器之间传输。

对于您提到的场景,我可以想到几个选项:

  1. 在接受新 ID 之前等待所有机器赶上/同步。您可以在本地生成 ID,然后检查它在其他机器上是否良好 - 或者 - 运行作业以在所有机器上获取下一个 ID(想想 map/reduce)。

  2. 考虑分片。通过分片,您可以“本地”生成 ID,并保证具有唯一性。因此,如果您有 100 台机器,那么 1-10 台机器是供加利福尼亚用户使用的,11-20 台机器是供纽约用户使用的,等等。选择一个分片键可能很困难。

  3. 开始寻找消息系统。您将在机器上本地创建/修改您的对象,然后将结果发送到服务总线/消息传递系统,其他机器订阅主题/队列并可以获得对象并处理它。

  4. 选择一个水平可扩展的数据库来管理对象。他们已经解决了同步和复制的问题。

于 2013-07-24T16:29:22.543 回答