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