我有一个处理会话的分布式系统(会话的定义对于这个问题并不重要,只是注意到它的持续时间大于一秒钟,通常要大得多),其中我想确定在给定时间内并发处理的会话数量最多的是什么。
基本设置是Redis数据库,在该数据库中,我为每个会话开始增加一个计数器,并在每个会话结束时减少计数器。因此,计数器值表示任何给定时间点上的当前并发性。
我的问题是如何在给定的时间片上生成峰值( max )并发的精确度量(例如,给定一天中的最大并发性是什么)。
我想听听其他人如何解决这个问题,但我现时的做法如下:
会话启动
INCR counter-name以增加计数器的当前值ZADD collector-name NX <counterval> <uniqueid>将当前已知的并发值存储在有序集中。Flake-id可以用于快速的id代,但是如果会话已经有一个唯一的ID --这通常是这样的--我们就可以使用它。会话结束
DECR counter-name每一报告期间
RENAME collector-name tempkey以获取状态快照,并允许工作人员启动新的收集器。ZREVRANGEBYSCORE tempkey +inf -inf WITHSCORES LIMIT 0 1,返回自上次检查以来计数器的峰值(以及导致峰值的会话的唯一id (如果相关的话)。DEL tempkey,因为我们不再需要它了。备注:
n是当前期间的条目数,所以我们可以增加报告频率来提高性能(好的副作用--让我们通过生成更多的数据来提高性能!)在这个设置中有我错过的缺陷吗?
发布于 2017-12-11 14:20:58
我没有发现流程中的任何主要缺陷,但是数据结构的选择可以得到改进。
排序集在空间和时间方面比较昂贵,而且您的场景没有利用它们的特殊能力(即排序)。更优化的结构将是计数器的散列,或高度压缩的BITFIELD。
https://stackoverflow.com/questions/47748475
复制相似问题