Мне нужно создать фид активности (поток «Жизненный поток», чтобы быть более точным.) Для системы, аналогичной (той же), что и многие популярные социальные сетевые платформы. Моя первоначальная попытка состояла в том, чтобы использовать РСУБД, но быстро отказалась от идеи из-за огромного количества СОБЫТИЙ, необходимых. Продувка для других возможно (и лучше подходит) подходы, я наткнулся на следующее сообщение:Каков наилучший (масштабируемый, быстрый, надежный) подход для реализации Activity Feed, Message Queue или RDBMS или NoSQL DB?
How do social networking websites compute friend updates?
Принимая посоветуете сделать использование очереди сообщений, я потратил некоторое время на изучение RabbitMQ и его протокол PubSubHubbub , И я постулировал следующий подход:
1) Каждый пользователь имеет «тему»
2) Другие пользователи подписаться на тему
3) Когда пользователь выполняет какое-либо действие, сообщение опубликовано, который затем связаны между собой (Референции разрешены), отформатированный (дружественный для человека язык, ссылки и т. Д.) И агрегированные (X, Y и Z комментируют пост P) с помощью PHP-скрипта.
Однако мне все равно придется проходить каждое сообщение и обрабатывать его (если только мой подход не является полностью неправильным). Итак, какая разница между сохранением всего в СУБД и использованием очереди сообщений (кроме реализации протокола PubSubHubbub)?
Есть ли более эффективные способы построения такой системы? (Если да, просьба указать)
Комментарии/Предложения/Критика приветствуется. :)
Заранее спасибо!
P.S .: Есть интересная статья о том, как это реализует FriendFeed (http://bret.appspot.com/entry/how-friendfeed-uses-mysql). Тем не менее, я чувствую, что «хакерство» выталкивает MySQL из его удобного домена (который является просто реляционными данными и какой смысл использовать RDBMS без реляционных данных?)
PPS: Еще одна проблема с использованием очереди сообщений, которую я см. (возможно, из-за того, что я новичок в этой технологии) заключается в том, что после того, как сообщение вызывается «Потребителем», оно удаляется из очереди, однако я хочу, чтобы он сохранялся в течение произвольного промежутка времени.
Альфред, во-первых, спасибо за ваш ответ и предложений! Очень признателен. > Если вы правильно поняли, что вы думаете, что pubsubhubbub является > то же, что и в очереди сообщений, но это не так: Да, я понимаю разницу (если вы читаете мое сообщение, вы можете видеть, что я использую RabbitMQ как очередь сообщений для протокола PubSubHubbub). У меня есть, как вы предлагали читать о redis (и это отличный учебник: http://redis.io/topics/twitter-clone). Однако отправка всех обновлений всем подписчикам (с помощью цикла); не так ли немного ресурсоемким (учитывая, что миллион записей?) – shachibista
... добавление к моему предыдущему комментарию: разве модель не должна быть обратная? (Чтобы абоненты получали только записи по мере необходимости, то есть не заблаговременно)? Надеюсь, я смог прояснить ситуацию. – shachibista
@ a110y С redis все в памяти (без блокировки), так что будет молниеносно. Вы можете сделать этот цикл из рабочего процесса (ов) без каких-либо усилий. Вы используете очередь сообщений, чтобы добавить указатель (ссылка на KEY) к твиту (сообщению) каждому пользователю, а не делать массово дорогое JOINS (SQL !!!) Также я хотел бы указать на этот отличный учебник от Саймона, объясняющий redis => http://simonwillison.net/static/2010/redis-tutorial/. Надеюсь, это тоже имеет смысл;) – Alfred