Модуль для доступа к базе данных, но без ngx_http_upstream_t

Sergey Avseyev sergey.avseyev at gmail.com
Wed Jun 19 17:15:21 UTC 2013


Привет всем,

Я написал nginx модуль, для доступа к базе данных Couchbase[1]. Этот
модуль получился немного не обычным:

1) используется библиотека libcouchbase, которая сама рулит установкой
обработчиков на события, и выполнением собственно IO из них. Так что
пришлось написать плагин[3], который подставляет функции nginx в виде,
удобном для libcouchbase.

2) частично потому что IO выполняется внутри libcouchbase, как и
маршрутизация запроса в кластер (основанная на хешировании ключа),
пришлось отказаться от использования ngx_http_upstream_t (хотя тут я
могу ошибаться). Кроме того libcouchbase может асинхронно получить по
конфигурационному сокету информацию об изменении топологии кластера, и
закрыть часть рабочих сокетов, и подготовить к открытию по требованию
новые.

В ходе тестирование оказалось, что моя реализация неплохо работает как
с под-запросами из других модулей, так и обычными прямыми запросами.
Но всё же нашёлся случай, когда модуль (к его исходникам у меня нет
доступа) делает позапрос в мой, и рассчитывает, что в можно будет
получить содержимое результата через r->upstream->buffer или статус
через r->upstream->state->status.

Собственно вопрос, может ли существовать модуль в экосистеме nginx,
который не заполняет r->upstream в обработчике?

[1]: https://github.com/couchbaselabs/couchbase-nginx-module
[2]: https://github.com/couchbaselabs/couchbase-nginx-module/blob/master/src/ngx_lcb_plugin.c

--
Sergey Avseyev


Подробная информация о списке рассылки nginx-ru