我有一个收集会话数据的系统。会话由许多不同的事件组成,例如“会话开始”和“执行的操作X”。没有办法确定会话何时结束,所以相反,心跳事件会定期发送。你如何对分布式系统中没有事件做出反应?
这是主要的并发症:没有确定的方式,如果一个会话已经结束,唯一的办法就是尽量不存在的事件,即没有更多的心跳反应。我如何在分布式系统中有效且正确地完成这项工作?
下面是一些背景的问题:
事件必须被组装成表示会话中的对象。会话对象稍后会使用来自其他系统的附加数据进行更新,并最终用于计算会话数量,平均会话长度等。
系统必须水平缩放,因此有多个服务器可以接收事件以及处理它们的多个服务器。属于同一会话的事件可以发送到不同的服务器并由其处理。这意味着我们无法保证它们将按顺序处理,并且还有其他复杂情况,意味着事件可能会重复(并且总会有一些丢失的风险,无论是在它们到达我们的服务器之前,还是在处理完成之前)。
大部分情况已经存在,但我没有很好的解决方案来有效地和正确地确定会话何时结束。我现在的做法是定期搜索“不完整”会话对象的集合,查找任何未等待两次心跳的时间的更新,然后将这些对象移至另一个具有“完成”会话的集合。此操作既耗时又低效,并且水平伸缩效果不佳。基本上,它包括对代表最后一个时间戳的列进行排序,并过滤掉任何不够长的行。听起来很简单,但很难并行化,如果你经常这样做,你就不会做其他任何事情,数据库会忙于过滤数据,如果你不经常做足够的话,每次运行都会很慢,因为有处理太多。
我想反应过来的时候会话尚未一会儿更新,不轮询每个会话,看它是否也已更新。
更新:只是为了给你的感觉;在任何时候都有数十万个会话活动,最终会有数百万个会话。浮现在脑海
多久你需要知道,如果一个会话已经完成? – 2011-04-28 12:28:26
大约在几分钟内。 – Theo 2011-04-28 18:23:50