Comet
David Mzareulyan
david at hiero.ru
Mon Jun 11 02:07:09 MSD 2007
Hello Andrew,
Во-от! В этом-то и состоит нетривиальность задачи:)
Очевидно, единственный способ -- это назначать всем коннектам из пула некие
id-шники, которые надо а) как-то сообщать бэкенду и б) как-то принимать от
бэкенда данные именно для этого id.
Навскидку могу предложить примерно такую схему. Nginx (если в конфиге включён
определённый comet-флаг) передаёт бэкенду вместе с запросом и ID соединения
(отдельным HTTP-заголовком, скажем X-Comet-чтототам). Если бэкенд желает,
чтобы данное соединение оставалось "висящим", то он в ответе тоже указывает
некий флаг-заголовок. Тогда nginx, отдав клиенту ответ, не закрывает с ним
связь (тут нужно, чтобы ответ был "правильным" -- не содержал Content-Lenght
и т.п.).
Теперь как послать данные нужному клиенту. Создаётся location с определённым
comet-флагом, доступная только для бэкенда. Бэкенд в неё POST-ом в любой
момент может что-то записать, указав, опять-таки, в HTTP-заголовке ID клиента-получателя.
Nginx, если клиент с этим ID-ом ещё не отвалился, пересылает ему POST-данные,
а бэкенду говорит "200 OK". Если же клиент отвалился, то -- 404.
Ну, естественно, можно и другие варианты придумать. Роль nginx-а тут исключительно
в поддержании пула коннектов и маршрутизации данных между ними.
> Hello David,
>
DM>> a) дepжит пocтoянныe coeдинeния c клиeнтaми и б) пpинимaeт oт
DM>> бэкенда дaнныe и paccылaeт иx в нyжныe coeдинeния.
DM>>
> как он узнает что в какие-то соединения надо новые данные от бакендов
> получить и засунуть ?
>
--
С уважением
Давид Мзареулян
david at hiero.ru
More information about the nginx-ru
mailing list