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

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

Во-первых, путаница с URL:

Вы все маршрутизируете через index.php. Следовательно, index.php должен следовать структуре, похожей на эту: com / jquery.post / вы должны указать URL.

Все свойства, кроме URL, являются необязательными

blockquote>

Ваш JQuery AJAX отправит запрос на публикацию на вашу страницу index.php. Когда ваша страница выполняется, как показано выше, она просто напечатает {message: "Your submission was received"} и затем умрет. JQuery будет ожидать этого ответа и затем делать все, что вы скажете, чтобы сделать с ним (в этом примере вывести его на консоль).


Обновление после обсуждения

receive.php:

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

Во-первых, путаница с URL:

Вы все маршрутизируете через index.php. Следовательно, index.php должен следовать структуре, похожей на эту: com / jquery.post / вы должны указать URL.

Все свойства, кроме URL, являются необязательными

blockquote>

Ваш JQuery AJAX отправит запрос на публикацию на вашу страницу index.php. Когда ваша страница выполняется, как показано выше, она просто напечатает {message: "Your submission was received"} и затем умрет. JQuery будет ожидать этого ответа и затем делать все, что вы скажете, чтобы сделать с ним (в этом примере вывести его на консоль).


Обновление после обсуждения

[111]

receive.php:

[112]

Как только у вас все заработает, вы можете взять код из receive.php и вставить его в вершина index.php, и перенаправьте вызов ajax на index.php. Убедитесь, что до этого фрагмента кода невозможен вывод.

POST['drpcategory'])) { // get your items from drpcategory. I will assume: $items = array('val1' => 'option1','val2' => 'option2','val3' => 'option3'); // send this as json. you could send it as html, but this is more flexible. header('Content-Type: application/json'); // convert array to json $out = json_encode($items); // simply print the output and die. die($out); }

Как только у вас все заработает, вы можете взять код из receive.php и вставить его в вершина index.php, и перенаправьте вызов ajax на index.php. Убедитесь, что до этого фрагмента кода невозможен вывод.

15
задан McGovernTheory 2 May 2009 в 12:03
поделиться

7 ответов

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Службы сообщений (скажем, jms) часто используются для создания слабой связи между различными службами. С приличным сервером сообщений, вы можете сделать много маршрутизации сообщений (опять же Apache верблюд или аналогичный делает большую работу) т.е. скажем, липкий потребитель против кластера производителей JMS и т. д. это также может обеспечить хорошее восстановление после отказа. Очереди Jms и т. Д. Могут предоставить простой способ распределения cmds в кластере, независимо от главного / подчиненного. (опять же, это зависит от того, делаете ли вы LOB или пишете сервер / продукт с нуля).

(если у меня будет время, я приведу в порядок, возможно, добавлю больше деталей в грамматику исправления орфографии и т. д.)

10
ответ дан 1 December 2019 в 03:52
поделиться

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

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

4
ответ дан 1 December 2019 в 03:52
поделиться

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

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

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

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

2
ответ дан 1 December 2019 в 03:52
поделиться

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

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

5
ответ дан 1 December 2019 в 03:52
поделиться

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

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

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

Несмотря на все это, существуют шаблоны, которые особенно полезны в контекстах HA. Многие из них описаны в классической книге Мартина Фаулера «Образцы архитектуры корпоративных приложений» . Легко справиться с проблемными сценариями, которые вы предвидите. Это то, что удивляет вас, и разрушает систему.

Несмотря на все это, существуют шаблоны, которые особенно полезны в контекстах HA. Многие из них описаны в классической книге Мартина Фаулера «Образцы архитектуры корпоративных приложений» . Легко справиться с проблемными сценариями, которые вы предвидите. Это то, что удивляет вас, и разрушает систему.

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

1
ответ дан 1 December 2019 в 03:52
поделиться

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

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

Хорошо:

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

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

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

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

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

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

  • Keep It Simple. Чем больше систем вы зависите, тем больше пострадает от этого ваш сервис.

2
ответ дан 1 December 2019 в 03:52
поделиться

Высокая доступность - это больше о доступности и избыточности оборудования, чем о соглашениях о кодировании. Есть пара шаблонов, которые я бы использовал почти в каждом случае HA: я бы выбрал шаблон синглтона для моего объекта базы данных и использовал фабричный шаблон для создания синглтона. Затем фабрика может иметь логику для решения проблем доступности с базой данных (именно там происходит большинство проблем доступности). Например, если мастер не работает, подключитесь ко второму мастеру для чтения и записи, пока мастер не вернется. Я не знаю, являются ли эти шаблоны наиболее используемыми, но они наиболее задействованы в моем коде.

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

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

-6
ответ дан 1 December 2019 в 03:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: