У меня есть система, которая собирает данные сеанса.Сеанс состоит из нескольких отдельных событий, например, «сессия запущена» и «действие Х выполнено».Невозможно определить, когда заканчивается сеанс, поэтому вместо этого события сердцебиения отправляются с регулярными интервалами.
Это главное осложнение: без способа определить, закончился ли сеанс, единственный способ - попытатьсяреагировать на отсутствие события, то есть не больше сердцебиения.Как я могу сделать это эффективно и правильно в распределенной системе?
Вот еще один фон для проблемы:
Затем события должны быть собраны в объекты, представляющие сеансы.Позднее объекты сеанса обновляются дополнительными данными из других систем, и в конечном итоге они используются для вычисления таких вещей, как количество сеансов, средняя продолжительность сеанса и т. Д.
Система должна масштабироваться горизонтально, поэтому имеется несколько серверовкоторые получают события, и несколько серверов, которые их обрабатывают.События, принадлежащие одному сеансу, могут отправляться и обрабатываться разными серверами.Это означает, что нет никакой гарантии, что они будут обработаны по порядку, и есть дополнительные сложности, которые означали, что события могут дублироваться (и всегда есть риск, что некоторые из них будут потеряны, либо до того, как они достигнут наших серверов, либо при обработке).
Большая часть этого уже существует, но у меня нет хорошего решения, как эффективно и правильно определить, когда сеанс закончился.Теперь я делаю это, периодически просматривая коллекцию «незавершенных» объектов сеанса, отыскивая объекты, которые не были обновлены, за промежуток времени, равный двум тактам, и перемещая их в другую коллекцию с помощью «завершенных» сеансов.Эта операция отнимает много времени и неэффективна, и она плохо масштабируется по горизонтали.По сути, она состоит из сортировки таблицы по столбцу, представляющему последнюю метку времени, и отфильтровывания любых строк, которые недостаточно стары.Звучит просто, но трудно распараллелить, и если вы будете делать это слишком часто, вы больше ничего не будете делать, база данных будет занята фильтрацией ваших данных, если вы не будете делать это достаточно часто, каждый запуск будет медленным, потому что естьслишком много для обработки.
Я бы хотел отреагировать на то, что сессия не была обновлена какое-то время, а не опрашивать каждую сессию, чтобы узнать, обновлялась ли она.
Обновление: Просточтобы дать вам чувство масштаба;в любое время действуют сотни тысяч сессий, и в конечном итоге их будут миллионы.