如何计算给定会话日志的峰值并发用户

Posted

技术标签:

【中文标题】如何计算给定会话日志的峰值并发用户【英文标题】:How to calculate peak concurrent users given session log 【发布时间】:2021-04-12 20:13:55 【问题描述】:

我有一个会话开始时间、会话结束时间和持续时间(以小时为单位)。我正在尝试找出一种按小时查找并发用户数量的方法。

我使用了一种蛮力方法,该方法会根据所有行检查每个小时的存储桶以查看它是否符合条件(如果开始时间在存储桶内,如果结束时间在存储桶内,或者会话是否开始并在桶外结束)

我还使用了一种自加入方法,我在 *** 上的许多其他类似讨论线程中发现了这种方法,但结果与我的蛮力方法略有不同。

基本上,我正在尝试寻找是否有一种方法可以准确地找到并发用户而无需暴力(循环 x 记录 y 小时)。

【问题讨论】:

请提供样本数据和期望的结果。 【参考方案1】:

这就是你所说的蛮力,但并不可怕

with sample as (
select timestamp('2020-01-01 05:50:00') as session_start_time,timestamp('2020-01-01 05:59:00') session_end_time union all
select timestamp('2020-01-01 04:51:00') as session_start_time,timestamp('2020-01-01 05:58:00') session_end_time union all
select timestamp('2020-01-01 03:52:00') as session_start_time,timestamp('2020-01-01 05:57:00') session_end_time union all
select timestamp('2020-01-01 02:53:00') as session_start_time,timestamp('2020-01-01 05:56:00') session_end_time union all
select timestamp('2020-01-01 01:54:00') as session_start_time,timestamp('2020-01-01 05:55:00') session_end_time union all
select timestamp('2020-01-01 05:55:00') as session_start_time,timestamp('2020-01-01 05:56:00') session_end_time 

), base as (
select 
session_start_time, session_end_time, row_number() over( order by session_start_time) ses_id
from sample

),
buckets as (
select timestamp_trunc(ts, hour) bucket  from 
unnest(GENERATE_TIMESTAMP_ARRAY((select TIMESTAMP_SUB(min(session_start_time), interval  1 hour)  from sample), 
(select TIMESTAMP_ADD(max(session_end_time), interval  1 hour)  from sample), INTERVAL 1 hour )) ts
 
)

select bucket, count(distinct if(buckets.bucket between base.session_start_time and base.session_end_time, ses_id,null))
from buckets 
cross join base  
group by 1

【讨论】:

以上是关于如何计算给定会话日志的峰值并发用户的主要内容,如果未能解决你的问题,请参考以下文章

在从日志条目创建的会话表中查找并发用户

IIS / .Net 仅允许对给定用户会话的单个并发响应

计算并发用户数的五种方法

oracle 如何限定用户并发会话数

App Engine 和 Spring Security:并发会话

一天中每小时的 SQL 最大并发会话数