Кіріспе

Веб-қосымша моделі
Comet – браузердің нақты сұрауы болмаса, ұзақ сақталатын HTTPS сұранысы веб-серверге деректерді жіберуге мүмкіндік беретін веб-қосымша моделі. Comet – бұл әрекеттесуді жүзеге асырудың әртүрлі техникаларын қамтитын жалпы термин. Бұл әдістердің бәрі де браузерлерде дефолтты түрде қамтылған JavaScript сияқты мүмкіндіктерге, дефолтты емес плагиндерге емес, сүйенеді. Comet әдісі веб-сайттың бастапқы моделінен өзгеше, онда браузер бір мезгілде толық веб-бетті сұрайды. Айналма Ajax, екі бағытты веб және HTTP сервері итерімі, басқалардың арасында. Comet термині акроним емес, оны 2006 жылы Алекс Расселл өзінің блогында қолданған. Соңғы жылдары WebSocket және Server Sent Events стандартталуы мен кең қолдауы Comet моделін қолданыстан шығарды.

Ерте Java апплеттері

Java апплеттерін браузерлерге ендіру мүмкіндігі (1996 жылдың наурызында Netscape Navigator 2.0 нұсқасынан бастап) браузер мен сервер арасында шикі TCP сокетін пайдаланып, екі жақты үздіріліссіз байланысты қамтамасыз етті. Бұл сокет браузер апплет орналасқан құжатта болған кезде ашық күйінде қалуы мүмкін. Оқиға туралы хабарламалар кез келген форматта – мәтіндік немесе бинарлық – жіберілуі мүмкін және апплет арқылы декодталады.

Браузерден браузерге алғашқы байланыс жүйесі

Браузерден браузерге байланысты қолданатын алғашқы қолданба 1996–98 жылдары Сиракуз университетінің Солтүстік-шығыс параллельді архитектуралар орталығында (NPAC) DARPA қаржыландыруымен іске асырылған Tango Interactive болды. TANGO архитектурасы Сиракуз университетімен патенттелген. TANGO фреймворкі қашықтықтан білім беру құралы ретінде кеңінен қолданылды. CollabWorx компаниясы бұл фреймворкті коммерцияландырды және ол АҚШ Қорғаныс министрлігінде онға жуық басқару және бақылау, сондай-ақ оқу қолданбаларында пайдаланылды.

Бірінші Comet қолданбалары

Comet-тің алғашқы іске асырылулары 2000 жылға, Pushlets, Lightstreamer және KnowNow жобаларына жатады. Pushlets, Just van den Broecke жасаған құрылым, алғашқы ашық кодты іске асырулардың бірі болды. Pushlets серверлік Java сервлеттеріне және клиенттік JavaScript кітапханасына негізделген. Bang Networks – Netscape-тің негізін қалаушы Марк Андрессен қолдаған Силикон аңғарының стартапы, бүкіл веб үшін нақты уақыттық жіберу стандартын құруға күш салды. 2001 жылдың сәуірінде Чип Морнингстар Java-ға негізделген (J2SE) веб-серверді әзірлеуді бастады, ол өзі жасаған HTTP сервері мен Дуглас Крокфорд жасаған клиент арасында екі байланыс арнасын ашық ұстау үшін екі HTTP сокетін пайдаланды; 2001 жылдың маусымынан бастап жұмыс істейтін демонстрациялық жүйе болды. Сервер мен клиент State Software, Inc. компаниясының негізін қалаушылары Крокфордтың ұсынысы бойынша JSON деп аталатын хабарламалар форматын қолданды. Тұтас жүйе, клиенттік кітапханалар, JSON деп танылатын хабарламалар форматы және сервер Мемлекеттік қолданбалар негізіне айналды, оның бөліктері Sun Microsystems, Amazon.com, EDS және Volkswagen компанияларына сатылды және қолданылды. 2006 жылдың наурызында бағдарламалық жасақтама инженері Алекс Расселл өзінің жеке блогында Comet терминін енгізді. Жаңа термин Ajax-қа сілтеме жасады (Ajax және Comet АҚШ-та кең таралған үй шаруашылығы тазартқыштары). 2006 жылы кейбір қолданбалар осы техникаларды кеңірек аудиторияға таныстырды: Meebo-ның көп протоколды веб-чат қолданбасы пайдаланушыларға AOL, Yahoo және Microsoft чат платформаларына браузер арқылы қосылуға мүмкіндік берді; Google Gmail-ге веб-чатты қосты; JotSpot, кейін Google сатып алған стартап, Comet негізіндегі нақты уақыттағы бірлескен құжат өңдеуін жасады. Java негізіндегі ICEfaces JSF фреймворкі сияқты жаңа Comet нұсқалары құрылды (бірақ олар "Ajax Push" терминін қалайды).

Қолданылу

Comet қолданбалары сервер мен клиент арасындағы тұрақты немесе ұзақ сақталатын HTTP байланысын пайдалана отырып, екі жақты үздіріліссіз өзара әрекеттесуді ұсынады, осы арқылы веб-модельдің және дәстүрлі сауалнаманың беттік шектеулерін жоюға тырысады. Браузерлер мен проксилер серверлік оқиғаларды ескере отырып жасалмағандықтан, осы мақсатқа жету үшін әртүрлі артықшылықтары мен кемшіліктері бар бірнеше техникалар әзірленді. Ең үлкен қиындық – HTTP 1.1 спецификациясы, онда «Бұл спецификация клиенттерді көптеген қосылымдарды ашуда сақтық танытуға шақырады» делінген. Сондықтан, нақты уақыт оқиғалары үшін бір қосылысты ашық ұстау браузердің жұмыс істеуіне теріс әсер етеді: браузер бұрынғы сұраудың нәтижесін күтіп тұрғанда жаңа сұрау жіберуден тоқтауы мүмкін, мысалы, бірнеше суреттің тізбегін жүктеу кезінде. Бұл мәселені нақты уақыт ақпараты үшін бөлек хост атауын жасау арқылы шешуге болады, ол бірдей физикалық сервердің псевдонимі болып табылады. Бұл стратегия доменді бөлудің бір түрі. Comet-ті жүзеге асырудың нақты әдістері екі негізгі санатқа бөлінеді: ағын және ұзақ сауалнама.

Жасырын iframe

Динамикалық веб-қосымшаның негізгі әдісі жасырын iframe HTML элементін пайдалану (инлайн фрейм, бұл веб-сайтқа бір HTML құжатын екіншісіне ендіруге мүмкіндік береді). Бұл көрінбейтін iframe бөлінген блок ретінде жіберіледі, ол оны шексіз ұзақ деп жариялайды (кейде "мәңгілік кадр" деп аталады). Оқиғалар орын алған кезде iframe біртіндеп скрипт тегтерімен толтырылады, онда браузерде орындалатын JavaScript болады. HTML беттерді шолғыштар бірте-бірте көрсеткендіктен, әр скрипт тегі алынған кезде орындалады. Кейбір браузерлер талдауды және орындауды бастамас бұрын белгілі бір минималды құжат өлшемін талап етеді, оны бастапқыда 1–2 кБ толтыру кеңістігін жіберу арқылы алуға болады. Iframes әдісінің бір артықшылығы - ол барлық жалпы браузерлерде жұмыс істейді. Бұл техниканың екі кемшілігі - сенімді қателерді өңдеу әдісінің болмауы және сұрауды шақыру процесінің жай-күйін қадағалаудың мүмкін еместігі. Яғни, егер негізгі веб-бет бір SLD-дан көрсетілсе, ал Comet сервері басқа SLD-де орналасқан болса (ол жерде ресурстарды ортақ пайдалану мүмкіндігі жоқ), Comet оқиғалары негізгі беттің HTML және DOM-ін өзгерту үшін қолданылмайды. Бұл мәселені бір немесе екі көздің алдында прокси-сервер құру арқылы болдырмауға болады, оларды бір доменнен шыққандай етіп көрсетуге болады. Алайда, бұл күрделілік немесе өнімділік себептерімен жиі қолайсыз. Iframes немесе XMLHttpRequest объектілерінен айырмашылығы, скрипт тегтері кез келген URI-ге бағытталуы мүмкін, ал жауаптағы JavaScript коды ағымдағы HTML құжатында орындалады. Бұл екі сервер үшін де қауіпсіздікке қауіп төндіреді, бірақ деректерді жеткізушіге (біздің жағдайда Comet серверіне) қауіп төндіруден аулақ болуға болады, JSONP пайдалану арқылы. Ұзақ сауалнамалық Comet көлігін скрипт элементтерін динамикалық түрде құру және олардың көзін Comet серверінің орналасуына орнату арқылы жасауға болады, содан кейін ол JavaScript (немесе JSONP) қайтарылып, оның пайдалы жүктемесі ретінде кейбір оқиғалар жіберіледі. Скрипт сұранысы орындалған сайын, браузер жаңасын ашады, дәл XHR ұзын сауалнама жағдайындағыдай. Бұл әдістің айқаспалы браузерлік болудың артықшылығы бар, сонымен бірге айқаспалы доменді іске асыруға мүмкіндік береді. Ол жаңа JavaScript интерфейсі EventSource және жаңа MIME түрі text/event-stream-ді анықтайды. Microsoft Internet Explorer-ден басқа барлық негізгі браузерлер осы технологияны қамтиды. HTML 5 WebSocket API жұмыс жобасы сервермен тұрақты байланыс құру және onmessage кері шақыру арқылы хабарламаларды қабылдау әдісін анықтайды. Доджо қорының Bayeux протоколы. Ол браузерге тән транспортты қалдырады және браузер мен сервер арасындағы байланыс үшін жоғары деңгейдегі протоколды айқындайды, оның мақсаты бірнеше Comet серверлерімен клиенттік жақтағы JavaScript кодын қайта пайдалануға мүмкіндік беру және бір Comet серверінің бірнеше клиенттік жақтағы JavaScript іске асырылуымен байланысуға мүмкіндік беру. Bayeux жариялау/жазылу моделіне негізделген, сондықтан Bayeux-ті қолдайтын серверлерде жариялау/жазылу орнатылған. XMPP стандарттар қоры жасаған BOSH протоколы. Ол екі синхронды HTTP қосылысын пайдалану арқылы браузер мен сервер арасындағы екі бағыттағы ағынды эмуляциялайды. Дуглас Крокфорд ұсынған JSONRequest объектісі XHR объектісіне балама болар еді. Java апплеттері немесе Adobe Flash (Flash бағдарламаларына деректерді ағынды ету үшін RTMP протоколын пайдалану) сияқты плагиндерді пайдалану. Бұлардың артықшылығы бар, олар барлық браузерлерде тиісті плагин орнатылған кезде бірдей жұмыс істейді және HTTP қосылымдарына сүйенудің қажеті жоқ, бірақ плагин орнатылуы керек. Google Google App Engine үшін жаңа Channel API жариялады, браузерде клиенттік JavaScript кітапханасының көмегімен Comet сияқты API-ді іске асырады. Бұл API қолданылуы тоқтатылды.