Database 单例代码+;在横向扩展体系结构中处理数据?

Database 单例代码+;在横向扩展体系结构中处理数据?,database,singleton,scale,application-server,Database,Singleton,Scale,Application Server,这更像是一个概念性的问题,但对于开源产品(如JBoss等)的特定答案也很受欢迎 如果我的企业应用程序需要扩展,并且我希望选择扩展模型(而不是放大)模型,那么多个应用程序服务器实例如何保留一段代码/数据的单例语义 示例:假设我有一个ID生成类,其逻辑要求将其实例化为单例。此类可能与基础数据库通信,也可能不与基础数据库通信。现在,我如何确保在向外扩展时维护此类的单例语义 第二,是否有一本书或在线资源既列出了此类概念问题,又提出了解决方案 编辑:一般来说,如何处理应用服务器层中的通用应用程序状态以允许

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

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


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

第二,是否有一本书或在线资源既列出了此类概念问题,又提出了解决方案


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

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

就ID生成而言,数据必须从一台机器传输到另一台机器

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

  • 在接受新ID之前,请等待所有计算机赶上/同步。您可以在本地生成ID,然后检查其他计算机上的ID是否正常,或者运行作业以在所有计算机上获取下一个ID(想想map/reduce)

  • 想想切分吧。通过分片,您可以“本地”生成ID,并保证具有唯一性。所以,如果你有100台机器,1-10台机器是为加利福尼亚的用户准备的,11-20台机器是为纽约的用户准备的,等等。选择一个切分键可能很困难

  • 开始关注消息传递系统。您可以在机器上本地创建/修改对象,然后将结果发送到服务总线/消息传递系统,其他机器订阅主题/队列,并可以获取对象并对其进行处理

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


  • “我有一个ID生成类”-使用GUID,那么该类的需求就消失了…谢谢,但这是一个“让我们说”的情况。一般来说,这个问题是如何解决的?如果答案恰好是“首先要避免问题”,那我就没问题了,但我仍然希望得到web应用程序和缩放专家的确认。我不是想暗示你不是缩放专家,如果我传达了这个印象,我很抱歉。但我确实想要一份确认书,很明显你似乎给了我一份。但是,我的问题是,Apple Server层中的状态通常是如何允许应用程序扩展的?一种避免ID跳闸的标准技术是使用中间层中生成的GUID。一般州扩大的问题是另一个问题。我在原来的问题上添加了一个编辑。谢谢。我将把你的答案标记为最终答案,但是。。。您想说一两句关于处理应用程序服务器实例中的其他通用状态的话吗。。。因为ID只是一个例子?这显然是一个新手问题——我不知道开发人员是如何处理这个问题的!如果你愿意的话,我也可以单独问这个问题,但请尽快回来。状态和对象通常。。。现在NoSQL的趋势是采用最终一致的数据。其想法是,您的写操作最终将传播到您的水平可伸缩集群中的所有计算机,但在一段时间内。。。您的数据将不一致。如果您从一开始就这样想,那么编写代码的方式就会有所不同。YouTube上的一个简单例子:当你喜欢一个视频时,他们用Javascript将like计数增加1,然后开始写。他们给出的即时反馈看起来像是一个书面反馈,但实际的书面反馈还没有完成。感谢YT的例子。