1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/wolfsmoke-ws-task

Клонировать/Скачать
README.md 19 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 01.12.2024 09:46 13978ab

| BECOME_LEADER | Стать лидером | После того, как этот узел выбран в качестве лидера, происходит событие | Запуск сервера; обновление локальных данных о лидере; | | CHANGE_LEADER | Смена лидера | Происходит при обнаружении изменения данных лидера. | Обновление адреса лидера на стороне клиента; обновление локальных данных о лидере; проверка состояния узла; | | REMOVE_LEADER | Удаление лидера | Происходит при обнаружении удаления данных лидера. | Адрес лидера на стороне клиента устанавливается в значение null; локальное состояние лидера устанавливается в «УШЕЛ»; | | NOT_LEADER | Не лидер | Событие не происходит, если узел не выбран в качестве лидера. | Обновление адреса лидера на стороне клиента; обновление данных о локальном лидере; запуск клиента; | | NOT_FOUND_LEADER | Лидер не найден | Нет события | Проверка состояния узла; | | CHECK_LEADER | Проверка лидера | Событие происходит при следующих условиях: клиент создал соединение, но состояние лидера не является действительным; клиентский канал был установлен 10 раз подряд, и время ожидания истекло; клиент не смог установить 10 каналов подряд; | Проверка состояния узла; | | UPDATE_WORKER | Обновление рабочего | Событие происходит после запуска zk и синхронизации всех данных рабочих узлов; при изменении данных рабочего узла; | Обновление локальных данных узла; проверка состояния узла; | | REMOVE_WORKER | Удаление рабочего | Событие происходит при удалении рабочего узла (рабочий узел отключился или вышел из строя); | Удаление локальных данных узла; выполнение задачи по изменению размера узла Leader; проверка состояния узла; | | SERVER_STARTUP | Сервер запущен | Происходит после завершения запуска netty-сервера; | Обновление метаданных порта и статуса лидера до действительных значений; обновление локальных данных лидера; обновление адреса лидера на стороне клиента; запуск клиента; | | CHANNEL_CONNECT | Соединение установлено | Происходит, когда сервер обнаруживает новое установленное соединение канала; | Обновление метаданных порта и состояния рабочего узла до ACTIVE; обновление локальных данных; | | CHANNEL_CLOSE | Канал закрыт | Происходит, когда сервер обнаруживает, что канал закрыт или произошла ошибка; | Обновление состояния рабочего узла до GONE; обновление метаданных; | | CHANNEL_IDLE | Истекло время ожидания канала | Происходит, когда сервер определяет, что время ожидания канала истекло; | Обновление состояния рабочего узла до RECOVERING; обновление метаданных; | | CLIENT_STARTUP | Клиент запущен | Происходит при первом успешном установлении соединения между клиентом и сервером; | Обновление метаданных порта и состояния узла до ACTIVE; запуск сердцебиения клиента; | | CLIENT_CHANNEL_CONNECT | Клиент подключён | Происходит при изменении соединения канала между клиентом и сервером (повторное установление соединения); | Обновление метаданных порта и состояния узла до ACTIVE; запуск сердцебиения клиента; проверка состояния узла; | | CLIENT_CHANNEL_IDLE | Клиентское время ожидания истекло | Происходит, когда клиент определяет, что время ожидания канала истекло; | Обновление метаданных порта и состояния узла до RECOVERING; запуск сердцебиения клиента; | | UPDATE_TASK_CONFIG | Обновление конфигурации задачи | Нет события | Нет события | | REMOVE_TASK_CONFIG | Удаление конфигурации задачи | Нет события | Нет события |

Процесс запуска

Из журнала можно увидеть события, происходящие во время процесса запуска.

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

image-20201029235213728 image-20201029235040217

Выбор лидера

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

Добавление узла

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

Удаление узла

Лидер отслеживает закрытие соединения узла и обновляет его состояние до потерянного. Если узел восстанавливается и повторно устанавливает соединение, его состояние обновляется до готового. Если узел перестаёт отвечать или перезапускается, он удаляется путём отслеживания его удаления лидером. Метаданные узла удаляются локально. Если сердцебиение узла истекло, его состояние устанавливается на восстановленное. В то же время клиент узла проверяет соединение сердцебиения. Если соединение не работает, оно очищается и устанавливается заново, а метаданные узла обновляются. Сервер получает соединение и обновляет состояние узла. Состояние кластера восстанавливается.

Удаленная связь

Связь разделена на две стороны: сервер и клиент. После выбора в качестве лидера запускается сервер и ожидает подключения. Клиент запускается и поддерживает сердцебиение для обеспечения своего работоспособного состояния. Сервер и клиент поддерживают синхронизацию, асинхронность и односторонние запросы.

Дизайн протокола

Запросы и ответы сообщений представлены структурами типа запроса и ответа. Тип сообщения определяется по типу структуры, который указывает, является ли это запросом или ответом. Во время кодирования и декодирования тип сообщения можно определить по полю типа. Тело сообщения имеет разные структуры в зависимости от сценария и запроса. Сообщение кодируется в двоичный поток, и тело сообщения декодируется с использованием атрибута типа тела сообщения. Сообщения связи и кодирование представлены следующим образом:

MessageEncoder

image-20201025113242375
RequestMessage
Поле сообщения Тип Описание
id int Идентификатор запроса, соответствующий идентификатору ответа
action int Действие запроса в соответствии с различными действиями
body byte[] Тело запроса, объект преобразуется в byte[] для передачи
bodyClass Class Тип тела запроса, используется для декодирования тела
--- --- ---
id int Непосредственно скопировать запрос ID, найти соответствующий ответ по ID и обработать его.
status int Состояние ответа
success boolean Указание на успешное выполнение ответа
message String Сообщение об успешном выполнении или ошибке
body byte[] Основная информация ответа, кодирование объекта основной информации в byte[] для передачи
bodyClass Class Тип основной информации ответа, декодирование основной информации с помощью этого типа
RequestAction описание
Действие Код Описание
PULL_TASK 0 Запрос Worker на получение задачи, Leader обрабатывает с помощью PullItemProviderHandler.
PUSH_TASK 1 1. Клиент отправляет данные на Leader, Leader принимает данные с помощью PushItemLeaderHandler и выполняет распределение отправки; 2. Сервер отправляет данные на Worker, Worker принимает данные с помощью PushItemWorkerHandler и выполняет.
SYNC_DATA 2 Узлы синхронизируют резервные копии данных задач для предотвращения потери данных и обеспечения отказоустойчивости (планируется реализовать).
META_DATA 3 Узлы синхронизируют метаданные для обеспечения возможности продолжения работы при потере соединения с Zookeeper (планируется реализовать).
COMMIT_STATUS 4 После завершения задачи Worker отправляет запрос на фиксацию, Leader обрабатывает с помощью CommitStatusHandler.
HEARTBEAT 5 Worker отправляет Leader односторонний запрос на сердцебиение, Leader не обрабатывает.
Описание структуры тела запроса и ответа с одинаковым Message для каждого действия
PULL_TASK
  • Запрос Body: PullItemRequest
Поле Тип Описание
taskName String Имя запрашиваемой задачи данных
size Integer Количество запрашиваемых данных
nodeId String Идентификатор запрашиваемого Worker узла
timeMillis Long Отметка времени запроса
  • Ответ Body: PullItemResponse
Поле Тип Описание
taskName String Имя данных ответа
index Integer Начальный индекс данных ответа
items Collection Набор задач ответа
  • Структура TaskItem
Поле Тип Описание
id long Уникальный идентификатор задачи, автоматически генерируется
status TaskStatus Статус задачи: READY, DISTRIBUTED, PROCESSING, SUCCESS, FAILURE, COMMIT_FAILURE
failedCount int Количество неудачных попыток
data Object Бизнес-данные задачи
PUSH_TASK
  • Запрос Body: PushItemRequest
Поле Тип Описание
taskName String Название задачи для отправки
items Collection Коллекция данных задачи для отправки
  • Ответ Body: PushItemResponse
Поле Тип Описание
itemIds Collection Полученный набор идентификаторов задач
success Boolean Успех
message String Сообщение о неудаче
COMMIT_STATUS
  • Тело запроса: CommitRequest
Поле Тип Описание
taskName String Имя задачи для фиксации данных
items List Список задач для фиксации
nodeId String Идентификатор Worker узла запроса
  • Ответ Body: CommitResponse
Поле Тип Описание
results List Результаты фиксации
  • Структура CommitResult
Поле Тип Описание
itemId Long Идентификатор задачи
success Boolean Успех
message String Сообщение о неудаче

Метаданные

Использование Zookeeper для координации узлов и синхронизации метаданных. Структура метаданных следующая:

/ws-task/{namespace}/leader-data узел данных
// Данные, хранящиеся в узле leader-data, пример декодированных метаданных (фактически хранятся как закодированные byte[])
{
  "active":true,    // Действительно ли это эффективно
  "address":"127.0.0.1:8258",   // Адрес
  "host":"127.0.0.1",   // host
  "id":"03e6135e-7550-4594-8e2c-fbb99b5d25a9",  // Идентификатор узла
  "leader":true,    // Является ли он лидером
  "port":8258,  // Привязка сервера к порту
  "role":"LEADER",  // Роль
  "status":"ACTIVE",    // Состояние узла
  "updateTime":1604232336496    // Время обновления
}

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/wolfsmoke-ws-task.git
git@api.gitlife.ru:oschina-mirror/wolfsmoke-ws-task.git
oschina-mirror
wolfsmoke-ws-task
wolfsmoke-ws-task
master