内存数据管理的最佳选择
Best option for in memory data management
背景:
我正在开发基于 Spring MVC 和 Angular 的基于 Web 的应用程序。我们有一个服务台模块,代理可以在其中为客户服务。该应用程序部署在单个服务器上。我们有一个工单锁定机制,即当代理人打开工单开始处理它时,工单会锁定到该代理人,以便其他代理人不能同时处理同一张工单。代理关闭工单后,其他代理可以根据需要打开和更新工单。为了锁定票证以避免过多的数据库调用,我们实施了 ConcurrentHashMap
以便每个人都可以使用相同的地图更新锁定票证,这绝对没问题。
问题:
现在该应用程序部署在两个不同的服务器上,并且此 ConcurrentHashMap
无法正常工作,因为 MAP 由每个服务器维护。如果用户使用 Node-1 锁定票证并且如果第二个用户的请求转到 node-2,则此方法将不起作用。为避免这种情况,我们计划更改流程以避免此类问题。同时,我们不想将此锁定详细信息直接保存到数据库以避免数据库 IO,因为它是应用程序非常频繁的使用区域。
选项
在进行了一些研发之后,我得到了以下我们可以实施的选项,请牢记持久性。
- 我们可以使用 MSSQL 或 Redis
实现 In-Memory table 概念
- RabbitMQ
- 我们可以实现一个 API ,它将部署在单个节点上,我们的两个服务器都将使用它来维护锁定票证,但是我们仍然有两个问题,这个调用 API 将是花费时间,第二它不持久化数据,如果服务器重新启动我们将丢失数据。
谁能告诉我哪种方法适合上述情况以及如何实施。我只需要一个启动。
提前致谢。
我认为你真正的问题是:
For locking ticket to avoid too much DB calls [ you decided not to use the database ].
IMO,这是一个错误。获取票证“锁”的数据库调用不太可能导致过多的数据库调用。
在对此进行分析时,您需要考虑某人想要开始处理工单的频率,以及由于有人已经在处理工单而可能失败的频率。我不知道你的用例细节,但如果后一个事件发生的频率超过每秒一次,我会感到非常惊讶。
如果您的数据库无法维持每秒一次“小型”数据库操作(最坏的情况!)进行锁定,那么它将无法维持创建票证、代理更新票证、用户读取票证所涉及的较大事务,等等。
所以建议是:
算出票证锁定的实际数据库负载是多少……相对于数据库需要做的所有其他事情。
如果小的话,回数据库锁票就好了。保持简单!
如果大;或者:
扩展或扩展现有数据库;例如使用分片。看来您无论如何都需要这样做。这应该给你“余量”来使用现有的数据库进行锁定。
为锁定创建一个单独的数据库服务器。它不太可能需要很大,而且我无法想象它需要非常快。 (见下文!!)
使用您提出的解决方案之一。
但我的主要建议是避免过早优化的陷阱。您似乎在针对您 认为 存在的瓶颈进行设计,但没有任何明确的证据证明这一点。例如:
"We can implement an API that will be deployed on a single node and both of our servers will use that to maintain locking tickets but we still have [the problem] with this calling API would be time taking ..."
除非花费的时间是几秒,否则这不太可能成为真正的问题。最好的策略是首先以简单的方式实施系统,然后测量性能以查看 1) 是否需要优化工作以及 2) complete 系统中真正的瓶颈在哪里。
在你的情况下,我怀疑用户是否会关心是否需要(比如说)1 秒而不是 2 秒才能被告知其他人已经在处理工单。
最后,使用现成的票务系统不是更简单吗?那里有很多。商业产品、开源、托管等。 (好的,这可能为时已晚,因为听起来您似乎致力于从头开始实施自己的票务系统。但重新考虑您的策略可能还为时不晚。)
背景:
我正在开发基于 Spring MVC 和 Angular 的基于 Web 的应用程序。我们有一个服务台模块,代理可以在其中为客户服务。该应用程序部署在单个服务器上。我们有一个工单锁定机制,即当代理人打开工单开始处理它时,工单会锁定到该代理人,以便其他代理人不能同时处理同一张工单。代理关闭工单后,其他代理可以根据需要打开和更新工单。为了锁定票证以避免过多的数据库调用,我们实施了 ConcurrentHashMap
以便每个人都可以使用相同的地图更新锁定票证,这绝对没问题。
问题:
现在该应用程序部署在两个不同的服务器上,并且此 ConcurrentHashMap
无法正常工作,因为 MAP 由每个服务器维护。如果用户使用 Node-1 锁定票证并且如果第二个用户的请求转到 node-2,则此方法将不起作用。为避免这种情况,我们计划更改流程以避免此类问题。同时,我们不想将此锁定详细信息直接保存到数据库以避免数据库 IO,因为它是应用程序非常频繁的使用区域。
选项 在进行了一些研发之后,我得到了以下我们可以实施的选项,请牢记持久性。
- 我们可以使用 MSSQL 或 Redis 实现 In-Memory table 概念
- RabbitMQ
- 我们可以实现一个 API ,它将部署在单个节点上,我们的两个服务器都将使用它来维护锁定票证,但是我们仍然有两个问题,这个调用 API 将是花费时间,第二它不持久化数据,如果服务器重新启动我们将丢失数据。
谁能告诉我哪种方法适合上述情况以及如何实施。我只需要一个启动。
提前致谢。
我认为你真正的问题是:
For locking ticket to avoid too much DB calls [ you decided not to use the database ].
IMO,这是一个错误。获取票证“锁”的数据库调用不太可能导致过多的数据库调用。
在对此进行分析时,您需要考虑某人想要开始处理工单的频率,以及由于有人已经在处理工单而可能失败的频率。我不知道你的用例细节,但如果后一个事件发生的频率超过每秒一次,我会感到非常惊讶。
如果您的数据库无法维持每秒一次“小型”数据库操作(最坏的情况!)进行锁定,那么它将无法维持创建票证、代理更新票证、用户读取票证所涉及的较大事务,等等。
所以建议是:
算出票证锁定的实际数据库负载是多少……相对于数据库需要做的所有其他事情。
如果小的话,回数据库锁票就好了。保持简单!
如果大;或者:
扩展或扩展现有数据库;例如使用分片。看来您无论如何都需要这样做。这应该给你“余量”来使用现有的数据库进行锁定。
为锁定创建一个单独的数据库服务器。它不太可能需要很大,而且我无法想象它需要非常快。 (见下文!!)
使用您提出的解决方案之一。
但我的主要建议是避免过早优化的陷阱。您似乎在针对您 认为 存在的瓶颈进行设计,但没有任何明确的证据证明这一点。例如:
"We can implement an API that will be deployed on a single node and both of our servers will use that to maintain locking tickets but we still have [the problem] with this calling API would be time taking ..."
除非花费的时间是几秒,否则这不太可能成为真正的问题。最好的策略是首先以简单的方式实施系统,然后测量性能以查看 1) 是否需要优化工作以及 2) complete 系统中真正的瓶颈在哪里。
在你的情况下,我怀疑用户是否会关心是否需要(比如说)1 秒而不是 2 秒才能被告知其他人已经在处理工单。
最后,使用现成的票务系统不是更简单吗?那里有很多。商业产品、开源、托管等。 (好的,这可能为时已晚,因为听起来您似乎致力于从头开始实施自己的票务系统。但重新考虑您的策略可能还为时不晚。)