Мне нужно создать простой аналитический интерфейс для захвата поведения пользователя. Это будет зафиксировано с помощью фрагмента Javascript на веб-странице, как данные Google Analytics или Mixpanel.
Системе необходимо фиксировать данные браузера с близкого расстояния до реального времени (прокручивание позиции страницы, положение мыши и т.д.). Она будет записывать состояние страницы пользователей каждые 5 секунд. На каждое измерение есть только три атрибута, но их нужно принимать часто.
Данные не обязательно должны отправляться каждые 5 секунд, их можно было бы отключить реже, однако необходимо, чтобы я получал все данные, пока пользователь находится на странице. то есть я не могу его пропустить один раз в минуту и потерять последние 59 секунд данных для тех, кто уходит после 119 секунд.
Если возможно, я бы хотел создать систему, которая будет масштабироваться в обозримом будущем, что означает, что она работает на 10 000 сайтов, каждая из которых имеет 100 одновременных посетителей, т.е. 100 000 одновременных пользователей, каждый из которых отправляет одно событие каждые 5 секунд.
Я не беспокоюсь о запросе данных, это можно сделать с помощью отдельной системы. Меня больше всего интересует, как обрабатывать захват самих данных.
Требования
На основе вышеописанного бюджета система должна обрабатывать 20 000 событий в секунду, исходящих из пула из 100 000 пользователей.
Я хотел бы разместить эту службу на Heroku, однако, когда я много работал с Rails, я совершенно новичок в системах с высокой пропускной способностью (кроме того, что вы не обрабатываете их с помощью Rails).
Вопросы
- Есть ли коммерческая система, которая была бы хороша для этого (например, Pusher, но для сбора данных, а также для распределения)?
- Должен ли я искать это с помощью HTTP-запросов или веб-сайтов?
- Является ли node.js правильным выбором для этого или просто модным?
- Если бы я выбрал решение на основе сокетов, сколько сокетов может иметь дино на дескрипторе Heroku для каждого веб-сервера
- Каковы соответствующие соображения для выбора между Mongo/Reddis и т.д. для хранения
- Это тот тип проблемы, который на самом деле требует двух решений - первый, чтобы вы получили разумный масштаб быстро и недорого, а второй, чтобы пройти мимо этой шкалы при более низких дополнительных затратах, но с большим количеством усилий по разработке, требуемых заранее?