Как считать количество скачиваний файлов в секунду на множестве серверов в режиме реального времени?



Привет. В одном комменте увидел, что хотите рассказов про реальные проблемы. Их есть у меня. Enterprize SAAS, multitenancy. Выгрузка каталога. Раздается nginx-ом, статикой. Кушает пара десятков тысяч приложений. Когда одновременно - это создает проблемы для канала. CDN нельзя. ДЦ, условно, один - размазать трафик по нескольким нельзя.Чтобы размазать нагрузку, данные отдаются частями с задержкой. Overhead на множество http-запросов, зато нетребовательно к связи. Задержка между частями задается на клиенте.Проблема: когда трафик маленький, грузится все-равно долго.Вопрос: как считать количество скачиваний файлов в секунду на множестве серверов в режиме реального времени, чтобы менять длительность задержки на клиентах?
851   29  

Comments

  1. Юрий Лилеков
    Юрий Лилеков 5 лет назад
    Возможно ли отвечать клиенту о том, чтобы он сделал перезапрос через N секунд?
    • Григорий Кочанов
      Григорий Кочанов 5 лет назад
      да, но как узнать на фронте нагрузку на канал? доступа к роутеру нет
    • Alexander Nesterov
      Alexander Nesterov 5 лет назад
      Чисто теоретически: сплясать от среднего кол-ва коннектов на текущую ноду (равномерно же запросы распределяются?), средний размер отдаваемой части и кол-ва отдающих nginx-нод.
    • Григорий Кочанов
      Григорий Кочанов 5 лет назад
      да, получается как-то так, и даже размер с количеством не нужны
  2. Владислав Ярмак
    Владислав Ярмак 5 лет назад
    а в чем проблема egress трафик шэйпить?
    • Григорий Кочанов
      Григорий Кочанов 5 лет назад
      шейпить трафик могут админы, а мне надо динамически подстраивать мое приложение под уровень нагрузки
    • Владислав Ярмак
      Владислав Ярмак 5 лет назад
      Григорий Кочанов А вы не заодно?
    • Григорий Кочанов
      Григорий Кочанов 5 лет назад
      нет. enterprize. policy
  3. Paul Tru
    Paul Tru 5 лет назад
    Между серверами можете общаться?
    • Григорий Кочанов
      Григорий Кочанов 5 лет назад
      нет, multitenancy, сервера динамические, но могу, теоретически, создать специальные общие редисы, и писать в них о каждом скачивании
    • Paul Tru
      Paul Tru 5 лет назад
      Ну можно в редисы, но можно и на луа прям в nginx опрашивать у соседей stub_status сколько запросов отработано, и считая разницу между прошлым запросом знать эстимейт текущей нагрузки.
    • Григорий Кочанов
      Григорий Кочанов 5 лет назад
      как вариант, каждый сервер может сам по своей личной статистике за прошлую секунду отдавать свое значение, без учета соседей. спасибо!
  4. Андрей Аносов
    Андрей Аносов 5 лет назад
    Как часто обновляется каталог?
    • Григорий Кочанов
      Григорий Кочанов 5 лет назад
      очень редко
    • Григорий Кочанов
      Григорий Кочанов 5 лет назад
      раз в день, раз в неделю
    • Андрей Аносов
      Андрей Аносов 5 лет назад
      Григорий Кочанов Тогда возможно поможет, поддержка на клинте и сервер-е ETag-а. Т.е. nginx вместе в каталогом возвращает ETag заголовок . Клиент, при повторном походе за каталогом передает известный ему ETag. Если на сервере каталог не менялся, то не менялся и ETag, и nginx в этом случае должен отдать 304 статус. Т.е. контент отдаем только если он действительно изменился. Думаю, существенно сэкономите трафик и нагрузку на nginx-ы
    • Григорий Кочанов
      Григорий Кочанов 5 лет назад
      Не-не-не, Дэвид Блейн, это не highload на 2 сервера. Проверка изменения данных, конечно, есть. Иногда звезды сходятся, и тогда надо все, всем, и одновременно. Появление нового каталога, downtime, обновление формата, изменение 90% данных.
    • Андрей Аносов
      Андрей Аносов 5 лет назад
      "Кушает пара десятков тысяч приложений" это и есть хайлоад на 2 сервера. Если мы говорим про "пару десятков" тысяч инстансов приложений, т.е. пару десятков тысяч клиентов. Какой у вас канал и размер каталога, что оно не лезет? Не можете зашепить трафик вашим lnux-ом, шейпите сами. Для отдачи файла одновременно 20к клиентам, вам по большому счету и nginx не нужен. Напишите на любимом вами языке программирования асинхронный, однопроцессный демон, который тащит все 20к коннектов, считает их кол-во и пишет в сокеты размером буфера и с задержкой, которые зависят от кол-ва этих коннектов. Если так хочется nginx-ом, посмотрите на https://github.com/yaoweibin/nginx_limit_speed_module. Запишите в отдельную переменную geo всех сетей с которых вы хотите раздавать файл. Создайте зону limit_speed_zone для этой переменной и зашейпите эту зону в вашем location. Признаюсь, сам этот модуль никогда не использовал, но судя по документации - должно работать.
  5. Paul Tru
    Paul Tru 5 лет назад
    Читайте раздел Балансировка вот тут http://softwaremaniacs.org/.../04/18/controlled-download/
    • Григорий Кочанов
      Григорий Кочанов 5 лет назад
      спасибо, почитаю
    • Андрей Григорьев
      Андрей Григорьев 5 лет назад
      Ванин блог это всё-таки нечто . И неужели хайлоад в 2006-м был таким?)
  6. Василий Степанов
    Василий Степанов 5 лет назад
    Время следующего ожидания - функция от дисперсии времени получения последних Х частей.
    • Григорий Кочанов
      Григорий Кочанов 5 лет назад
      качество сотовой связи в лесах Амазонки вносит очень серьезные коррективы во время получения данных на клиенте, к сожалению
    • Василий Степанов
      Василий Степанов 5 лет назад
      Я так понял, что есть некоторое время между запросами, при котором серверу гарантированно не плохо. Думаю что в лесах даже если всегда будет максимальный таймаут, то этим можно пренебречь по сравнению с временем непосредственно загрузки.
    • Григорий Кочанов
      Григорий Кочанов 5 лет назад
      логично
    • Григорий Кочанов
      Григорий Кочанов 5 лет назад
      Но еще зависит от размера данных, а на трафик это тоже влияет. То есть, на фронте можно сделать req_limit, а на клиенте замер времени и варьирование задержки в некотором диапазоне.Кривое решение, но тоже вариант.
    • Григорий Кочанов
      Григорий Кочанов 5 лет назад
      Нет, резать через req_limit нельзя. У меня задача сделать мягкую подстройку, а не тормозить лишних. С динамическим числом фронт-серверов лимиты для nginx не рассчитать.
  7. Евгений Лисицкий
    Евгений Лисицкий 5 лет назад
    Если я правильно понял задачу: нужно контролируемо (с проверкой прав скачивающего) раздавать некие тяжёлые файлы?Затем нужно подсчитать, кто сколько раз скачал? Вероятно блокировать доступ второй раз к тому же файлу?
    • Евгений Лисицкий
      Евгений Лисицкий 5 лет назад
      Oleg Tsarev Ага. Ради нее целый интернет построили