Есть вопросы или конкретные требования к сценарию, можно связаться с автором в WeChat tianyaleixiaowu. Спасибо за ваши отзывы.
Эта структура в настоящее время используется на платформе приложения JD.com для проверки и тестирования сложных сценариев бизнеса, таких как высокая параллельность, большое количество пользователей и т. д. Мы будем регулярно публиковать обновления и исправления ошибок в соответствии с реальной ситуацией.
Если вас интересует блокчейн, вы можете обратиться к другому проекту автора GVP, который представляет собой введение в блокчейн на Java.
Для тех, кто интересуется сценариями с высокой степенью параллелизма, где горячие данные локально кэшируются, а также ограничиваются горячие ключи (например, в сценариях секундных убийств), вы можете обратить внимание на структуру горячих ключей JD, которая обнаруживает горячие ключи и предоставляет кэш-память: https://gitee.com/jd-platform-opensource/hotkey. Структура горячих ключей в настоящее время активно используется в нескольких отделах JD и демонстрирует отличные показатели. Один сервер может обслуживать до 1000 бизнес-серверов, обеспечивая расчёт горячих ключей со скоростью в миллисекунды и отправляя уведомления о горячих ключах.
Тем, кому необходимо хранить большие объёмы журналов (секунды ГБ или десятки ГБ), рекомендуется обратить внимание на мой другой открытый проект JLog. JLog обеспечивает производительность, которая в 10 раз выше, чем у ELK, и снижает объём хранения более чем на 70%.
Клиент запрашивает интерфейс сервера, который должен вызывать интерфейсы других N микросервисов. Например, запрос моего тележка для покупок требует вызова RPC пользователя, RPC товара, RPC склада, RPC купонов и так далее. Эти сервисы также имеют взаимные зависимости, например, сначала необходимо получить идентификатор товара, прежде чем запрашивать информацию о складе. После того как все данные будут получены, результаты объединяются и возвращаются клиенту.
Параллельно выполняется N задач, и последующие действия зависят от результатов выполнения этих задач. Например, пользователь может войти в систему через электронную почту, номер телефона или имя пользователя. Когда пользователь инициирует запрос на вход, нам нужно параллельно проверить электронную почту, номер телефона и имя пользователя в базе данных. Если хотя бы один из них успешен, вход считается успешным, и выполнение продолжается. Вместо того чтобы проверять электронную почту, затем телефон и так далее...
Или, если интерфейс ограничивает количество параметров, передаваемых в каждом пакете, и каждый пакет может содержать только информацию о 10 товарах, мы можем разделить запрос на пять частей и обработать их параллельно. Затем подсчитать результаты пяти запросов. В зависимости от ваших требований, вам может потребоваться, чтобы все пять запросов были успешными, или достаточно, чтобы хотя бы один был успешным.
Или предположим, что у нас есть пять предварительных задач, которые необходимо выполнить. Из них три являются обязательными, а два — необязательными. Как только три обязательные задачи выполнены, выполнение может продолжаться. Если две необязательные задачи успешно завершены, они предоставляют дополнительную информацию.
Задачи, требующие изоляции потоков, выполняются в нескольких группах. Каждая группа имеет свой независимый пул потоков, и каждая группа представляет собой отдельный блок выполнения. Это похоже на стратегию изоляции пула потоков Hystrix.
Последовательное планирование рабочих процессов.
Другие последовательные требования.
Традиционные Future и CompletableFuture могут в определённой степени обеспечить планирование задач и передачу результатов последующим задачам. Однако они не могут предоставить обратные вызовы для каждого блока выполнения. Например, когда задача A успешно завершена, за ней следует задача B. Было бы полезно иметь обратный вызов, который позволяет отслеживать текущее состояние выполнения или регистрировать исключения.
В этом случае CompletableFuture становится недостаточным.
Моя структура предоставляет эту функцию обратного вызова. Кроме того, если выполнение вызывает исключение или истекает время ожидания, можно установить значение по умолчанию при определении этой задачи.
Как показано на рисунке 4, B и C выполняются одновременно, а затем следует A.
В некоторых случаях мы хотим, чтобы B и C выполнялись успешно, прежде чем выполнять A. CompletableFuture предоставляет метод allOf(futures...).then() для достижения этого.
В других случаях мы хотим, чтобы либо B, либо C успешно выполнялись перед выполнением A. CompletableFuture также предоставляет метод anyOf(futures...).then().
Моя структура также предлагает аналогичные функции. Устанавливая зависимость в оболочке с помощью addDepend, можно указать, является ли задача обязательной для успешного выполнения. Если зависимость обязательна, она будет ждать успешного завершения всех обязательных задач перед выполнением самой себя.
Если зависимость не является обязательной, то выполнение возможно после успешного завершения любой из зависимостей.
Обратите внимание, что эта зависимость имеет строгие и слабые различия, и важно отметить, что блоки выполнения не должны повторяться. Например, если B успешно завершается, а затем выполняется A, и в это время C также успешно завершается, но A уже выполняется или завершилось неудачно, тогда A не должна выполняться повторно.
Существует ещё один сценарий, как показано на рисунке, A и D начинаются одновременно, D завершается первым, и начинается выполнение задачи Result. К этому моменту B и C ещё не начали выполнение. После завершения Result, даже если B и C всё ещё не выполнили свои задачи, их выполнение больше не требуется. B и C могут быть пропущены, поскольку их NextWrapper уже имеет результат или находится в процессе выполнения. Я предоставляю метод checkNextWrapperResult для контроля, следует ли продолжать выполнение, когда следующая задача уже выполняется или имеет результат. Конечно, этот контроль применим только в том случае, когда NextWrapper имеет только один элемент.
Например, есть три задачи A-B-C, входные данные для A — строка, выходные данные — целое число, B нуждается в результатах A в качестве своих входных данных. То есть A и B не являются независимыми, а имеют отношения зависимости результатов.
До завершения A B не может получить доступ к результатам A, он знает только тип результата A.
Таким образом, моя структура поддерживает этот сценарий. При планировании можно взять класс-оболочку результата A и использовать его в качестве входного параметра для B. Хотя в данный момент результат ещё не доступен, оболочка будет заполнена после завершения A.
После версии V1.3 структура поддерживает получение результатов любых блоков выполнения в рабочей области action через карту Map<String, WorkerWrapper>. Можно использовать эти результаты в качестве входных данных для последующих задач. Ключ определяется уникальным идентификатором, переданным при определении оболочки. Подробные сведения о демонстрационном примере можно найти в тестовом пакете dependnew.
Можно контролировать общее время выполнения группы задач, устанавливая значение timeOut.
Структура полностью свободна от блокировок и не полагается на блокировки потоков для обеспечения порядка.
Создаётся небольшое количество потоков. Например, задача A будет выполняться в потоке, связанном с задачей B или C, которая выполняется медленнее, вместо создания нового потока. Например, если входным параметром для вашего блока выполнения B является ResultA, то это тоже поддерживается. Во время компоновки можно заранее установить входные параметры для B или C равными результату A, даже если в этот момент A ещё не начал выполняться. После завершения выполнения A результат естественным образом будет передан входному параметру B.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )