考虑问题:
我有 n 个 Tomcat 节点,其中 Web 应用程序提供一些无状态内容。例如,对于 1000 个第一个请求,应用程序必须用“a”响应,接下来的 10000 个请求用“b”响应,其余的 - 用“c”响应。
我首先考虑消息传递:应用程序从一些存储中获取总服务计数 -> 如果它小于 n 则提供内容'a' -> 一旦内容被提供,应用程序发送一条消息 -> 消息被消费 -> 总服务计数在某些存储上增加 -> ... 但是在这种情况下,由于消息服务事件和存储上的计数器增量之间存在轻微(或巨大的加载时间)延迟,因此超调的可能性很大。
然后我考虑设置 memcached-session-manager 以将计数器存储在某种共享 session 中。但这对于我的简单案例来说似乎很重。
有人可以建议是否有任何直接的方式让多个 JVM 实例可以相互通信(什么适用于我的情况)?
最佳答案
如果它绝对必须正确并且您不想延迟,那么我认为 Redis 或 Hazlecast 是您的最佳选择。 <强> 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/