统计多频道实时在线用户

发布于 2022-09-04 04:29:45 字数 722 浏览 16 评论 0

需求

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

当前解决方案

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

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

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

存在的问题

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

针对问题的一些解决方案

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

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

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

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

那一片橙海, 2022-09-11 04:29:45

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文