Laravel 5.5 - Уведомления / Субно уведомления для 1 миллиона подписчиков?

Я использую notifications стол и subnotifications таблица, и я также использую очереди, поэтому он работает в фоновом режиме, когда пользователь что-то публикует. Когда у пользователя есть 10 подписчиков, и они создают сообщение, notifications таблица получает одну запись, которая включает в себя данные публикации для уведомления, и subnotifications таблица получает 10 записей (по одной субно-уведомления на каждого подписчика, каждая ссылается на идентификатор уведомления, поэтому нам не нужно повторять данные уведомления 10 раз, с read_at узнать, читал ли он этот подписчик или нет).

Это быстро и прекрасно работает без каких-либо проблем. Тем не менее, при тестировании с 1 миллионом фолловеров, вставка вложенных уведомлений для одного поста занимает около 6 часов! Это, конечно, неприемлемо, поскольку требуется слишком много времени для вставки 1 миллиона вложенных уведомлений, по одному на каждого подписчика. Представьте, что один и тот же пользователь публикует 10 сообщений, это будет примерно ~60 часов для вставки и 10 миллионов строк подвыражений.

Я просто хочу, чтобы подписчики знали, что есть новое сообщение, если они еще не читали его. Есть ли лучший, более эффективный способ масштабирования?

ОБНОВЛЕНИЕ: Застрял с текущим подходом, см. Ниже...

Если последователь $user имеет 100 лидеров, которых они следуют (которые они следовали в разных created_at временные метки, конечно, в таблице фолловеров), что будет правильным запросом о новых постах лидера со времени, когда фолловер следил за каждым лидером? Я застрял в created_at с этим псевдокодом:

// Assume `leader_id` is a column in the notifications table
DB::table('notifications')
  ->whereIn('leader_id', $leaderIds)
  ->where(`created_at`, '>', $whatTimestampsGoHere)
  ->paginate(20);

Существует 100 различных временных меток, и я застрял на том, как решить эту проблему правильно и эффективно. Есть идеи?

1 ответ

Решение

Как указано в комментариях, вы можете уменьшить вставки, если вы вставляете только в дочернюю таблицу, т.е. subnotifications когда пользователь читает его, а не создает его при создании уведомления, что позволяет избежать этой проблемы. При попытке проверить, видел ли пользователь уведомление, просто проверьте, существуют ли они в subnotifications для пользователя и уведомления.

Также, как сказано, при извлечении уведомлений для показа пользователям извлекайте их из notifications но ограничьте уведомления уведомлениями, созданными после того, как пользователь начал следить, чтобы новые пользователи не были заполнены уведомлениями.

Другие вопросы по тегам