【发布时间】:2016-01-13 16:01:08
【问题描述】:
在我的 J2EE Web 应用程序中,我必须将每个 Web API 调用的计数发送到一个隔离线程以计算调用次数。可能性包括:
a) 使用原子长。如果我在一分钟内有数百万个电话,我认为这会引起争用。因为,所有线程都会尝试更新单个变量。
b) 使用共享队列。每个请求处理线程都会插入到队列中,并且专用的计数器线程将从该队列中出列并增加计数。
c) 使用 actor 模型,比如使用 Akka 库。向actor发送一条异步消息,这会将其添加到计数中。
我的问题是方法 (b) 与 (c) 相比如何。优缺点是什么,在低层有什么不同?
【问题讨论】:
-
你一分钟会有几百万个电话?
-
目前有 200 万次通话。接下来,可能需要存储除计数之外的更多指标。所以,设计应该是可扩展的。
-
如果只是计数,请使用 LongAdder。每分钟数百万并不多。
-
另外,在网络应用程序的性能非常关键的情况下,我可以有很多这样的计数?这不会因为太多的共享变量和线程间的争用而使应用程序混乱吗?
标签: java multithreading asynchronous concurrency actor-model