统计多频道实时在线用户

需求

统计多个频道实时在线用户。

当前解决方案

浏览器轮询服务进程,服务端分别记录频道的最后存活时间和用户的最后存活时间。

频道活跃时间哈希表 live:activity <activityId> <lastActivityTimestamp>
用户活跃时间哈希表 live:activity:<activityId>:user <userId> <lastActivityTimestamp>

统计进程定时统计活跃频道的活跃用户信息。

存在的问题

如何扩容:当单进程无法处理当前的实时数据时,如何扩展至多进程,而不出现单个频道在单位时间(一分钟)内被多次统计的问题。
如何容错:当一个进程出错挂掉(出现异常,或者是机器损坏),如何保证实时数据仍然能够正常,按时统计。

针对问题的一些解决方案

每个进程赋予从 0 - N 的整形连续 ID,服务进程更新数据时,将频道放到 0 - N 的槽中,统计进程仅负责自己当前槽的数据统计。
这种实现面临的问题

  • 怎样分布式的进程间协商 ID?(服务进程和统计进程均会有多个,服务进程负载均衡由 Nginx 完成)

  • 当其中一个统计进程挂掉后,如何更新 ID 信息?

  • 在扩容时,同一个频道在扩容前和扩容后可能被分配到不同的槽中

阅读 3k
1 个回答

我想的比较简单,服务进程 和统计进程是完全独立的两套系统,两套系统之间有一层中间件,例如使用queue
1.服务进程 产生活跃频道和活跃用户数据,扔入queue中 process->Data->Queue N对1的关系
2.统计进程 从queue中获取数据统计 Queue->Data->process 1对N的关系
这样子 服务进程统计进程都可以扩展,无限扩展,只要中间queue能扛得住就行
我曾经做过类似的,中间使用RabbitMq,统计进程处理成功后才进行message的Ack,这样子确保不会丢数据,进程处理中突然死掉,这条数据也不会丢。
统计进程可以随便加,只要监听同一个queue就可以了。
这样子做暂时没觉得会有什么问题,请大家指教。
当然会有其他更好的方案,欢迎共享

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏