Отказоустойчивый механизм и отказоустойчивый механизм

Java
Отказоустойчивый механизм и отказоустойчивый механизм

Это 29-я оригинальная статья о том, почему технологии

писал раньше«Этот базовый вопрос по Java действительно избит! Умоляю вас, хорошо подумайте, прежде чем отвечать. 》Во время написания этой статьи я упоминал отказоустойчивые и отказоустойчивые механизмы в разделе 8.1.

Но я обнаружил, что при поиске по словам «быстрый отказ» или «безопасный отказ» результатыболее 90 процентовВсе дело в том, как отказоустойчивость или отказоустойчивость реализованы в коллекциях Java.

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

Взгляните на вики для описания отказоустойчивости и отказоустойчивости:

Сбой быстро: http://en.wikipedia.org/wiki/Fail-fast

Отказоустойчивость: http://en.wikipedia.org/wiki/Отказоустойчивость

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

В этой статье сравниваются отказоустойчивость и отказоустойчивость в коллекциях Java с отказоустойчивостью и отказоустойчивостью в среде Dubbo.

Прочитав ее, вы знаете, что реализация в коллекциях Java сильно отличается от реализации в Dubbo.

Никто не лучше другого, только с точки зрения сцены, кто больше подходит, чем другой.

Коллекции Java — быстро терпят неудачу

Феномен: при использовании итератора для обхода объекта коллекции, если содержимое объекта коллекции добавляется, удаляется или изменяется в процессе обхода, будет выдано исключение ConcurrentModificationException.

принцип: итератор напрямую обращается к содержимому коллекции при обходе и использует во время обхода переменную modCount. Если содержимое коллекции изменится во время ее обхода, значение modCount изменится. Всякий раз, когда итератор использует hashNext()/next() для перехода к следующему элементу, он проверяет, является ли переменная modCount ожидаемым значением modCount, и если да, то возвращает результат обхода; в противном случае генерирует исключение ConcurrentModificationException и завершает обход.

Уведомление: Это исключение возникает при обнаружении modCount! =expectedmodCount Это условие. Если измененное значение modCount оказывается равным ожидаемому значению modCount при изменении коллекции, исключение не будет выдано. Следовательно, программирование параллельных операций не может зависеть от того, выброшено это исключение или нет.Это исключение рекомендуется только для обнаружения ошибок параллельной модификации.

Сцены: Все классы коллекций в пакете java.util являются отказоустойчивыми и не могут быть одновременно изменены в многопоточности (изменены во время итерации).

Вышеупомянутые точки знаний, в которых я нахожусь«Этот базовый вопрос по Java действительно избит! Умоляю вас, хорошо подумайте, прежде чем отвечать. 》Подробно описан третий раздел этой статьи, и те, кому интересно, могут его прочитать:

Коллекции Java — отказоустойчивость

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

принцип: поскольку копия исходной коллекции просматривается во время итерации, изменения, внесенные в исходную коллекцию в процессе обхода, не могут быть обнаружены итератором, поэтому ConcurrentModificationException не будет инициировано.

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

Сцены: все контейнеры в пакете java.util.concurrent безопасны для сбоев и могут использоваться и изменяться одновременно в нескольких потоках.

Например, упомянутый в предыдущей статье CopyOnWriteArrayList:

Ссылки, участвующие в части коллекции: https://www.cnblogs.com/ygj0930/p/6543350.html

Кластерная отказоустойчивость в Dubbo

Прежде чем описывать реализацию отказоустойчивости и отказоустойчивости в Dubbo, мы должны сначала рассказать о механизме отказоустойчивости кластера в Dubbo, т.к.Отказоустойчивость и отказоустойчивость — один из его механизмов отказоустойчивости.

Или посмотрите на картинки, которые появились раньше:

Среди них цель кластера Cluster состоит в том, чтобы объединить нескольких поставщиков услуг в Cluster Invoker и предоставить этот Invoker потребителям услуг. Таким образом, потребителю услуги нужно только сделать удаленный вызов через этот Invoker.Что касается того, к какому поставщику услуг звонить и как действовать в случае сбоя вызова, теперь он передается для обработки модулю кластера.

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

Официальный сайт метода отказоустойчивости говорит следующее:

Обратите внимание, что на официальном сайте указано, что он в основном предоставляет эти типы, и он не указан полностью, в этом можно убедиться, просмотрев исходный код:

org.apache.dubbo.rpc.cluster.support.AbstractClusterInvoker

Существует девять классов реализации, что указывает на то, что официальный сайт предоставляет вам на выбор девять методов отказоустойчивости:

В этой статье в основном обсуждаются:

org.apache.dubbo.rpc.cluster.support.FailfastClusterInvoker org.apache.dubbo.rpc.cluster.support.FailsafeClusterInvoker

Создайте демонстрационный проект

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

Интерфейс сервера выглядит следующим образом:

Интерфейс сервера реализован следующим образом:

Спите в течение 3 секунд, чтобы имитировать бизнес-тайм-аут.

Конфигурация xml Dubbo на стороне сервера выглядит следующим образом:

Конфигурация Dubbo xml на стороне потребителя выглядит следующим образом:

Потребитель потребляет следующее в классе Test:

Fail Fast в Даббо

Соответствующий класс реализации для отказоустойчивости:

org.apache.dubbo.rpc.cluster.support.FailfastClusterInvoker

Чтобы включить этот класс реализации, вам нужно всего лишь указать атрибут кластера как отказоустойчивый в XML-файле Dubbo:

Давайте сначала посмотрим, как пишется аннотация к классу реализации:

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

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

Исходный код класса реализации выглядит следующим образом:

Результат выполнения следующий:

Отказоустойчивость в Даббо

Соответствующий класс реализации для отказоустойчивости:

org.apache.dubbo.rpc.cluster.support.FailsafeClusterInvoker

Чтобы включить этот класс реализации, вам нужно всего лишь указать атрибут кластера как отказоустойчивый в XML-файле Dubbo:

Давайте сначала посмотрим, как пишется аннотация к классу реализации:

When invoke fails, log the error message and ignore this error by returning an empty Result. Usually used to write audit logs and other operations

FailsafeClusterInvoker — отказоустойчивый Cluster Invoker. Так называемая отказоустойчивость означает, что при возникновении исключения во время вызывающего процесса FailsafeClusterInvoker будет только печатать исключение, а не создавать его. Подходит для таких операций, как запись в журнал аудита.

Исходный код класса реализации выглядит следующим образом:

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

Таким образом, несмотря на то, что время ожидания истекло, в классе Test returnStr все еще печатается:

История статьи

Выпустить эту статью на этой неделе было непросто.

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

Активность в субботу началась, от пробуждения в 6:30 утра до окончания последней работы в 23:00 вечера, это был напряженный день. К счастью, моя команда выделилась среди 10 команд и заняла первое место.

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

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

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

Моя девушка спросила меня, не смогу ли я писать на этой неделе, я подумал и сказал: Нет. Потому что в тот момент я вспомнил предложение мистера Лу Яо из «Утро начинается в полдень»:Только со страстью первой любви и волей религии можно добиться определенной карьеры.

Это также очень согласуется со страницей PPT на ежегодном собрании:Отдай всего себя всему, что ты любишь.

Я обычный программист, но я люблю эту отрасль.

Последнее слово

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

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

Есть две другие статьи, связанные с этой статьей, пожалуйста, прочитайте:

«Этот базовый вопрос по Java действительно избит! Умоляю вас, хорошо подумайте, прежде чем отвечать. 》

«Этот базовый вопрос по Java действительно избит! Я тоже не ожидал продолжения. 》

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

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

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

выше.

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