Кредиты: Вектор технологий, созданный pikisuperstar - www.freepik.com

Как разработчики, мы часто оказываемся в ситуациях, когда нам нужно что-то построить, но у нас нет достаточно времени, чтобы развиваться так, как нам хотелось бы. И мы не всегда можем отодвинуть сроки, потому что ? время выхода на рынок ? иногда играет решающую роль в успехе продукта. Так что же нам делать? Мы срезаем углы, берем на себя просчитанный риск, отпускаем пуриста в вас (лучшие практики, покрытие модульных тестов и бла-бла-бла). Думаю, для большинства из вас это было бы ужасно похоже.

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

В этом блоге будут в первую очередь эти блоки обучения.

  1. Технические : Как вы на самом деле создаете такую ??систему, должны быть рассмотрены такие темы, как проектирование распределенной системы, масштабируемость, отказоустойчивость, доступность.
  2. Работа против времени : как вы выполняете работу в короткие сроки, какие компромиссы вы идете, как быстрее принимать решения.
  3. Жизненный цикл разработки : вы также можете получить представление о жизненном цикле разработки продукта, о том, что нужно для создания хорошего программного обеспечения.

Глава 1: Требования

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

Сценарий использования заключался в том, что в начале перегрузки пользователей просили предсказать сценарий, для которого у них было бы 20/30 секунд. И в конце модератор представит, что на самом деле произошло среди всех предсказанных сценариев. И оценка будет работать в зависимости от того, кто ответил правильно и сколько времени было потрачено на ответ.

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

Это будет в первую очередь блог, ориентированный на серверную часть, извините, я не смогу объяснить, как были созданы эти красивые пользовательские интерфейсы.

Глава 2: Дизайн

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

Шаг 1: оценка масштаба

Прежде чем что-либо начать, мы сделали приблизительную оценку того, какой трафик нас ждет. Учитывая масштаб нашей системы, по нашим оценкам, в викторине примут участие около 50 тысяч человек. Таким образом, мы нацелены на создание 100 тыс. Пользователей. Но большинство людей, вероятно, ответят в первые 10 секунд из 30-секундного окна. Что примерно дает нам целевую скорость 20k.

Мое эмпирическое правило заключается в том, что для новой системы всегда создавайте систему для вдвое большего числа ожидаемых пользователей. Так что, если у вас будет больше пользователей, ваша система не потеряет возможности масштабирования. А количество пользователей обычно растет со временем, поэтому вам не нужно постоянно менять систему. Но это не означает, что вы вдвое увеличиваете инфраструктуру вместо того, что на самом деле требуется. В большинстве случаев я бы включил автоматическое масштабирование в своих системах, поэтому всякий раз, когда возникают пики трафика, система масштабируется сама.

(Мы сделали и другие оценки в отношении хранения в кеше, но пропустили их, чтобы статья была краткой)

Шаг 2. Определение API-интерфейсов высокого масштаба

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

Итак, это крупномасштабные API, которые мы определили

  1. Получите оценку и рейтинг пользователя
  2. Получить таблицу лидеров
  3. Рассчитать таблицу лидеров (в основном обработка данных, а не API)
  4. Опубликовать ответ пользователя

Шаг 3. Рекомендации по дизайну

Сразу после того, как я увидел это требование, мне стали очевидны две вещи.

  1. Нам понадобится асинхронная и распределенная обработка для подсчета очков и лидеров по наиболее очевидным причинам. Если вы планируете синхронно запускать подсчет баллов на одном узле для 1 миллиона пользователей или более, удачи вам ??. Идея проста: мы разбиваем большую задачу на более мелкие и запускаем их на разных узлах, позволяя им делать это в своем собственном темпе. А также мы хотим, чтобы этот процесс был отказоустойчивым .
  2. Cache станет нашим другом при чтении рейтингов пользователей и списков лидеров. По двум причинам, прежде всего, скорости и простоте масштабирования . Кэш намного быстрее, чем БД для простых операций чтения, и, как правило, кластер Redis / Memcached / Hazelcast легче масштабировать, чем Postgres .

Шаг 4: спроектируйте систему

Принимая дизайнерские решения на этот раз, я предпочитаю использовать технику, которую я знал и не хотел рисковать найти то, что могло бы быть лучшей технологией для этого варианта использования. Например, я был знаком с Redis , поэтому для кеша это был очевидный выбор. Кроме того, всякий раз, когда я слышу таблицу лидеров, она автоматически преобразуется в отсортированные в Redis наборы . А для асинхронной обработки Kafka по- прежнему остается моим выбором номер один. Если бы у меня было подходящее время, я бы, вероятно, провел немного больше исследований, но на этот раз я не собирался блуждать в диких землях в поисках лучших технологий, потому что у меня не было ВРЕМЕНИ !!!!

а. Опубликовать пользовательский ответ API

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

  1. Снизить нагрузку на БД
  2. Создайте своего рода обратное давление или позвольте операторам БД работать в своем собственном темпе, чтобы БД не перегружалась

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

А Back-pressure почти кричит очереди сообщений .

Итак, объединив и то, и другое, мы пришли к следующему решению ...

Не волнуйтесь, позвольте мне объяснить, что происходит

  1. Ответы пользователей принимаются получателем ответов, и возвращается код состояния HTTP 202. Это все равно что сказать, что я получил ваш запрос и собираюсь его обработать, но вы продолжаете и делаете то, что делали. Это первый шаг в асинхронной обработке, при котором мы не блокируем вызывающего.
  2. Получатель ответа помещает ответ пользователя в очередь сообщений, которая снова разделяется для целей масштабируемости / доступности / избыточности . Вы можете довольно легко понять разделение, если уже знаете Kafka. В случае, если вы этого не сделаете, просто рассмотрите это как способ распределить ваши сообщения в вашей очереди по нескольким меньшим изолированным очередям, которые технически могут находиться на разных узлах. Если вы знаете сегментирование БД, то это то же самое, но в основном для очередей сообщений. Не стесняйтесь читать больше о Кафке здесь .
  3. Теперь эти необработанные ответы получает дозатор. Затем он создает пакеты из 10 сообщений и отправляет их на следующий этап обработки.
  4. Писатель БД забирает пакеты и выполняет запросы на вставку в БД. Обратное давление в основном вводится писателем БД, он принимает сообщения в своем собственном темпе, поскольку потребитель сообщений был на основе опрашивания . И тем самым предотвращаем перегрузку БД. И поскольку он работает с пакетами, вместо того, чтобы выполнять 100 запросов к БД, мы выполнили только 10 запросов к БД.

Это решает 30% нашей проблемы, давайте перейдем к следующей.

б. Оценка и расчет таблицы лидеров

Теперь слон в комнате, главная проблема, расчет таблицы лидеров. Если вы видите эту систему, это не похоже на традиционную систему викторин, где мы заранее знаем правильный ответ. Таким образом, мы не можем реально подсчитать очки и таблицу лидеров, как только кто-то ответит. Мы должны подсчитать баллы и рейтинг всех пользователей после того, как модератор представит правильные ответы. Так что огромный кусок работы за один выстрел. Совершенно очевидно, что ни наши узлы, ни наш сервер БД не могут справиться с этим должным образом при синхронизации.мода. Так что же нам делать? Мы снова возвращаемся к очередям сообщений наших друзей для асинхронной обработки. Круто, мы можем подсчитывать баллы асинхронно, но как насчет таблицы лидеров? Это должно быть доступно все время, верно? А что насчет звания? До тех пор, пока не будут подсчитаны баллы для всех пользователей, вы не сможете ставить ранги, верно? А конкретное вычисление ранга могло быть сложной задачей.

Кто нас от этого спасет? Не волнуйся, друг мой, помнишь, я кратко упомянул Redis, говоря о кеше? У них есть прекрасная штука, называемая отсортированным набором (какое замечательное творение, спасибо Redis Labs ??). В отсортированный набор вы можете добавить ключи с оценкой, и Redis упорядочит их соответственно в O (журнал (N)) . Это решит нашу проблему ранжирования ??. Это также позволяет нам выполнять запросы диапазона, например, дать мне пятерку лучших или получить рейтинг для определенного ключа, и все это происходит за O (log (N)). Это именно то, что нам здесь нужно.

Элементы добавляются в хэш-таблицу, сопоставляющую объекты Redis с оценками. В то же время элементы добавляются в список пропуска, сопоставляя оценки с объектами Redis (таким образом, объекты сортируются по оценкам в этом ?представлении?) - Внутренние элементы сортированного набора

Бамммммм проблема лидеров тоже решена.

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

Выглядит немного устрашающе, нет? Позвольте мне объяснить

  1. Как только модератор отправляет правильный ответ, отправляется сообщение запуска подсчета баллов, которое запускает весь конвейер обработки .
  2. Дозатор получает сообщение о триггере и генерирует пару объектов смещения и ограничения БД в зависимости от того, сколько человек ответили правильно. Например, если 10 человек ответили правильно и размер пакета равен 5, тогда будет сгенерировано два объекта (пакета). Пакет 1 {смещение: 0, ограничение: 5}, пакет 2 {смещение: 5, ограничение 5}. Почему мы это делаем? Чтобы мы могли запускать пакетную обработку или запускать запросы к БД с разбивкой на страницы, и мы не вызываем БД без каких-либо ограничений. Так что, если бы мне нужно было получить 1 миллион записей из БД, и я сделаю это за один раз, это вызовет множество проблем во многих местах. Поэтому мы разбиваем это на более мелкие части и запускаем меньшие, но несколько запросов, которые вернут меньшее количество строк.
  3. Пользовательский пакетный процессор теперь будет получать эти пакетные сообщения и соответственно запускать запросы к БД. Процессор, который получает сообщение {offset: 0, limit: 5}, получит первые 5 идентификаторов пользователей из БД (также выполнит другую пакетную операцию, но здесь это сложно объяснить, поэтому пропустите). И после этого мы прощаемся с пакетной обработкой и переключаемся на потоковую обработку . Поскольку пакетный процессор теперь помещает 5 идентификаторов пользователей в очередь, которые будут обрабатываться следующим процессором.
  4. Теперь калькулятор оценок пользователей получает индивидуальные идентификаторы пользователей, запускает логику оценки для расчета индивидуальных оценок пользователей. Затем сделайте 1 обновление БД, чтобы изменить оценку пользователя. Затем он обновляет оценку для этого конкретного пользователя в отсортированном наборе, а Redis внутренне присваивает или обновляет рейтинг. И как только этот этап завершит обработку, у нас будут оценки всех пользователей в нашей базе данных и рейтинг + оценка всех пользователей в нашем Redis. А поскольку у нас есть ранг каждого в отсортированном наборе, мы могли бы просто выполнить для него запрос диапазона, чтобы получить таблицу лидеров с невероятной скоростью .

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

На этом завершается этап первичного проектирования. Были также БД, дизайн API и другие вещи, которые я здесь пропускаю.

Глава 4: Реализация

Завершение дизайна решило 70% наших проблем, и мы знали, что сможем это исправить, поэтому быстро перешли к разработке.

В идеальном мире я бы пошел и создал новую службу, попробовал бы новый язык, такой как Go , для более качественной и быстрой параллельной обработки и прочего. Но, учитывая сроки, это было неправильно. Мы придерживались нашего основного сервиса NodeJS и все туда поместили. Сторонники микросервисов могут потерять это, увидев это заявление, но в гонке со временем вашим принципам иногда приходится отодвигаться на задний план. Среди множества компромиссов это был один из основных вызовов, на которые мы пошли.

Кроме того, нам пришлось сократить модульные и интеграционные тесты , вина за которые все еще преследуют нас. Но мы постепенно заполняем тесты после релиза.

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

Глава 5: Развертывание и мониторинг

После нескольких исправлений ошибок и одобрения контроля качества все было в порядке. Работа сделана правильно? Нет, друг мой, нам еще нужно было настроить усиленный мониторинг этого материала. Поскольку он был разработан за очень короткое время, я, по крайней мере, был немного не уверен. По умолчанию для этого сервиса включена трассировка через LightStep . Итак, помимо трассировки, я настроил специальный мониторинг трафика, частоты ошибок, панелей мониторинга задержки и предупреждений для всех API. И после запуска я и мои товарищи по команде, мы получили звонок, и мы наблюдали за системой в течение как минимум часа, от использования ОЗУ и ЦП до журналов ошибок . Так что всегда придавайте одинаковый вес наблюдаемости.а также мониторинг. В производственной системе были небольшие проблемы, и мы смогли выявить их на ранней стадии только благодаря мониторингу.

Глава 6: Ретроспектива

Система работает, но после передышки важно провести ретроспективу, выявить вещи, которые мы упустили, и поработать над ними. Я уверен, что мы упустили массу вещей, срезали множество углов и получили огромное количество улучшений. Например, вот пара…

Что мы могли бы сделать лучше

  1. Для этого мы использовали уже существующую базу данных Postgres, так как драйвер, ORM и поддерживающая инфраструктура уже были там. Но я бы, вероятно, немного изучил решения для баз данных.
  2. NodeJS великолепен, но я считаю, что Go будет лучшим решением для этого. Мы могли бы это изучить.
  3. Я попытался написать запрос для расчета оценки только в БД, но потерпел неудачу. Я, вероятно, мог бы написать это, а также мог бы выполнять пакетную обработку для подсчета баллов, еще больше сокращая операции с БД.
  4. Мы не смогли провести обширные тесты нагрузки и производительности, что является обязательным условием.
  5. Мы могли бы написать два разных этапа для обновления оценки БД и обновления сортированного набора Redis, что было бы более чистой реализацией.

Примечания на прощание

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

Надеюсь, сегодня вы смогли кое-что узнать о проектировании систем и разработке программного обеспечения ??

Кредиты

Спасибо моим замечательным товарищам по команде Акашу Раджу и Ааширваду Кашьяпу , мы все вместе работали, чтобы построить его всего за неделю.

Спасибо за прочтение!

Я Аритра Дас, я разработчик, и мне очень нравится создавать сложные распределенные системы. Не стесняйтесь обращаться ко мне в Linkedin или Twitter по любым вопросам, связанным с технологиями.

Удачного обучения…

Suggested posts

Книги о Python в продаже 25 ноября

Скидки на раннюю Черную пятницу с книжной полки Pragmatic

Книги о Python в продаже 25 ноября

Пишите лучший, интуитивно понятный и надежный код с Python. The Pragmatic Bookshelf предоставит вам 40-процентную скидку на все игры Python во время нашего мероприятия ?Ранняя пташка в Черную пятницу?, от практических проектов по разработке оборудования до науки о данных! Купите следующие электронные книги, чтобы получить свои сбережения: Примечание. Промокод turkeysale2021 действителен до 29 ноября 2021 года для электронных книг на веб-сайте Pragmatic Bookshelf.

Вы должны рандомизировать свой рабочий процесс, и вот почему

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

Related posts

Как подсчет острых треугольников приводит к удивительной формуле

Исследование нескольких подходов к проблеме комбинаторики

Как подсчет острых треугольников приводит к удивительной формуле

Возьмем правильный многоугольник с нечетным числом вершин. Сколько острых треугольников можно образовать из вершин? Прежде чем погрузиться в рассмотрение и считать, полезно понять, что острые треугольники - это те треугольники, самая длинная сторона которых охватывает менее половины краев многоугольника.

В душевной боли нет DISPRIN

В душевной боли нет DISPRIN

Прежде всего, позвольте нам признать, что сердечные боли не ограничиваются только романтическими аспектами жизни. Есть много других обстоятельств, которые подводят нас, из-за которых мы испытываем неприятное чувство разбитого сердца или легкой боли. J Наше поколение одержимо мгновенным решением - от лапши до чувств, мы хотим, чтобы все было исправлено за 2 минуты.

Запуск Umeeverse Genesis - зовем всех сторонников Umee!

Запуск Umeeverse Genesis - зовем всех сторонников Umee!

Вчера сеть Umee объявила об официальной продаже Coinlist. В качестве блокчейна базового уровня мы рады работать вместе с сообществом, поскольку мы запускаем этот Cross Chain DeFi Hub.

Хороший мост и путь вперед: долгосрочные цели и как мы их достигнем!

Хороший мост и путь вперед: долгосрочные цели и как мы их достигнем!

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

MORE COOL STUFF

Женат ли тренер по баскетболу Duke Blue Devils Майк Кшижевски?

Женат ли тренер по баскетболу Duke Blue Devils Майк Кшижевски?

Уход Майка Кшижевского из Duke Basketball в конце текущего сезона даст ему больше времени с женой и семьей.

Насколько высок Николас Браун из ?Наследия??

Насколько высок Николас Браун из ?Наследия??

Поклонники ?Наследия? не могут не заметить необычно высокий рост Грега, также известного как Николас Браун. Неужели он действительно возвышается над актерами?

"Женщина-пионер" Ри Драммонд: гарниры ко Дню благодарения в праздничный сезон 2021 года

Женщина-пионер Ри Драммонд готова подготовить вас к Дню Благодарения. Вот некоторые из ее лучших гарниров.

'90-дневный жених': обновленная информация о семейном статусе Майка Янгквиста, когда отчужденная жена Натали флиртует в 'одиночной жизни'

Натали в сериале ?90 Day: The Single Life?, но что делает Майк Янгквист? Вот что мы знаем о текущем статусе отношений Майка.

Попробуйте наш мини-кроссворд

Попробуйте наш мини-кроссворд

Наш мини-кроссворд, обновляемый еженедельно, сочетает в себе наши любимые книги HowStuffWorks с умными подсказками!

Что лучше всего работает: капсулы для стирки, порошок или жидкие моющие средства?

Что лучше всего работает: капсулы для стирки, порошок или жидкие моющие средства?

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

Правдивая история синих людей Кентукки

Правдивая история синих людей Кентукки

Семьи Фугейтов и Комбсов в сельском Кентукки проиграли генетическую лотерею, у обоих была редкая рецессивная черта, из-за которой их кожа выглядела синей, когда они вступали в брак. Что было причиной этого? А что случилось с семьями?

Может ли калифорнийский кондор ?девственное рождение? спасти вид?

Может ли калифорнийский кондор ?девственное рождение? спасти вид?

Два птенца-самца, оставшиеся без отца, выращиваются в рамках программы по спасению калифорнийского кондора от вымирания. Как возможно такое ?непорочное? рождение?

Золотые Рыцари и Канадиенс совершили увлекательный обмен

Золотые Рыцари и Канадиенс совершили увлекательный обмен

Я не видел парня, который был бы счастливее покинуть Монреаль с тех пор ..

Судьи начинают освобождать подростков-иммигрантов, которые были заключены в тюрьму на основании самых ненадежных улик

Судьи начинают освобождать подростков-иммигрантов, которые были заключены в тюрьму на основании самых ненадежных улик

AP Группа подростков-иммигрантов, которые были арестованы и задержаны федеральными властями по подозрению в участии в уличной бандитской группировке, начала освобождаться после того, как серия судей сочла доказательства против них крайне ненадежными. Федеральный судья в Калифорнии постановил, что иммиграционные судьи, которые рассматривают дела молодых людей, имеют временные полномочия освободить их из-под стражи - чего им раньше не хватало.

Почему полиция Лос-Анджелеса патрулирует городские автобусы и поезда, когда не хватает офицеров, патрулирующих улицы Лос-Анджелеса?

Почему полиция Лос-Анджелеса патрулирует городские автобусы и поезда, когда не хватает офицеров, патрулирующих улицы Лос-Анджелеса?

Робин Бек / Getty Images Два дня назад Комитет общественной безопасности городского совета Лос-Анджелеса потребовал от Департамента полиции Лос-Анджелеса подробных объяснений того, как офицеры размещаются на улицах города, на фоне опасений, что не хватает полицейских, работающих патрулирующими, чтобы адекватно реагировать на призывы о помощи. Как будто чтобы высмеять эту озабоченность и добавить оскорбления к травмам, совет директоров Столичного транспортного управления округа Лос-Анджелес объявил в четверг, что полиция Лос-Анджелеса начнет патрулирование поездов и автобусов в рамках нового межведомственного подхода к обеспечению безопасности транзита с 1 июля, сообщает CBS News. .

Чему США могут научиться из битвы Канады с антинаучным правительством

Чему США могут научиться из битвы Канады с антинаучным правительством

Иллюстрация: Джим Кук / Gizmodo Мы всего в нескольких днях от эры Трампа, и становится до боли ясно, что новый президент мобилизуется для войны с наукой. Эта ситуация пугающе напоминает попытки подавить науку в Канаде во время пребывания Стивена Харпера на посту премьер-министра с 2006 по 2015 год.

Карди Би и дочь Офсет, Культура, демонстрируют красивые новые косички в Instagram

Карди Би и дочь Офсет, Культура, демонстрируют красивые новые косички в Instagram

3-летняя дочь Cardi B и Offset, Kulture, продемонстрировала свою новую заплетенную прическу в Instagram.

Селена Гомес поцеловала Кару Делевинь в щеку за поцелуй перед камерой на игре Knicks

Селена Гомес поцеловала Кару Делевинь в щеку за поцелуй перед камерой на игре Knicks

?Она такая веселая и очень предприимчивая?, - сказала ранее Селена Гомес о своей подруге Каре Делевинь.

Мадонна пьет джин из бутылки в спортзале: ?Сегодняшняя тренировка?

Мадонна пьет джин из бутылки в спортзале: ?Сегодняшняя тренировка?

В четверг певица решила изменить свой фитнес-распорядок

Джейми Дорнан говорит, что он потерял роль Супермена из-за Генри Кавилла и обратился в Marvel за ролью супергероя

Джейми Дорнан говорит, что он потерял роль Супермена из-за Генри Кавилла и обратился в Marvel за ролью супергероя

Джейми Дорнан рассказал, что пробовался на роль Супермена, но проиграл Генри Кавиллу; и он говорил с Marvel о присоединении к MCU.

Languages

野花在线观看免费观看大全-野花视频在线观看免费观看8
国足最新出线概率0.08% 北京冬奥火炬宣传片获金花环奖 速度与激情9 得知母亲出事男子在地铁痛哭 国足战澳大利亚大名单:4归化在列 周冠宇成为中国首位F1车手 安娜贝尔 尚气与十环传奇 胡锡进谈中美元首会晤 红色通缉令 尚气与十环传奇 印度首都准备封城 房价上涨城市创七年新低 拐点来了? 24岁救人牺牲消防员获批为烈士 扫黑风暴 我要我们在一起 意大利错失直接晋级世界杯资格 中美元首会谈重点内容 中国共产党第三个历史决议全文发布 灵媒 意大利错失直接晋级世界杯资格 俄方回应卫星碎片危及国际空间站 中美元首是否达成新共识?中方回应 男子写80页PPT拯救爱情却离婚 动保组织向上饶信州区申请信息公开 许家印为恒大注入超70亿续命资金 动保组织向上饶信州区申请信息公开 千与千寻 意大利错失直接晋级世界杯资格 两个女人 浦发银行回应近3亿存款莫名被质押 罗永浩吐槽苹果文案没文化 大连现超级传播者26人在同一传播链 扫黑风暴 安娜贝尔 中美元首会谈重点内容 长津湖 图兰朵 24岁救人牺牲消防员获批为烈士 房价上涨城市创七年新低 拐点来了? 五个扑水的少年 大连一密接者擅自点外卖聚餐被调查 男子写80页PPT拯救爱情却离婚 #耿直真香哥黑化卖惨# 动保组织向上饶信州区申请信息公开 扫黑风暴 失控玩家 扫黑风暴 许家印为恒大注入超70亿续命资金 外交部回应拜登重申不支持台独 加拿大一枝黄花到底是什么? 中国医生 男子体检血中抽出2升油浆 红色通缉令 大连现超级传播者26人在同一传播链 国际人士热议中共十九届六中全会 俄方回应卫星碎片危及国际空间站 怒火·重案 得知母亲出事男子在地铁痛哭 嘉南传 中美元首是否达成新共识?中方回应 浦发银行回应近3亿存款莫名被质押 斗破苍穹 蜘蛛侠:英雄归来 扫黑风暴 林丹世界排名被正式移除 男子体检血中抽出2升油浆 大连现超级传播者26人在同一传播链 扫黑风暴 林丹世界排名被正式移除 国足战澳大利亚大名单:4归化在列
绵阳市| 隆林| 海门市| 揭阳市| 巴林右旗| 朝阳区| 车致| 万盛区| 普陀区| 长宁县| 南通市| 丰顺县| 邮箱| 大石桥市| 富锦市| 辽阳县| 东宁县| 正蓝旗| 旅游| 松潘县| 保靖县| 宜丰县| 土默特左旗| 沛县|