Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 内存中数据管理的最佳选择_Java_In Memory Database - Fatal编程技术网

Java 内存中数据管理的最佳选择

Java 内存中数据管理的最佳选择,java,in-memory-database,Java,In Memory Database,背景: 我正在开发一个基于web的应用程序,它是在SpringMVC和Angular中构建的。我们有一个服务台模块,代理使用该模块进行客户服务。应用程序部署在单个服务器上。我们有一个票证锁定机制,即当一个代理打开一张票证开始处理它时,票证被锁定到该代理,以便其他代理不能同时处理同一张票证。一旦代理关闭票据,其他代理就可以打开票据并根据需要进行更新。为了避免过多的DB调用,我们已经实现了ConcurrentHashMap,这样每个人都可以使用相同的映射更新锁定票证,这是非常好的 问题: 现在,该应

背景: 我正在开发一个基于web的应用程序,它是在SpringMVC和Angular中构建的。我们有一个服务台模块,代理使用该模块进行客户服务。应用程序部署在单个服务器上。我们有一个票证锁定机制,即当一个代理打开一张票证开始处理它时,票证被锁定到该代理,以便其他代理不能同时处理同一张票证。一旦代理关闭票据,其他代理就可以打开票据并根据需要进行更新。为了避免过多的DB调用,我们已经实现了
ConcurrentHashMap
,这样每个人都可以使用相同的映射更新锁定票证,这是非常好的

问题: 现在,该应用程序部署在两个不同的服务器上,而该
ConcurrentHashMap
不起作用,因为每个服务器都维护该映射。如果用户使用节点1锁定票据,并且第二个用户的请求转到节点2,则此方法将不起作用。为了避免这种情况,我们计划改变流程,以便避免此类问题。同时,我们不想将这个锁定细节直接保存到DB以避免DB IO,因为它是应用程序的一个非常频繁的使用区域

选项 在做了一些研究和开发之后,我得到了以下我们可以实现的选项,记住了持久性

  • 我们可以使用MSSQL或Redis实现内存中表的概念
  • 兔子
  • 我们可以实现一个API,该API将部署在单个节点上,我们的两台服务器都将使用该API来维护锁定票据,但我们仍然存在两个问题:调用此API需要花费时间;其次,它无法持久保存数据;如果服务器重新启动,我们将丢失数据
  • 谁能告诉我哪种方法适合上述情况以及如何实施。我只需要一个创业公司


    提前谢谢。

    我想你真正的问题是:

    用于锁定票证以避免过多的DB调用[您决定不使用数据库]

    依我看,那是个错误。获取票据“锁”的数据库调用不太可能导致太多的数据库调用

    在分析这一点的时候,你需要考虑有多少人会想要开始买票,并且经常有可能因为一些人已经在买票而失败。我不知道您的用例细节,但如果后一个事件每秒发生一次以上,我会非常惊讶

    如果您的数据库不能支持每秒一个“小”数据库操作(最坏的情况!)进行锁定,那么它将无法支持创建票据、代理更新票据、用户读取票据等过程中涉及的较大事务

    因此,建议如下:

  • 计算出票证锁定的实际数据库负载是多少。。。相对于数据库需要做的所有其他事情

  • 如果它很小,只需返回数据库进行票证锁定。保持简单

  • 如果是大的,;要么:

    • 放大或缩小现有数据库;e、 g.使用切分。看来无论如何你都需要这样做。这将为您提供使用现有数据库进行锁定的“净空”

    • 为锁定创建单独的数据库服务器。它不太可能需要很大,而且我无法想象它需要非常快。(见下文!!)

    • 使用您建议的解决方案之一


  • 但我的主要建议是避免过早优化的陷阱。你似乎在设计瓶颈,你认为这些瓶颈在没有任何明确证据的情况下会存在。例如:

    “我们可以实现一个将部署在单个节点上的API,我们的两台服务器都将使用该API来维护锁定票证,但我们仍然存在此调用API的[问题]需要时间…”

    除非花费的时间是几秒钟,否则这不太可能是一个真正的问题。最好的策略是首先以简单的方式实现系统,然后测量性能,以查看1)优化工作是否合理,2)整个系统中真正的瓶颈在哪里

    在你的情况下,我怀疑用户是否会在意(比如)告诉别人别人已经在处理一张罚单需要(比如)1秒而不是2秒



    最后,使用现有的现成售票系统不是更简单吗?他们中有很多人。商业产品、开源、托管等等。(好吧,现在这样做可能已经太晚了,因为听起来你承诺从头开始实施自己的票务系统。但重新考虑你的策略可能还不晚。)

    我认为你真正的问题是:

    用于锁定票证以避免过多的DB调用[您决定不使用数据库]

    依我看,那是个错误。获取票据“锁”的数据库调用不太可能导致太多的数据库调用

    在分析这一点的时候,你需要考虑有多少人会想要开始买票,并且经常有可能因为一些人已经在买票而失败。我不知道您的用例细节,但如果后一个事件每秒发生一次以上,我会非常惊讶

    如果您的数据库不能支持每秒一个“小”数据库操作(最坏的情况!)进行锁定,那么它将无法支持创建票据、代理更新票据、用户读取票据等过程中涉及的较大事务

    因此,建议如下:

  • 计算出票证锁定的实际数据库负载是多少。。。相对于数据库需要做的所有其他事情

  • 如果它很小,只需返回数据库进行票证锁定。保持简单

  • 如果是大的,;或者: