Какие шаблоны проектирования наиболее часто используются при создании приложений с высокой доступностью?[закрыто]

StackOverflow https://stackoverflow.com/questions/814742

Вопрос

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

Это было полезно?

Решение

Я предполагаю, что вы пишете приложение серверного типа (давайте оставим веб-приложения на некоторое время - есть несколько хороших готовых решений, которые могут помочь в этом, поэтому давайте посмотрим на "У меня есть этот великолепный новый тип сервер должен написать " ;, но я хочу, чтобы это была проблема высокой доступности).

В серверной реализации запросы от клиентов обычно (в той или иной форме) преобразуются в некоторый шаблон типа события или команды, а затем выполняются в одной или нескольких очередях.

Итак, первая проблема - необходимо хранить события / команды таким образом, чтобы они сохранялись в кластере (т. е. когда новый узел становится ведущим, он просматривает следующую команду, которая должна быть выполнена и начинается).

Давайте начнем с однопоточного сервера impl (самый простой - и концепции все еще применимы к многопоточному, но у него есть свой собственный набор проблем0. Когда обрабатывается команда, требуется какая-то обработка транзакций.

Другая проблема связана с управлением побочными эффектами и как вы справляетесь с ошибкой текущей команды? Где возможно, обрабатывайте побочные эффекты транзакционным способом, чтобы они были всеми или ничем. то есть. если команда изменяет переменные состояния, но завершается неудачей на полпути выполнения, будучи в состоянии вернуться к «предыдущему» состояние отличное. Это позволяет новому главному узлу возобновить сбойную команду и просто повторно запустить команду. Хороший способ снова разбить побочные эффекты на более мелкие задачи, которые могут быть снова запущены на любом узле. то есть. хранить главные и начальные задачи запроса, с множеством маленьких задач, которые обрабатывают, скажем, только один побочный эффект на задачу.

Это также создает другие проблемы, которые влияют на ваш дизайн. Эти переменные состояния не обязательно являются обновлениями баз данных. Это может быть общее состояние (скажем, конечный автомат для внутреннего компонента), которое также необходимо распределить в кластере. Таким образом, шаблон для управления изменениями так, что мастер-код должен видеть непротиворечивую версию нужного ему состояния, а затем фиксирует это состояние в кластере. Полезно использовать некоторую форму неизменяемого (по крайней мере из главного потока, выполняющего обновление) хранения данных. то есть. все обновления фактически выполняются для новых копий, которые должны проходить через некоторый тип посредника или фасада, который обновляет только локальные копии в памяти с помощью обновлений после обновления по всему кластеру (или минимальному количеству членов в кластере для согласованности данных).

Некоторые из этих проблем присутствуют и в основных рабочих системах.

Также необходимо хорошее управление ошибками, так как количество вещей, которые могут пойти не так при обновлении состояния, увеличивается (так как теперь у вас есть сеть).

Я часто использую шаблон состояний. Вместо обновлений в одну строку, для побочных эффектов вы хотите отправлять запросы / ответы и использовать специфичные для разговора fsm для отслеживания прогресса.

Другой проблемой является представление конечных точек. то есть. клиент, подключенный к главному узлу, должен иметь возможность повторно подключиться к новому мастеру, а затем прослушать результаты? Или вы просто отменяете все ожидающие результаты и позволяете клиентам повторно отправлять? Если вы разрешаете обработку ожидающих запросов, необходим хороший способ определения конечных точек (клиентов) (т. Е. Некоторый вид идентификатора клиента при поиске).

Также нужен код очистки и т. д. (т. е. не нужно, чтобы данные, ожидающие повторного подключения клиента, ждали вечно).

Используется много очереди. Поэтому многие люди будут использовать некоторую шину сообщений (например, jms для java) для передачи событий транзакционным способом.

Терракота (опять же для Java) решает многое для вас - просто обновите память - терракота - ваш фасад / посредник здесь. Они только что добавили аспекты для вашего.

Терракота (я не работаю на них) - вводит понятие «суперстатика», поэтому вы получаете эти кластерные синглтоны, которые хороши, но вы просто должны знать, как это повлияет на процесс тестирования и разработки - т.е. использовать много композиции, а не inheri

Другие советы

Одним из подходов к созданию надежного программного обеспечения является программное обеспечение только для аварийного отказа .

  

Crash-only программное обеспечение - это программное обеспечение, которое аварийно завершает работу и быстро восстанавливается. Единственный способ остановить его - это разбить его, а единственный способ - восстановить. Система только для сбоя состоит из компонентов только для сбоя, которые связываются с повторяющимися запросами; Сбои обрабатываются путем сбоя и перезапуска неисправного компонента и повторения любых запросов, для которых истекло время ожидания. Получающаяся в результате система часто более надежна и надежна, потому что восстановление после сбоя является первоклассным гражданином в процессе разработки, а не запоздалой мыслью, и вам больше не нужен дополнительный код (и связанные интерфейсы и ошибки) для явного завершения работы. Все программное обеспечение должно иметь возможность безопасного сбоя и быстрого восстановления, но программное обеспечение только для сбоя должно обладать этими качествами, иначе их отсутствие станет быстро очевидным.

Я бы порекомендовал прочитать выпустить его! Майкла Nygard. Он выделяет ряд антишаблонов, влияющих на производственные системы, и паттерны, помогающие предотвратить сбой всей системы одним ошибочным компонентом. Книга охватывает три основных направления; Стабильность, емкость и общий дизайн (охватывает сеть, безопасность, доступность и администрирование).

Мое предыдущее рабочее место было укушено (в то или иное время) почти каждым сценарием сбоя, который обрисовал Найгард (с потерей дохода за каждый последующий сбой). Реализация некоторых методов и шаблонов, которые он предлагает, привела к значительно более стабильным и предсказуемым системам (и да, книга немного ориентирована на Java, но принципы применимы во многих контекстах).

Неправильно:

... и там будет сервер хранения данных

Хорошо:

... и там будет ферма из (нескольких) хранилищ серверов с (несколькими) балансировщиками нагрузки перед ними

  • Поставьте балансировщики нагрузки во главу угла.На данный момент у вас может быть 4 серверных части, но в будущем у вас может быть 400 из них, поэтому разумно управлять этим только на LB, а не всеми приложениями, использующими серверную часть.

  • Используйте несколько уровней кэша.

  • Поищите популярные решения по ускорению работы thigs (например, memcached).

  • Если вы собираетесь обновлять систему, делайте это постепенно, в несколько небольших шагов.Если вы сделаете это за один большой шаг (выключите старый, включите новый и будете молиться, чтобы он сработал), скорее всего, он потерпит неудачу.

  • Используйте DNS-имена для чего-либо, например. storage-lb.servicename преобразуется в адреса всех балансировщиков нагрузки хранилища.Если Вы хотите добавить его, просто измените dns, и все службы начнут использовать его автоматически.

  • Пусть все будет просто.Чем от большего количества систем Вы зависите, тем больше от этого пострадает Ваш сервис.

Проектирование систем высокой доступности (HA) - область активных исследований и разработок. Если вы посмотрите на ACM или IEEE, есть тонна исследовательских работ о качестве обслуживания (доступность, надежность, масштабируемость и т. Д.) И о том, как их достичь (слабая связь, адаптация и т. Д.). Если вы ищете больше практических приложений, взгляните на отказоустойчивые системы и промежуточное ПО, которое разработано для кластеризации, грид или облачной функциональности.

Репликация и балансировка нагрузки (например, обратный прокси-сервер) являются одними из наиболее распространенных моделей достижения систем высокой доступности, и их часто можно выполнить без внесения изменений в базовое программное обеспечение, если оно не слишком тесно связано. Даже многие из последних облачных предложений достигаются, в основном, за счет репликации и балансировки нагрузки, хотя они имеют тенденцию повышать эластичность для удовлетворения широкого диапазона системных требований.

Создание программных компонентов без сохранения состояния облегчает бремя репликации, поскольку само состояние не требует репликации вместе с программными компонентами. Безгражданство является одной из основных причин того, что HTTP так хорошо масштабируется, но часто требуется, чтобы приложения добавляли свое собственное состояние (например, сеансы), которое затем необходимо реплицировать.

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

Насколько я понимаю, вы ищете конкретные шаблоны для использования в Java-приложениях, являющихся частью архитектуры высокой доступности. Конечно, существует множество шаблонов и рекомендаций, которые можно использовать, но на самом деле это не «шаблоны HA». Скорее, это хорошие идеи, которые можно использовать в различных контекстах.

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

Приложение HA - это приложение, в котором вы планируете худшее с самого начала. Если вы когда-нибудь подумали с точки зрения «Этот компонент настолько стабилен, что нам не нужна дополнительная избыточность для него». это, вероятно, не архитектура HA. В конце концов, легко справиться с проблемными сценариями, которые вы предвидите. Это тот, который удивляет вас, который разрушает систему.

Несмотря на все это, есть шаблоны, которые особенно полезны в контекстах HA. Многие из них описаны в классической книге Мартина Фаулера " Образцы архитектуры корпоративных приложений " . / р>

Я интерпретирую " Высокая доступность " as " Zero Downtime " `, который можно реализовать в соответствии с другим вопросом SE:

Развертывание с нулевым временем простоя для приложений Java

<Ол>
  • Переключатель A / B: (Скользящее обновление + механизм отката)
  • Параллельное развертывание & # 8211; Apache Tomcat: (только для веб-приложений)
  • Отложенная привязка порта
  • Расширенная привязка порта
  • Я буду использовать некоторые из этих концепций для разработки шаблонов проектирования для системы высокой доступности с точки зрения программного обеспечения, которые дополняют вышеуказанные подходы.

    Используемые шаблоны:

    Прокси-сервер / Factory :

    Имейте прокси-объект, и прокси будет решать, куда перенаправлять запросы. Предположим, у вас есть версия 1 & amp; Версия 2 программного обеспечения. Если клиенты подключаются по старому протоколу, перенаправьте их на программное обеспечение версии 1. Новые клиенты могут подключаться к версии 2 напрямую. Прокси может иметь либо метод Factory, либо AbstractFactory для рендеринга новой версии программного обеспечения.

    Стратегия

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

    Декоратор :

    Вы можете изменить поведение объекта во время выполнения. Добавьте новый класс и украсьте дополнительную ответственность.

    Адаптер :

    Полезно, когда вы изменяете интерфейс или контракт между версией 1 и версией 2. Адаптер будет реагировать как на старые, так и на старые версии. новый клиент запрашивает соответственно.

    Общие рекомендации:

    <Ол>
  • Слабая связь между объектами
  • Следуйте S.O.L.I.D принципам в своем приложении
  • Обратитесь к sourcemaking статьям веб-сайта для получения описанных выше шаблонов для лучшего понимания.

    Что не использовать:

    Помимо шаблонов проектирования, вы должны принять некоторые меры предосторожности, чтобы добиться нулевого времени простоя для вашего приложения. <Ол>

  • Не вводите единую точку сбоев в вашей системе.
  • Используйте распределенные кэши (например, Terracotta) / блокировки редко.
  • Удалить жесткую связь между службами. Устранить тесную связь между службами с помощью шины / инфраструктуры обмена сообщениями (JMS, ActiveMQ и т. Д.)
  • Высокая доступность - это больше о доступности и избыточности оборудования, чем о правилах кодирования. Есть пара шаблонов, которые я бы использовал почти в каждом случае высокой доступности: я бы выбрал одноэлементный шаблон для своего объекта базы данных и использовал фабричный шаблон для создания синглтона. Тогда у фабрики может быть логика для обработки проблем доступности с базой данных (именно там происходит большинство проблем доступности). Например, если мастер не работает, подключитесь ко второму мастеру для чтения и записи, пока мастер не вернется. Я не знаю, являются ли они наиболее эффективными шаблонами, но они наиболее эффективны в моем коде.

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

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

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top