По вашему запросу ничего не найдено :(
Убедитесь, что запрос написан правильно, или посмотрите другие наши статьи:
img
Процесс анализа программного кода должен быть максимально автоматизирован. Когда вы создаете запрос на включение изменений, как минимум, вам нужно запустить модульные тесты и статический анализ программного кода в функциональной ветке. Средства автоматизации могут многое рассказать о качестве кода: метрики, покрытие кода модульными тестами, обнаружение дублированных строк и т.д. Однако есть как минимум 50 вещей, которые нельзя проверить автоматически. Они нуждаются во внимательном взгляде опытного проверяющего (это дает нам хоть какую-то надежду на то, что роботы не заменят разработчиков в ближайшем будущем). Требования Программный код реализует все функциональные требования, которые необходимы заказчику? Программный код удовлетворяет всем нефункциональным требованиям, таким как производительность и безопасность? Если нефункциональные требования не были упомянуты заказчиком, то этот вопрос необходимо уточнить у проектировщика или у самого заказчика.  Условия сопровождения Помещены ли все интерфейсы, классы и т.д. на соответствующий прикладной уровень в соответствии с архитектурой  Onion/Clean ? Не изобретаете ли вы колесо, когда пишете программный код? Можно ли его заменить чем-то, что уже существует и что предоставляет какая-либо сторонняя библиотека?  Есть ли уже реализованная логика или какие-то ее фрагменты в кодовой базе? Правильно ли была выбрана область жизненного цикла для интерфейса и реализации в контейнере внедрения зависимостей? Являются ли реализованные функции детерминированными (то есть всегда ли они выдают один и тот же результат для одних и тех же входных данных)? Все ли зависимости явно внедряются через конструктор типов? Есть ли сильная связанность между классами, которая может затруднить повторное использование кода? Используются ли  объекты-значения вместо элементарных типов данных для того, чтобы избежать проблемы одержимости элементарными типами? Соответствуют ли реализованные компоненты, такие как функции, классы, интерфейсы и модули,  принципу единственной обязанностей ? Расширяются ли существующие функциональные возможности при помощи декораторов, технологий аспектно-ориентированного программирования (принципа открытия-закрытия) или они модифицируются на месте? Правильно ли реализованы механизмы синхронизации потоков при доступе к объектам-одиночкам в веб-приложениях? Используются ли по возможности  неизменяемые типы данных вместо изменяемых для того, чтобы избежать побочных эффектов? Добавлена ли функция ведения журнала с верными  уровнями ведения протокола в основные места кода, которые требуют отслеживания? Производительность Правильно ли были выбраны  структуры данных ? Например, используется ли структура Hashtable вместо массива, когда нужно часто искать значения, для того, чтобы избежать линейного поиска? Распараллелены ли длительные операции между всеми доступными ядрами для того, чтобы использовать ресурсы компьютера максимально эффективного? Выполняет ли программный код большое количестве  операций по выделению памяти для объектов в куче, оказывая тем самым дополнительную нагрузку на программу сборки мусора? Кэшируются ли данные, которые были считаны из базы данных, локально или в удаленном кэше? Сколько раз текущий код обращается к базе данных? Возможно стоит получить все данные за одно или несколько обращений? Выполняет ли код все обращения к базе данных, ввод-вывод и другие блокирующие вызовы асинхронно? Использует ли код  пул потоков по максимуму вместо того, чтобы создавать новые потоки? Правильно ли выбран баланс между  нормализацией и  денормализацией при создании дополнительных таблиц базы данных? Правильно ли добавляются или исправляются индексы, если запрос на включение изменений содержит новые SQL-запросы? Возникает ли  проблема с N+1 запросами при извлечении данных из базы данных при помощи фреймворка ORM? Установлен ли правильный уровень изоляции транзакций в хранимых процедурах? Возвращают ли SQL-запросы избыточные данные из базы данных, которые не требуются для кода приложения? Используется ли что-то вроде  SELECT * или что-то подобное? Модульное и интеграционное тестирование Полностью ли модульные тесты покрывают дополнительную логику? При появлении исправлений в логике, появляются ли изменения в соответствующем модульном тесте? Всегда ли все реализованные модульные или другие виды тестов ведут себя детерминировано? Например, приостанавливают ли они выполнение потока на какой-то определенный период времени перед утверждением (что по своей сути является ошибочным шаблоном)?  Все ли модульные тесты реализованы в соответствии с принципами  F.I.R.S.T. ? Есть ли какие-либо признаки проблем в модульном тестировании, такие как проблемы с  логикой проверки условий ,  рулеткой с утверждениями ,  дублированием утверждений и другие? Добавлен ли интеграционный тест, как минимум, для happy-path-сценария (сценария счастливого пути) реализованной функции? Все ли зависимости тестируемого объекта имитируются для того, чтобы модульный тест случайно не превратился в интеграционный и не выполнился быстрее положенного? Изолированы ли модульные и интеграционные тесты друг от друга? Конечные точки API Выбираются ли HTTP-команды, такие как  GET, POST, PUT, DELETE и другие, в соответствии с действием их конечной точки? Отвечает ли каждая конечная точка API за выполнение лишь одной бизнес-операции? Или все же нескольких? Возвращает ли конечная точка API правильный код состояния? Например, не возвращает ли она код 401 вместо 500 при несанкционированном запросе? Сжимаются ли объемные ответы перед их отправкой вызывающей стороне? Защищены ли конечные точки API политиками аутентификации и авторизации? Позволяет ли API, который возвращает большой список объектов, фильтровать его и разбивать на страницы? Является ли конечная точка API GET идемпотентной? Используются ли имена существительные вместо глаголов в именах конечных точек API? Критические изменения Имеются ли в конечной точке API такие критические изменения, как переименование API, удаление или переименование его параметров? Имеются ли критические изменения в полезных данных сообщения (в случае, если используется брокер сообщений), например, удаление или переименование его свойств? Повлияют ли такие изменения в схеме базы данных, как удаление столбцов или таблиц, на другие службы системы? Системная среда Насколько загружен ЦП и сколько оперативной памяти потребляет код при выполнении запроса на включение изменений? Будет ли в средах, в которых будет развернут код (среда тестирования, среда приёмочного пользовательского тестирования, производственная среда), достаточно мощный процессор и достаточный объем оперативной памяти для эффективного выполнения кода? Будет ли реализованная логика, алгоритмы, структуры данных и т.д. работать достаточно быстро на большом наборе данных, который может быть в производственной среде? Документация Была ли изменена документация для того, чтобы отразить новые изменения программного кода (документация API, документация по структуре, проектная документация)? Создается ли тикет  технических недоработок , если запрос на внесение изменений содержит неэффективный или «грязный» код, который сейчас невозможно перестроить из-за недостаточного количества времени? Заключение Количество пунктов, на которых проверяющий должен заострить свое внимание, зависит от конкретного проекта и даже от конкретного запроса на внесение изменений. Ваш с коллегами мозговой штурм (если вы примите во внимание вышеприведенные пункты) может значительно снизить риск того, что вы забудете о чем-то важно при анализе программного кода.   
img
В сегодняшней статье рассмотрим сценарий с настройкой отказоустойчивости на маршрутизаторе Cisco с использованием двух интернет провайдеров. При случае аварии у вашего интернет оператора отказоустойчивость с использованием двух провайдеров является очень хорошей идеей, более того – иногда без этого не обойтись. Однако, в таком сценарии часто необходимо использовать протокол маршрутизации BGP, который довольно нелегок в настройке и предъявляет высокие требования к оборудованию. В большинстве случаев, вам необходимы две выделенных IPv4 подсети – но учтите, что покупка IPv4 блока является довольно дорогостоящей затеей. Однако, есть альтернативное и более бюджетное решение – если вам не нужна целая подсеть от провайдера, у вас может быть основной и запасной WAN каналы и использовать NAT для обоих линков с автоматическим фэйловером. Данный сценарий будет работать только для сетей, у которых есть исходящий трафик. Описание сценария и настройка В примере ниже мы продемонстрируем стандартную топологию – данное решение задачи будет работать во многих сценариях. Вы все еще можете использовать BGP соединение для каждого провайдера, который анонсирует дефолтный маршрут, однако, как правило, провайдеры делают это за отдельную плату. В данной топологии мы будем использовать два плавающих статических маршрутах. На топологии ниже у нас есть два WAN соединения (ISP1 – основной линк и ISP2 – запасной линк). Нам просто необходимо предоставить доступ в интернет для нашей внутренней подсети. Все настройки в данной статье были выполнены на маршрутизаторе Cisco 891-K9 с двумя WAN портами и IOS версии c880data-universalk9-mz.153-3.M2.bin Настройка маршрутизатора Сначала настраиваем интерфейсы: interface GigabitEthernet0 description Internet_ISP1_Main ip address 10.10.10.10 255.255.255.0 no ip proxy-arp ip nat outside //включаем NAT на первом интерфейсе interface FastEthernet8 description Internet_ISP2_Back-up ip address 100.100.100.100 255.255.255.0 no ip proxy-arp ip nat outside //включаем NAT на втором интерфейсе interface Vlan1 description Local_Area_Network ip address 192.168.1.1 255.255.255.0 ip nat inside //весь сгенерированный трафик будет NATирован Затем настраиваем ACL (лист контроля доступа) в соответствии с нашей внутренней подсетью: ip access-list extended NAT_LAN permit ip 192.168.1.0 0.0.0.255 any Переходим к настройке маршрутных карт, которые будут выбирать какой трафик НАТировать на каждом интерфейсе: route-map NAT_ISP1_Main permit 10 match ip address NAT_LAN //совпадение для настроенного прежде ACL с внутренней подсетью match interface GigabitEthernet0 //совпадение для первого WAN интерфейса ! route-map NAT_ISP2_Back-up permit 10 match ip address NAT_LAN //совпадение для настроенного прежде ACL с внутренней подсетью network match interface FastEthernet8 //совпадение для второго WAN интерфейса Настраиваем отслеживание и SLA для замены канала в случае аварии: ip sla 1 icmp-echo 8.8.8.8 source-interface GigabitEthernet0 //пингуем DNS Гугла используя первый интерфейс frequency 30 //пинги отправляются раз в 30 секунд ip sla schedule 1 life forever start-time now //SLA респондер включен track 1 ip sla 1 //“объект” для отслеживания создан с помощью IPSLA1 Добавляем маршруты по умолчанию: ip route 0.0.0.0 0.0.0.0 10.10.10.1 track 1 ip route 0.0.0.0 0.0.0.0 100.100.100.1 30 Пока объект track 1 «поднят», первый маршрут будет указан в таблице маршрутизации. Если данный объект «упадет», то маршрут будет заменен на второй маршрут по умолчанию с метрикой 30. Как заключительный шаг – включаем NAT: ip nat inside source route-map NAT_ISP1_Main interface GigabitEthernet0 overload ip nat inside source route-map NAT_ISP2_Back-up interface FastEthernet8 overload
img
Протокол EIGRP имеет гораздо более быструю сходимость по сравнению с протоколами RIP и IGRP, потому что в отличие от дистанционно – векторных протоколов маршрутизации, которым необходимо передать таблицы маршрутизации для сходимости, в протоколе EIGRP соседи маршрутизаторы обмениваются только “Hello” пакетами. Используя протокол EIGRP, маршрутизаторы узнают друг друга в процессе сходимости, обмениваясь различными параметрами для установления таблиц маршрутизации. Аналогичные процессы происходят в протоколе OSPF и других протокола состояния канала. Два маршрутизатора могут стать соседями только при выполнении следующих условий: Произошел успешный обмен “Hello” сообщениями Интерфейсы находятся в рамках одной автономной системы Используют одинаковые метрики: EIGRP использует полосу пропускания и задержку в качестве метрик по умолчанию. Если вы решите использовать и другие метрики, такие как загрузка, надежность и MTU, то их необходимо настроить на обоих маршрутизаторах. Таймера “Hello” пакетов используют одно и то же значение для следующих значений: Частота, с которой маршрутизаторы отправляют “Hello” пакеты друг другу. Время, в течении которого, маршрутизатор не отвечает на пакеты и маркируется недоступным. «Hello» пакеты отправляются не только во время процесса сходимости, но и после, для отслеживания статуса того, или иного узла маршрутизации. Если маршрутизатор становится недоступен (не отвечает на пакеты «Hello»), то по истечению указанного выше таймера маршрутизатор отмечаются как недоступный. Обновление маршрутов Даже после полной сходимости, EIGRP продолжает обновлять маршруты на основании доступности роутеров – соседей. Это позволяет маршрутизаторам поддерживать свою собственную таблицу «состояния связей», или по другом, link – state. После того, как маршрутизаторы построят таблицу соседей и таблицу состояния связей, они знают своих соседей, топологию сети в своем ближайшем окружении и топологию сети в ближайшем окружении своих соседей. Далее, каждый маршрутизатор рассчитывает параметры и качество каждого маршрута, который находятся в таблице состояния связей. EIGRP использует DUAL (Diffusing Update Algorithm) для расчета качества маршрута. DUAL (Diffusing Update Algorithm) Cisco использует Diffusing Update Algorithm, или DUAL алгоритм для расчет качества сетевого маршрута в рамках протокола EIGRP. Алгоритм DUAL повышает эффективность протокола EIGRP по сравнению с IGRP, предотвращая появление петель маршрутизации. Отметим следующие характеристики алгоритма DUAL: Для каждой сети назначения рассчитывается маршрут через Successor, или другими словами – лучший маршрут, а также, рассчитывается маршрут через Feasible Successor (второй по приоритету маршрут). DUAL поддерживает маски переменной длинны или VLSA (variable-length subnet masking), позволяя EIGRP выполнять маршрутизации в различных подсетях. Алгоритм DUAL очень быстро рассчитывает новый маршрут в пункт назначения, в случаях, если основной маршрут недоступен. DUAL поддерживает две опции, которые обеспечивают быстрый переход на новую маршрутизацию в случаях недоступности: Successor и Feasible Successor маршруты. Для каждого из путей у EIGRP всегда есть резервный путь. Если оба маршрута, Successor и Feasible Successor недоступны, DUAL выполняет опрос соседей маршрутизаторов, для выбора лучшего маршрута. По причине того, что каждый из соседей маршрутизатора так же имеют Successor и Feasible Successor маршруты, новый маршрут в сеть назначения, полученный от них, является наиболее приемлемым и качественным с точки зрения метрик.
ВЕСЕННИЕ СКИДКИ
40%
50%
60%
До конца акции: 30 дней 24 : 59 : 59