Продолжайте отвечать на вопросы планетарных друзей воды,Как спроектировать 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?