Модель потоков
Модель потоков предполагает, что запрос, получаемый Tarantool по сети, обрабатывается тремя потоками (threads) операционной системы:
-
Сетевой поток (или потоки) на стороне сервера принимает запрос, выполняет разбор оператора, проверяет его корректность, а затем преобразует в специальную структуру — сообщение, содержащее исполняемый оператор и его параметры.
-
Сетевой поток отправляет это сообщение в поток обработки транзакций экземпляра (поток TX) через неблокирующую шину сообщений. Lua-программы выполняются непосредственно в потоке обработки транзакций и не требуют разбора и подготовки.
Поток TX либо использует индекс спейса для поиска и изменения кортежа, либо выполняет хранимую функцию, выполняющую операцию с данными.
-
Выполнение операции приводит к отправке сообщения в поток упреждающей записи (WAL), используемый для фиксации транзакции, после чего файбер, выполняющий транзакцию, приостанавливается. При завершении транзакции с помощью COMMIT или ROLLBACK выполняются следующие действия:
- Поток WAL отправляет ответное сообщение в поток TX.
- Файбер, выполняющий транзакцию, возобновляется для обработки результата транзакции.
- Результат выполнения файбера передаётся в сетевой поток, который возвращает результат клиенту.
Поток TX может обрабатывать множество файберов — наборов инструкций, которые могут содержать сигналы yield (передача выполнения). Поток TX выполняет все инструкции до сигнала yield, а затем переключается на выполнение инструкций другого файбера.
Передача выполнения (yields) необходима, иначе поток TX был бы навсегда заблокирован на одном и том же файбере.
Также существует несколько вспомогательных потоков, обеспечивающих дополнительные возможности:
-
Для репликации Tarantool создаёт отдельный поток для каждой подключённой реплики. Этот поток читает журнал упреждающей записи и отправляет его реплике в соответствии с её позицией в журнале. Отдельные потоки необходимы, так как каждая реплика может указывать на разную позицию в журнале и работать с разной скоростью.
-
Существует пул потоков для нерегулярных асинхронных задач, таких как DNS-резолвер или fsync.
-
Существует пул потоков, который может использоваться для параллельной сортировки (и, следовательно, для распараллеливания построения индексов). Для настройки используйте параметр конфигурации memtx.sort_threads. Этот параметр задаёт количество потоков, используемых для сортировки ключей вторичных индексов при загрузке базы данных
memtx.