Java 内存中数据管理的最佳选择
背景: 我正在开发一个基于web的应用程序,它是在SpringMVC和Angular中构建的。我们有一个服务台模块,代理使用该模块进行客户服务。应用程序部署在单个服务器上。我们有一个票证锁定机制,即当一个代理打开一张票证开始处理它时,票证被锁定到该代理,以便其他代理不能同时处理同一张票证。一旦代理关闭票据,其他代理就可以打开票据并根据需要进行更新。为了避免过多的DB调用,我们已经实现了Java 内存中数据管理的最佳选择,java,in-memory-database,Java,In Memory Database,背景: 我正在开发一个基于web的应用程序,它是在SpringMVC和Angular中构建的。我们有一个服务台模块,代理使用该模块进行客户服务。应用程序部署在单个服务器上。我们有一个票证锁定机制,即当一个代理打开一张票证开始处理它时,票证被锁定到该代理,以便其他代理不能同时处理同一张票证。一旦代理关闭票据,其他代理就可以打开票据并根据需要进行更新。为了避免过多的DB调用,我们已经实现了ConcurrentHashMap,这样每个人都可以使用相同的映射更新锁定票证,这是非常好的 问题: 现在,该应
ConcurrentHashMap
,这样每个人都可以使用相同的映射更新锁定票证,这是非常好的
问题:
现在,该应用程序部署在两个不同的服务器上,而该ConcurrentHashMap
不起作用,因为每个服务器都维护该映射。如果用户使用节点1锁定票据,并且第二个用户的请求转到节点2,则此方法将不起作用。为了避免这种情况,我们计划改变流程,以便避免此类问题。同时,我们不想将这个锁定细节直接保存到DB以避免DB IO,因为它是应用程序的一个非常频繁的使用区域
选项
在做了一些研究和开发之后,我得到了以下我们可以实现的选项,记住了持久性
提前谢谢。我想你真正的问题是: 用于锁定票证以避免过多的DB调用[您决定不使用数据库] 依我看,那是个错误。获取票据“锁”的数据库调用不太可能导致太多的数据库调用 在分析这一点的时候,你需要考虑有多少人会想要开始买票,并且经常有可能因为一些人已经在买票而失败。我不知道您的用例细节,但如果后一个事件每秒发生一次以上,我会非常惊讶 如果您的数据库不能支持每秒一个“小”数据库操作(最坏的情况!)进行锁定,那么它将无法支持创建票据、代理更新票据、用户读取票据等过程中涉及的较大事务 因此,建议如下:
- 放大或缩小现有数据库;e、 g.使用切分。看来无论如何你都需要这样做。这将为您提供使用现有数据库进行锁定的“净空”
- 为锁定创建单独的数据库服务器。它不太可能需要很大,而且我无法想象它需要非常快。(见下文!!)
- 使用您建议的解决方案之一
但我的主要建议是避免过早优化的陷阱。你似乎在设计瓶颈,你认为这些瓶颈在没有任何明确证据的情况下会存在。例如: “我们可以实现一个将部署在单个节点上的API,我们的两台服务器都将使用该API来维护锁定票证,但我们仍然存在此调用API的[问题]需要时间…” 除非花费的时间是几秒钟,否则这不太可能是一个真正的问题。最好的策略是首先以简单的方式实现系统,然后测量性能,以查看1)优化工作是否合理,2)整个系统中真正的瓶颈在哪里 在你的情况下,我怀疑用户是否会在意(比如)告诉别人别人已经在处理一张罚单需要(比如)1秒而不是2秒
最后,使用现有的现成售票系统不是更简单吗?他们中有很多人。商业产品、开源、托管等等。(好吧,现在这样做可能已经太晚了,因为听起来你承诺从头开始实施自己的票务系统。但重新考虑你的策略可能还不晚。)我认为你真正的问题是: 用于锁定票证以避免过多的DB调用[您决定不使用数据库] 依我看,那是个错误。获取票据“锁”的数据库调用不太可能导致太多的数据库调用 在分析这一点的时候,你需要考虑有多少人会想要开始买票,并且经常有可能因为一些人已经在买票而失败。我不知道您的用例细节,但如果后一个事件每秒发生一次以上,我会非常惊讶 如果您的数据库不能支持每秒一个“小”数据库操作(最坏的情况!)进行锁定,那么它将无法支持创建票据、代理更新票据、用户读取票据等过程中涉及的较大事务 因此,建议如下: