Skip to content

Получение записей из Tokyo Tyrant и асинхронно-синхронный код

08/02/2010

Пытаясь использовать Tokyo Tyrant для хранения записей блога, я столкнулся с неприятным багом. При получении записей и показе их на странице всё было нормально, но при попытке стресс-тестирования с помощью Apache Benchmark Нода просто вываливалась с ошибкой Error: Unhandled emitError. Сперва оказалось что я просто забыл добавить errBack к фукции поиска в Tokyo Tyrant (оказывается, это наказуемо не хуже чем Unhandled Exception), но потом в этой функции-обработчике я стал получать ошибки Tyrant Error: 1. Гуглинг ничего не дал, и я наконец задумался над тем как выполняется мой код в Node 🙂

Вначале я делал всё довольно по дурацки (Вы можете увидеть код в другом моём посте) — итерация по массиву и получение каждого найденного элемента из Tyrant. Здесь необходимо помнить что хотя мы и программируем в асинхронном стиле, канал связи с TCP-сервером (а связь с Tyrant происходит именно так) по прежнему остаётся синхронным. И если мы пошлём следующую команду, не дождавшись результата предыдущей, последствия могут быть самыми непредсказуемыми 🙂

Быстрый просмотр кода коннектора показал что никаких намёков на очередь команд там нет. Команда пытается выполниться сразу по получению. Судя по всему, пока я вызывал сервер из браузера, Tyrant успевал отвечать на запросы раньше чем послались новые. Но под нагрузкой, создаваемой ab команды отправлялись серверу быстрее чем были получены ответы. В комментариях к предыдущему топику товарищ Boo совершенно правильно указал мне что для получения списка значений из Tyrant следует применять команду getlist вместо нескольких команд get. И действительно, после такой замены ab стал проходить нормально, node перестала вылетать. Правда, выявилась другая странность: запрос страницы с помощью ab -n 1 занимает гораздо больше чем запрос той же страницы с помощью wget. Но с этим я тоже разберусь чуть позже.

Advertisements
Добавить комментарий

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s

%d такие блоггеры, как: