java - 如何跨多个 JVM 节点实现计数器的最简单/最快的方法

标签 java tomcat jvm

考虑问题:

我有 n 个 Tomcat 节点,其中 Web 应用程序提供一些无状态内容。例如,对于 1000 个第一个请求,应用程序必须用“a”响应,接下来的 10000 个请求用“b”响应,其余的 - 用“c”响应。

我首先考虑消息传递:应用程序从一些存储中获取总服务计数 -> 如果它小于 n 则提供内容'a' -> 一旦内容被提供,应用程序发送一条消息 -> 消息被消费 -> 总服务计数在某些存储上增加 -> ... 但是在这种情况下,由于消息服务事件和存储上的计数器增量之间存在轻微(或巨大的加载时间)延迟,因此超调的可能性很大。

然后我考虑设置 memcached-session-manager 以将计数器存储在某种共享 session 中。但这对于我的简单案例来说似乎很重。

有人可以建议是否有任何直接的方式让多个 JVM 实例可以相互通信(什么适用于我的情况)?

最佳答案

如果它绝对必须正确并且您不想延迟,那么我认为 RedisHazlecast 是您的最佳选择。 <强> Particularly Redis as it has atomic count like operations 。虽然理论上您可以对内存缓存执行相同的操作,但 Redis 是为这种确切用例(统计计数器)设计的。

您也可以使用像 H2 这样的内存数据库,或者将 Postgres 表设置为 unlogged或任何适用于您的 RDBMS 的东西,以在内存表中保持一个不那么安全的伪表。 RDBMS 的烦人之处在于 upserting aka MERGE 并非所有 RDBMS 都一致支持。

关于java - 如何跨多个 JVM 节点实现计数器的最简单/最快的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19182277/

相关文章:

java - 为什么赋值时只能创建没有 `new`的数组?

java - Apache Tomcat Servlet - 线程 "main"java.lang.ClassFormatError 中的异常

linux - JAVA_HOME 和 JRE_HOME 环境变量都没有定义

java - 在 Tomcat 中作为独立运行 Spring Hibernate 项目,在 STS IDE 中运行嵌入式 Tomcat

java - 在另一个 JVM 上执行 GC 的 RMI 程序

java - 重载泛型方法时 Java 5 和 6 之间的不同行为

java - Android 如何调用另一个类的方法

Java表达式非法开始和 'else',没有 'if'语法错误

java - 如何测试两个任意形状的重叠(或碰撞)

java - 从正在运行的 java 程序的内存中定位并读取特定类型的对象