Существует два способа доступа к новостной ленте:
- разветвляется при записи
- веер на чтение
Вы используете веер при записи. В этом случае вы создаете новую отдельную активность для каждого соответствующего пользователя.
Этот подход может взорваться очень быстро, особенно если вы разрешите пользователям иметь неограниченное количество подписчиков. Всякий раз, когда происходит какое-либо действие, которое вам случается, вам придется сохранять новую запись для каждых 1000+ подписчиков в базе данных.
Все становится сложнее, когда вы добавляете группы и разные типы аудиторий. Что, если вы теперь хотите транслировать действие только людям из группы A, но не из группы B (например, вы создаете статус и хотите ограничить зрителей)? Что происходит, когда вы хотите транслировать на группу A и группу B, но есть пользователи A и B, которым вы не хотите получать одно и то же действие дважды? Что если вы хотите изменить видимость действия после его создания?
Это на самом деле невозможно, если фанат на подходе к записи, или, по крайней мере, очень сложно. Вот почему я предпочитаю последнее - фанат на подходе чтения.
Учтите это:
У пользователя есть набор каналов новостной ленты, связанных с его идентификатором. Эти каналы имеют вид {{ object_name}}:{{ object_id }}
. Вы можете иметь отдельные наборы для новостной ленты и уведомлений, так что вы можете отменить уведомления для одного объекта, не удаляя его из своей ленты новостей.
Когда пользователь регистрируется для получения обновлений от объекта, он добавляет канал, связанный с объектом, в свой список каналов. Вы можете использовать простой набор Redis. Например, если я присоединяюсь к событию № 1, я добавляю event:1
в свой список каналов.
Когда атрибут изменяется в событии # 1, новое действие создается только один раз. У этого действия есть поле под названием «наблюдатель», которое является названием канала, которому он виден. В этом случае наблюдателем является 'событие: 1`.
Когда пользователь получает свой канал активности, он сначала получает список своих подписанных каналов. Затем они извлекают все элементы канала активности, где наблюдатель находится в своем списке каналов.
ТАКЖЕ
Я просто не совсем уверен, как превратить это в систему уведомлений. Используя веер при чтении, у меня есть набор каналов для уведомлений, как описано выше. Когда атрибут объекта изменяется, я записываю новое уведомление в базу данных, которую получают все подписанные пользователи. Единственная проблема: как бы я читал уведомления для каждого пользователя? Я до сих пор не понял эту часть.