Как стать автором
Обновить

Комментарии 20

Код - картинками, да ещё и serif-шрифтом...

Досадная ошибка при форматировании, исправились, спасибо вам.

Мы разрабатываем клиенты при помощи веб-технологий, с использованием фреймворка Angular.

Не самый лучший выбор, если вам нужно отображение больших объёмов данных данных в реальном времени.

При непрерывной работе клиента утечки накапливаются и могут привести к потере производительности, зависанию интерфейса, а в худшем случае – к out of memory браузера.

Поэтому важно, чтобы используемый фреймворк поддерживал автоматический контроль времени жизни ресурсов. Опять же, Angular это не поддерживает.

пусть при фактическом поступлении данных каждые 200 мс настраивается период троттлинга в 1 секунду. В этом случае данные за 1 секунду будут накапливаться, а обрабатываться будет только последнее значение, прочие значения будут игнорироваться. Интерфейс также будет перерисовываться не чаще одного раза в секунду.

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

Для «тонкой настройки» обработки данных мы рекомендуем библиотеку RxJS. Библиотека позволяет манипулировать данными в функциональном стиле, в том числе ограничивать обработку данных с помощью троттлинга. А с помощью функции distinctUntilChanged библиотеки можно определять, что новые данные не отличаются от предыдущих, и за счет этого оптимизировать частоту обновления интерфейса и исключать «паразитные» перерисовки, когда данные не изменились.

Лучше всё же использовать системы реактивности, которые занимаются этим самостоятельно, а не требуют постоянной "тонкой настройки".

Опять реклама $mol? Непонятно только зачем. Ибо что ни тезис, то какая-то белиберда.

В статье не утверждается, что Angular единственно верный вариант решения.
Мы стремились описать такие кейсы, которые были бы применимы вне зависимости от используемой библиотеки или фреймворка.

Если ваш стек позволяет реализовать их из коробки, отлично!

А если вы работаете с Angular и вам потребовалось реализовать промышленный АРМ, то не унывайте. Мы собрали основные проблемы и вы можете закрыть их за 5 минут, пользуясь примерами выше.

Я работал с Angular в связках с RxJS, NgRx, MobX. Занимался исправлением его детски болезней и оптимизациями. И могу определённо сказать: Angular - просто неверный вариант решения. Особенно для условий, когда надо работать быстро, долго и стабильно.

Зато можно долго и стабильно продавать сервис.

Занимаюсь тем же самым. Только не JavaScript, а C#, все серверные задачи оформлены как службы, все логи с утечками памяти мониторятся централизовано в реальном времени. Переподключение при потере связи — само собой, конечное или бесконечное количество попыток зависит от контекста, запись в лог пишется однократно при попытках>2. Все логи пишутся в один и тот журнал подсистемы EventLog Windows, а не раскиданы по разным текстовым файлам или консолям. В некоторых задачах параметры из .ini файла подгружаются динамически, без необходимости перезапуска приложения или службы.

Для логирования мы используем ELK и это очень удобно, посмотрите, может вам тоже подойдет.

Особенно, когда много сервисов, данных и логов.

В Kibana быстро набрасываются дашборды и отчеты.

Анализ ошибок и сопровод сильно упрощаются.

Бизнесовые метрики также можно завернуть на Elastic.

Я остановился на стандартном журнале событий потому, что в него пишет и сама Windows, и её драйвера, и СУБД Sybase ASE, у нас используемая. Сложно представить, как это всё принудительно перевести на другую систему логирования.

И в целом я стремлюсь к минимизации сторонних фреймворков до предела. Потому что одно дело — быстро накидать работающее решение, и совсем другое — обеспечить ему надёжность и кувалдоустойчивость. Ну и события последних дней показали, что импортозамещение — не такая уж и бредовая идея.

Ничего личного, но для систем реального времени есть специализированный софт и разрабатывать вот это все, с моей точки зрения и опыта, смотрится как - "Мы выиграли тендер в России, но бюджет был недостаточный для покупки SCADA-системы и решили сделать это все на web'е". Может я конечно и утрирую, но в нефтянке вот это все бы точно не прокатило...

Дело в том, что просто взять и внедрить SCADA никто не даст, даже если бюджет такое позволит.

У предприятия есть безопасность, существующие тех процессы и тех инструкции, системы всех уровней автоматизации от L2 до L4. Получить разрешение на изменение этих систем или внедрение новых это проект совершенно другого уровня и бюджета, как вы верно заметили.

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

Для SCADA это слишком локальная задача, если бы мы ее решили таким образом, уверен, нас бы упрекнули в том, что мы внедрили SCADA для задачи, которая решается парой микросервисов :) я утрирую, но думаю суть понятна.

P.S. Я бы не сказал, что у нас система реального времени. Да, мы выводим медиа на фронт в реальном времени, но это вершина айсберга.

Спасибо за ответ, многое прояснилось. Вероятно, Ваше решение было в данном случае наиболее оптимальным.

Автоперезагрузка страницы ровно в 00:00:00 каждого дня может не сработать — Interval при торможении может выполняться с задержками, в Хроме на не видной вкладке так и вообще ежесекундный Interval может раз в 5 минут выполняться (это, конечно, не ваш кейс, но всё равно). Но даже задержки в 100 мс достаточно, чтобы с шансом в 10% не попасть в нужную секунду.

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

Хотя конкретно с Хромом, location.reload() всё равно не сильно помогает. Можете сами убедиться через диспетчер процессов shift+escape, что когда вкладка начинает занимать кучу памяти, простым F5 это не лечится, а вот открытием новой вкладки и закрытием старой — вполне. Средствами JS это кроссбраузерно не сделать, так что можно либо написать несложный плагин к браузеру, либо инструкцию пользователю.

Это надо делать не плагином и не инструкцией, а средствами планировщика ОС.

Вы правы! По изменению дня обновлять страницу было бы надежнее. Добавлю в статью уточнение.

На этот случай у нас есть дополнительное обновление страницы не из приложения. В статье это не описано, но мы также обновляем страницу средствами ОС. При установке киоска есть возможность настроить автоперезагрузку страницы.

Можно настроить и рестарт браузера, но с этим проблем становится только больше.

Вот из-за таких проверок и говорят потом, что Ангуляр педальный

JSON.stringify(x) === JSON.stringify(y)

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

Простите, но причем здесь Ангуляр?

Да, мы можем слать одинаковые данные клиенту, так устроена архитектура.

При том, что в нормальных фреймворках эта строчка вообще не нужна. Тем более в таком неэффективном виде с двойной полной сериализацией.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий