Как оптимизировать 30 Вт лайков в секунду?

Java база данных

Продолжайте отвечать на вопросы планетарных друзей воды,Как спроектировать 30WQPS как подсчет бизнеса?

Как видите, этоОсобенности бизнесаДа:

(1) Высокая пропускная способность;

(2) оно несовместимо с определенными данными;

_Голос за кадром: _Небольшие неточности в подсчете не являются большой проблемой.

Сначала используйте самые простые идеи,Учитывать только количество лайков, что делать?

Легче всего подумать о нескольких моментах:

(1) утверждениене можетИспользуйте базу данных, чтобы противостоять трафику чтения и записи в реальном времени;

(2) Redis естественным образом поддерживает лечение, а кластеры Redis с высокой доступностью можно использовать для лечения хранилища;

(3) MySQL также можно использовать для твердого хранилища, Redis используется в качестве кэша, операции чтения и записи выполняются в кэше, а асинхронные потоки регулярно очищают БД;

(4) Уровень службы подсчета создан для отделения подсчета от бизнес-логики;

В настоящее времяБазовая структура данных MySQLДа:

t_count(msg_id, praise_count)

В настоящее времяКВ дизайн для RedisТоже не сложно:

_ключ: _msg_id

_ценность: _praise_count

Кажется, это достаточно просто:

(1) Услуга может быть расширена горизонтально;

(2) при увеличении объема данных база данных может масштабироваться по горизонтали;

(3) Когда количество операций чтения и записи увеличивается, кеш-память также может быть расширена по горизонтали;

система счетатрудность, но и вопросы масштабируемости бизнеса и эффективности.

Возьмите Weibo в качестве примера:

(1) Пользователь Главная Твиттер, более одного списка сообщений , который являетсярасширять;

(2) Для одного и того же сообщения msg_id учитывается не только количество лайков, но и количество прочтений, количество переадресаций и количество комментариев, что также является своего родарасширять;

Если реализовать простейшим способом, псевдокод для получения множественного количества множественных сообщений выглядит следующим образом:

// (1) Получайте все новости на главной странице msg_id

list<msg_id> = getHomePageMsg(uid);

// (2) Потяните несколько подсчетов для всех сообщений на домашней странице

for(msg_id in list<msg_id>){

//(3.1) Получить счетчик __прочтений

getReadCount(msg_id);

//(3.2) Получить __ количество переадресаций

getForwordCount(msg_id);

//(3.3) получить__количество комментариев

getCommentCount(msg_id);

//(3.4) Количество Get__Like

getPraiseCount(msg_id);

}

Поскольку для одного и того же msg_id существует несколько бизнес-счетчиков, ключ redis должен содержать бизнес-флаг, который обновляется до:

msg_id:read

msg_id:forword

msg_id:comment

msg_id:praise

Он используется для различения четырех разных бизнес-счетчиков с одним msg_id.Redis не может поддерживать нечеткую работу ключей и должен обращаться к reid четыре раза.

Дом, предполагающий, что есть 100 сообщений,эта программаРезюме:

(1) Для цикла каждое сообщение, 100 сообщений 100 раз;

(2) 4 вызова интерфейса RPC get count на сообщение;

(3) Чтобы получить доступ к reids каждый раз, когда вызывается служба, соберите ключ, чтобы получить количество;

Голос за кадром: Масштабируемость и эффективность этой схемы очень низкие.

Как его оптимизировать?

Первый взглядРасширение метаданных уровня базы данных, распространенным методом расширения является добавление столбцов для записи дополнительных бизнес-счетов.

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

Добавление столбцов в этот метод расширения бизнес-подсчетанедостатокДа: каждый раз, когда вам нужно расширить свой бизнес-количество, вам всегда нужно изменить структуру таблицы, увеличить столбец, и я раздражаю.

Есть ли продленный способ изменить структуру структуры таблицы?

Расширение строк является более масштабируемым способом.

Структура таблицы затвердевает как:

t_count(msg_id, count_key, count_value)

Если вы хотите расширить количество бизнес-процессов, просто добавьте строку, не изменяя структуру таблицы.

_Голос за кадром: _Многие службы настройки будут использовать это решение для облегчения дополнительной настройки.

Увеличьте строку этого метода расширения бизнес-счетанедостатокДа: количество строк данных таблицы будет увеличиваться, но это не главное противоречие.Горизонтальное расширение базы данных может легко решить проблему большого объема данных.

см. далееRedis пакетный подсчетсхема оптимизации.

В исходной схеме разные бизнес-счета одного и того же msg_id различаются путем сборки ключей.

Можно обновить для хранения нескольких счетчиков с одинаковым значением.

Как показано на рисунке выше, четыре счетчика одного и того же msg_id хранятся в одном значении, что позволяет избежать множественных обращений к Redis.
_Голос за кадром: _Разве не разумно расширять по значению?

Суммировать

Для подсчета бизнеса, когда объем данных велик и объем параллелизма велик, необходимо учитывать некоторые технические моменты:

(1) Используйте кеш, чтобы сопротивляться чтению и записи;

(2) Сервис-ориентированный, разделение системы подсчета и бизнес-системы;

(3) расширить горизонтально сегментацию определенное количество данных, количество чтения и письма;

(4) Чтобы учесть масштабируемость, общие оптимизации на уровне базы данных включают: расширение столбцов и расширение строк;

(5) Для рассмотрения пакетных операций распространенными оптимизациями на уровне кэша являются: одно значение хранит несколько бизнес-счетчиков;

Давайте сначала поговорим об оптимизации системы подсчета, я надеюсь, что каждый сможет что-то получить.

Вы можете продолжать задавать вопросы и отвечать на любые вопросы.

исследовательская работа:
Вы считаете с Redis?