Каково преимущество клиентской веб-архитектуры Gmail?

Я просто задавался вопросом, что является преимуществом клиентского Gmail архитектуры, следует. Я имею в виду то, что является преимуществом нескольких iframes на странице; один с расположением HTML и второй со всем javascripts?

Разве это не более сложно для выполнения всех операций DOM? (необходимо искать канавку js ifram <-> вершину <-> HTML iframe).

Что делает Вас, эксперты думают?

15
задан palig 21 February 2010 в 23:27
поделиться

3 ответа

Вкратце: для производительности на стороне клиента.

Поскольку в GMail много Javascript (около 700 КБ), для загрузки и запуска всего требуется некоторое время. При использовании отдельного iframe загрузка и запуск Javascript не блокирует пользовательский интерфейс браузера. Скрипты и события пользовательского интерфейса в отдельных фреймах будут выполняться параллельно в популярных браузерах.Этот подход также позволяет вам построить полную DOM для интерфейса в другом iframe , пока скрипты все еще выполняются. В этой статье описываются общие решения проблемы блокирующих скриптов.

Другой iframe необходим, чтобы история браузера работала. Как именно это работает, можно увидеть в реализации в Google Closure Library.

Что касается влияния на сложность проверки правильности манипулирования DOM: все конструкторы компонентов пользовательского интерфейса в GMail (также являющиеся частью библиотеки Closure) принимают необязательный вспомогательный аргумент DOM. Этот помощник привязан к конкретной модели DOM, которая может находиться в другом фрейме. Управление различными DOM полностью встроено в дизайн этих компонентов пользовательского интерфейса.

7
ответ дан 1 December 2019 в 04:17
поделиться

Я совершенно уверен, что для push "reverse-ajax" используются не iframe. Gmail использует систему goog.net.BrowserChannel библиотеки Google Closure Library для их обработки и использует xhr и activex htmlfile транспорты. (См.: http://closure-library.googlecode.com/svn/docs/class_goog_net_BrowserChannel.html)

Это все, что я знаю наверняка, но я предполагаю, что по крайней мере один из фреймов будет предназначен для управления историей.

5
ответ дан 1 December 2019 в 04:17
поделиться

Незначительный момент, который я не вижу в других ответах: При использовании предварительно скомпилированных заголовков, таких как stdafx.h, необходимо сначала включить их. Измените его на:

#include "stdafx.h"
#include <iostream>

и это должно исправить ошибки о нем.

Также может быть проще просто отключить предварительно скомпилированные заголовки: Project > Properties > Configuration Properties > C/C + + > Precompiled Headers > Переключить первый параметр на "Not using precompiled headers". Они могут быть полезны для больших проектов, но будут просто неловкими и раздражающими во время обучения, так как у них есть дополнительные правила (например, "должны быть включены первыми"), которые не являются требованиями стандарта C++.

-121--3221112-

Я склоняюсь к тому, чтобы иметь таблицу основных действий. Если вы пойдете с этим, то это то, что я бы подумал реализовать:

  1. Вы можете создать несколько таблиц действий и сделать UNION ALL при извлечении данных из базы данных. Например, перекатывать их ежемесячно - activity_2010_02 и т.д. Просто на вашем примере - 200K пользователей x 100 друзей x 3 действия = 60 миллионов строк. Не касается производительности PostgreSQL, но вы можете рассмотреть это исключительно для удобства сейчас и в конечном итоге для легкости будущего расширения.

  2. Недостаток заключается в том, что вы запрашиваете пользователей, которые могут никогда не быть активными, и по мере роста списка друзей этот запрос может становиться все медленнее и медленнее.

Вы собираетесь просмотреть весь канал операций, возвращающийся к началу времени? Вы не предоставили много подробностей в первоначальном вопросе, но я бы рискнул догадкой, что вы будете показывать последние 10/20/100 элементы, отсортированные по временной метке. Пары индексов и предложения LIMIT должно быть достаточно, чтобы дать мгновенный ответ (как я только что проверил на таблице с примерно 20 миллионами строк). Это может быть медленнее на занятом сервере, но это то, что должно быть разработано с аппаратными и кэшированием решений, Postgres не будет узким местом там.

Даже если вы предоставляете каналы активности, возвращающиеся на рассвет времени, разбейте на страницы выходные данные! Предложение LIMIT сохранит вас там. Если базового запроса с параметром LIMIT недостаточно или если пользователи имеют длинный список друзей, которые больше не активны, можно рассмотреть возможность ограничения поиска до последнего дня/недели/месяца сначала и затем предоставить список идентификаторов друзей:

select * from activity 
  where ts <= 123456789 
    and source_user in (1, 2, 44, 2423, ... my friend list)

Если имеется таблица, охватывающая месяцы или годы назад, поиск идентификаторов друзей будет выполняться только в строках, выбранных первым предложением WHERE.

Это просто если я выберу между двумя решениями, которые вы рассматриваете сейчас. Я бы также посмотрел на такие вещи, как:

  1. Пересмотр вашей денормализации таблицы. Действительно ли наилучшим способом является хранение предварительно сгенерированных выходных данных HTML? Будет ли вам лучше с точки зрения производительности, если вместо этого будет создана таблица поиска действий, а на лету будут создаваться шаблонные выходные данные? Предварительно созданный HTML может показаться лучше с самого начала, но рассмотрим такие вещи, как дисковое хранилище, API,будущие изменения макета и хранение HTML могут оказаться не столь привлекательными. Таблица поиска может содержать возможные действия - добавление друга, изменение статуса и т. д., и журнал действий будет ссылаться на это и идентификатор друга, если в действии участвует другой пользователь.

  2. Выполнение предварительного создания HTML, но не сохранения его в базе данных. Сохраните материалы на диске как предварительно созданные страницы. Это не серебряная пуля, однако, и во многом зависит от соотношения записи и чтения на вашем сайте. То есть типичный дискуссионный поток на общественном форуме мог иметь десяток сообщений, но его можно было посмотреть сотни раз - хороший кандидат на кэширование. Тогда как если ваше приложение более настроено на немедленные обновления состояния и вам придется заново создавать HTML-страницу и сохранять ее снова на диске после каждой пары просмотров, то в этом подходе мало что стоит.

Надеюсь, это поможет.

-121--2587412-

Это "бесконечный кадр", используемый для обратного ajax (сервер отправляет сообщение клиенту, когда происходит событие, в отличие от обычного ajax, где клиент запрашивает сервер что-либо). Из википедии :

Базовая техника для динамического web приложение должно использовать скрытый IFrame HTML-элемент (встроенный фрейм, который позволяет веб-сайту внедрить один HTML-код документ внутри другого). Это невидимый IFrame отправляется как порция блок, который неявно объявляет его как бесконечно длинный (иногда называемый "forever frame"). По мере возникновения событий iframe постепенно заполняется сценарием теги, содержащие JavaScript для выполняется в браузере. Поскольку браузеры отображают HTML-страницы постепенно, каждый тег сценария выполняется по мере получения.

Одним из преимуществ метода IFrame является что он работает в каждом общем браузере. Два минуса этой техники отсутствие надежной обработки ошибок метод и невозможность отслеживание состояния запроса процесс вызова.

4
ответ дан 1 December 2019 в 04:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: