Изучите механизм сохраняемости сообщений RocketMQ.

Java

Мы знаем, что RocketMQ — это высокопроизводительное, высоконадежное промежуточное ПО для распределенного обмена сообщениями, а высокую производительность и высокую надежность сложно сочетать одновременно. Поскольку для обеспечения высокой надежности данные должны сохраняться на диске, данные сохраняются на диске, это не может гарантировать высокую производительность.

RocketMQ хорошо поработал над совместимостью с этими двумя аспектами Начнем с диска.Современные диски обладают высокой производительностью, а скорость записи не обязательно ниже скорости передачи данных по сети.. Например, по протоколу M.2 NVMe скорость последовательной записи твердотельных накопителей SSD может достигать 1500 МБ/с.Даже если это обычный диск, при относительно высокой производительности скорость последовательной записи может достигать 450 МБ/с. с~600 МБ/с.

В случае последовательной записи эта скорость достигается, но если она не контролируется человеком, то диск использует случайную запись, при случайной записи скорость записи диска быстро падает.Случайная скорость записи диска может составлять всего несколько сотен КБ / с, которая намного медленнее, чем скорость передачи сети, поэтому она не соответствует требованиям производительности.

В дизайне постоянства RocketMQ принимает следующиеПоследовательная запись сообщений, стратегия случайного чтения, Используйте скорость последовательной записи диска, чтобы скорость записи диска не стала узким местом системы. А технология «нулевого копирования» MMPP используется для повышения скорости хранения сообщений и передачи по сети. Он стремится соответствовать требованиям RocketMQ к высокой производительности и надежности.

Выше говорилось о гарантии высокой производительности с точки зрения оборудования. Мы этого не понимаем. Давайте посмотрим на архитектурную диаграмму механизма сохранения RocketMQ.

RocketMQ 存储核心架构

В механизме сохраняемости RocketMQ задействованы три роли:

  • CommitLog: Реальный файл хранения для сообщений, все сообщения хранятся в файле commitlog.
  • ConsumeQueue: Логическая очередь потребления сообщений, аналогичная индексному файлу базы данных.
  • IndexFile: индексный файл сообщений, в котором в основном хранится соответствие между ключом сообщения и смещением для повышения скорости поиска сообщений.

Давайте поговорим об этом по порядку.Файл CommitLog — это место, где хранятся данные сообщения, и все сообщения будут храниться в файле CommitLog. После того, как производитель отправит сообщение брокеру RocketMQ, сервер брокераСообщения последовательно записываются в файл CommitLog., что является причиной высокой производительности RocketMQ, поскольку мы знаем, что последовательная запись на диск выполняется очень быстро, и RocketMQ в полной мере использует это для значительного повышения эффективности записи сообщений.

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

Чтобы решить эту проблему, RocketMQ представил файл Consumequeue.Файлы Consumequeue можно рассматривать как индексные файлы, аналогичные вторичным индексам в MySQL.. После сохранения всех сообщений в одной теме потребителям нужно только перейти в соответствующую группу Consumequeue, чтобы получать сообщения при потреблении. Файл Consumequeue не хранит полную информацию о сообщении. Если вы разбираетесь в индексах MySQL, вы должны понимать это хорошо. Конкретные сохраненные поля отмечены на рисунке выше. Это дает следующие два преимущества:

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

IndexFileЭто индексный файл, созданный RocketMQ для подписки на сообщения, который используется для повышения скорости получения сообщений в соответствии с темами и очередями сообщений.

Это все, что касается механизма сохранения RocketMQ. Давайте поговорим о сбросе данных сообщений.

Из-за существования операционной системы PAGECACHE, PageCache — это кеш файлов ОС, который используется для ускорения чтения и записи файлов, поэтому он обычно сначала записывается в PAGECACHE, а затем сохраняется на диск. То же самое верно и для других компонентов, с которыми мы знакомы, MySQL, Redis и т. д. RocketMQ не исключение.

Предоставляется в RocketMQсинхронная щеткаиАсинхронная щеточная пластинаДва режима кисти можно установить (sync_flush, async_flush) через параметр FlushDiskType в конфигурации брокера.

刷盘策略

Метод асинхронной чистки (по умолчанию): Когда сообщение записывается в PAGECACHE в памяти, оно немедленно возвращает клиенту успешную операцию записи.Когда сообщение в PAGECACHE накапливается до определенного количества, запускается операция записи для записи сообщения в PAGECACHE диск. СюдаВысокая пропускная способность и высокая производительность, но данные в PAGECACHE могут быть потеряны, а абсолютная безопасность данных не может быть гарантирована.

Синхронный метод чистки:消息写入内存的 PAGECACHE 后,立刻通知刷盘线程刷盘,然后等待刷盘完成,刷盘线程执行完成后唤醒等待的线程,返回消息写成功的状态。 СюдаМы можем гарантировать его безопасность, но пропускная способность не.

Это все, что касается обмена механизмом сохраняемости RocketMQ. Спасибо за чтение. Я надеюсь, что эта статья будет полезна для вашей учебы или работы.Если у вас есть выигрыш, вы также можете порекомендовать его другим друзьям, чтобы больше людей могли извлечь выгоду, большое спасибо..

Добро пожаловать в публичный аккаунт【Интернет плоский]. Там на рабочем месте настроение, технология Java, хотя и не на высоком, но легко понять. Сегодня лучшее - это минимальное требование завтра, вы и я хотел бы добиться прогресса вместе.

互联网平头哥