Это не задние системные детали, о которых вам нужно беспокоиться, но передняя часть.Наличие открытого соединения все время непрактично в любом реальном масштабе. Вместо этого вы хотите обратное - чтобы можно было быстро и быстро подключать и подключаться к серверу.
Websockets - это сексуальная технология, но опять же, в реальном мире есть issues with proxies, если вы разрабатываете что-то, что должно работать на разных экранах (рабочий стол, планшет, мобильный), это может стать для вас проблемой. Даже добрые долгие опросы могут не работать через брандмауэры и прокси.
Вот хорошая новость: Я думаю, что
«держать опрос для upvote подсчетов для каждого ответа»
является вполне хорошим решением в этом случае. Рассмотрим следующий пример:
- ваш вариант использования не требует каких-либо реальных обновления в режиме реального времени. Существует немного вреда, чтобы увидеть счетчик, обновленный немного позже.
- для очень популярных тем, которые вы хотели бы раздавить несколько голосов/голосов в одном в любом случае
- большинство тем не увидит ни одного голосования -отслеживать трафик вообще в течение нескольких дней/недель, поэтому держать соединение открытым, ожидая события, которое никогда не приходит, - это отходы
- большинство пользователей никогда не будет голосовать за голос или проголосовать за то, что только что прочитало тему, так что ваш уровень чтения/записи по темам будет сильно искажен по отношению к чтению
- Сетевые латентности сильно различаются по клиентам, вы увидите ужасные скорости передачи для ответов 100B http, в то время как этот вялый клиент извлекает свой ответ побайтно ваш драгоценный сервис эр связь и что более важно - нить на заднем сервере занят
Вот что я хотел бы начать с:
- есть браузеры периодически опрашивать новую тему стата, после того, как основной страница загружается
- держите свой MySQL, держите там счетчики. Каждый раз, когда появляется обновление вверх/вниз, DB
- помещает Memcached перед БД в качестве кэш-памяти для записи, то есть каждый раз, когда есть кеш обновления обновления/уменьшения, затем обновляйте БД. Установите явное время истечения срока действия счетчика на 10-15 минут. Каждый раз, когда счетчик обновляется, срок действия продлевается автоматически.
- дизайн этого избирательного HTTP требует, чтобы быть кэшируемыми по HTTP прокси, установите истекают и ТТЛ заголовки HTTP, чтобы быть 60 сек
- поставить обратный прокси-сервер (Varnish, nginx) перед фронтальными серверами, имеет этот прокси сделать кэширование указанных вызовов. Они заботятся о кеше второго уровня и помогают быстрее освобождать серверные серверные потоки, см. Информацию о сетевых записях выше
- настроить ваш обратный прокси-компонент для общения с серверами memcached напрямую без звонка на серверный сервер, да если вы можете сделать это как с лаком, так и с nginx.
- нет никакой привлекательной схемы для хранения таких данных, это простая операция
inc()/dec()
в memcached, обратите внимание, что она безопасна с точки зрения состояния гонки.Это также безопасная атомная операция в MySQL UPDATE table SET field = field + 1 WHERE [...]
Агрессивное кэширование многоуровневый охватывает ваш read
путь: в Memcached и во всех HTTP кэши по пути, обратите внимание, что эти запросы HTTP опрос будет кэшируются на edges, а также.
Чтобы позаботиться о длинном хвосте непопулярной темы - сделайте http ttl для таких ответов обратным пропорциональным популярности.
Запрос на чтение будет редко попадать на внешний сервер, когда кэш кэша истек, а memcached также не имеет его. Если это все еще проблема, добавьте memecached серверы и увеличьте время истечения срока действия в memcached по всей доске.
После того, как вы закончили с этим, у вас есть все reads
. Единственная проблема, которую вы все еще можете иметь, в зависимости от масштаба, - это высокая скорость writes
т. Е. Поток голосов вверх/вниз. Здесь ваш единственный экземпляр MySQL может начать показывать некоторые задержки. Не бойтесь - продолжайте по старой дорожке с чередованием ваших экземпляров или добавьте NoSQL-хранилище только для счетчиков.
Не используйте систему обмена сообщениями, если это абсолютно необходимо, или вы хотите, чтобы с ним было оправдание.
Для опроса используйте длительный опрос, который по меньшей мере уменьшает количество просмотров на сервере. У вас есть петля с задержкой в конце и выходите из цикла, когда вы находите что-то, чтобы отчитываться перед фронтом (или после фиксированного времени, чтобы остановить сиротские запросы, оставаясь слишком долго). Затем внешний интерфейс обрабатывает данные и отправляет следующий запрос. – Kickstart
Вам нужно только обновить количество голосов или многое другое? Объем данных и то, как часто обновляются обновления/получение данных с сервера, определяет, какие технологии/методы использовать.
Если это только количество голосов, то используйте обычный AJAX-101, передайте серверу массив идентификаторов сообщений и верните объект JSON (несколько килобайт) нового счетчика голосов и с простым jquery обновите представление, запустите это каждые 2 секунды с помощью setInterval и очистите его самостоятельно, чтобы не было большого использования памяти. – MJoraid
Этот процесс можно оптимизировать. Если вы хотите подключиться к серверу в режиме реального времени, просто немного обновите свои методы и используйте node.js. Если вы ожидаете, что объем данных должен быть обновлен, он будет увеличиваться, а затем использовать тот же техно, что и в системе чата facebook/gmail/yahoo «Протокол обмена сообщениями в реальном времени» => «- это протокол на основе TCP, который поддерживает постоянные подключения и позволяет плавно передавать потоки и передавать как можно больше информации, он разбивает потоки на фрагменты и их размер согласовывается динамически между клиентом/сервером « – MJoraid