| 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 | Удаление конфигурации задачи | Нет события | Нет события |
Из журнала можно увидеть события, происходящие во время процесса запуска.
Из журнала можно узнать о событиях, происходящих во время запуска.
Все узлы участвуют в выборах лидера при запуске. Когда выборы успешны, метаданные лидера обновляются до состояния готовности, и запускается сервер. После завершения запуска сервера метаданные обновляются до состояния готовности. Все рабочие узлы отслеживают метаданные лидера и, когда они изменяются на состояние готовности, запускают клиент или устанавливают новое соединение с лидером и поддерживают сердцебиение. Если лидер выходит из строя или перестаёт работать, проводятся новые выборы лидера. После успешного проведения новых выборов лидера запускается сервер, и метаданные обновляются до состояния готовности. Рабочие узлы отслеживают изменение метаданных и устанавливают новое соединение после обновления. Кластер восстанавливается после сбоя.
Узлы регистрируют свои метаданные в реестре. После регистрации все рабочие узлы поддерживают сердцебиение с лидером. Лидер отслеживает добавление узлов в список управления и устанавливает их начальное состояние готовности. Когда клиент запускается и успешно устанавливает соединение с лидером, состояние узла обновляется до готовности.
Лидер отслеживает закрытие соединения узла и обновляет его состояние до потерянного. Если узел восстанавливается и повторно устанавливает соединение, его состояние обновляется до готового. Если узел перестаёт отвечать или перезапускается, он удаляется путём отслеживания его удаления лидером. Метаданные узла удаляются локально. Если сердцебиение узла истекло, его состояние устанавливается на восстановленное. В то же время клиент узла проверяет соединение сердцебиения. Если соединение не работает, оно очищается и устанавливается заново, а метаданные узла обновляются. Сервер получает соединение и обновляет состояние узла. Состояние кластера восстанавливается.
Связь разделена на две стороны: сервер и клиент. После выбора в качестве лидера запускается сервер и ожидает подключения. Клиент запускается и поддерживает сердцебиение для обеспечения своего работоспособного состояния. Сервер и клиент поддерживают синхронизацию, асинхронность и односторонние запросы.
Запросы и ответы сообщений представлены структурами типа запроса и ответа. Тип сообщения определяется по типу структуры, который указывает, является ли это запросом или ответом. Во время кодирования и декодирования тип сообщения можно определить по полю типа. Тело сообщения имеет разные структуры в зависимости от сценария и запроса. Сообщение кодируется в двоичный поток, и тело сообщения декодируется с использованием атрибута типа тела сообщения. Сообщения связи и кодирование представлены следующим образом:
Поле сообщения | Тип | Описание |
---|---|---|
id | int | Идентификатор запроса, соответствующий идентификатору ответа |
action | int | Действие запроса в соответствии с различными действиями |
body | byte[] | Тело запроса, объект преобразуется в byte[] для передачи |
bodyClass | Class | Тип тела запроса, используется для декодирования тела |
--- | --- | --- |
id | int | Непосредственно скопировать запрос ID, найти соответствующий ответ по ID и обработать его. |
status | int | Состояние ответа |
success | boolean | Указание на успешное выполнение ответа |
message | String | Сообщение об успешном выполнении или ошибке |
body | byte[] | Основная информация ответа, кодирование объекта основной информации в byte[] для передачи |
bodyClass | Class | Тип основной информации ответа, декодирование основной информации с помощью этого типа |
Действие | Код | Описание |
---|---|---|
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 не обрабатывает. |
Поле | Тип | Описание |
---|---|---|
taskName | String | Имя запрашиваемой задачи данных |
size | Integer | Количество запрашиваемых данных |
nodeId | String | Идентификатор запрашиваемого Worker узла |
timeMillis | Long | Отметка времени запроса |
Поле | Тип | Описание |
---|---|---|
taskName | String | Имя данных ответа |
index | Integer | Начальный индекс данных ответа |
items | Collection | Набор задач ответа |
Поле | Тип | Описание |
---|---|---|
id | long | Уникальный идентификатор задачи, автоматически генерируется |
status | TaskStatus | Статус задачи: READY, DISTRIBUTED, PROCESSING, SUCCESS, FAILURE, COMMIT_FAILURE |
failedCount | int | Количество неудачных попыток |
data | Object | Бизнес-данные задачи |
Поле | Тип | Описание |
---|---|---|
taskName | String | Название задачи для отправки |
items | Collection | Коллекция данных задачи для отправки |
Поле | Тип | Описание |
---|---|---|
itemIds | Collection | Полученный набор идентификаторов задач |
success | Boolean | Успех |
message | String | Сообщение о неудаче |
Поле | Тип | Описание |
---|---|---|
taskName | String | Имя задачи для фиксации данных |
items | List | Список задач для фиксации |
nodeId | String | Идентификатор Worker узла запроса |
Поле | Тип | Описание |
---|---|---|
results | List | Результаты фиксации |
Поле | Тип | Описание |
---|---|---|
itemId | Long | Идентификатор задачи |
success | Boolean | Успех |
message | String | Сообщение о неудаче |
Использование Zookeeper для координации узлов и синхронизации метаданных. Структура метаданных следующая:
// Данные, хранящиеся в узле 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 )