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

OSCHINA-MIRROR/servicecomb-ServiceComb-Saga

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
fsm_manual.md 18 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 27.11.2024 19:57 3f3f95f

Состояние машины

В версии ServiceComb Pack 0.5.0 мы начали использовать модель состояния машины для решения сложных отношений между событиями и состояниями в распределённых транзакциях. Мы рассматриваем Alpha как ящик, который может записывать различные состояния каждой глобальной транзакции. После получения сообщения о транзакции (запуск глобальной транзакции, остановка глобальной транзакции, сбой глобальной транзакции, запуск субтранзакции, остановка субтранзакции, сбой субтранзакции и т. д.) от Omega, Alpha выполняет некоторые действия (ожидание, компенсация, тайм-аут) и переключает состояние.

Распределённые транзакции создают сложные ситуации, и мы надеемся определить состояние машины с помощью чёткого DSL, а также решить проблемы с сохранением состояния машины и распределением. После попытки мы считаем, что Akka — хороший выбор. Давайте вместе рассмотрим эту новую функцию.

Основные обновления

  • Использование Akka State Machine вместо основанного на сканировании таблицы определения состояния.
  • Повышение производительности на порядок, пропускная способность событий составляет более 180 000 в секунду, а объём обработки глобальных транзакций превышает 1200 в секунду.
  • Встроенный сборщик показателей работоспособности для чёткого понимания узких мест системы.
  • Поддержка распределённого кластера.
  • Совместимость вперёд с существующим протоколом gRPC.
  • Совершенно новый интерфейс визуализации мониторинга.
  • Открытие совершенно нового API.

Быстрый старт

ServiceComb Pack версии 0.5.0 начал поддерживать режим Saga State Machine. Вам нужно только добавить параметр alpha.spec.names=saga-akka при запуске Alpha и параметр omega.spce.names=saga при запуске программы на стороне Omega. Вы можете найти файл docker-compose на hub Docker или развернуть его следующим образом.

Примечание: после включения режима состояния машины транзакции Saga будут работать в режиме состояния машины, TCC по-прежнему использует метод базы данных. Примечание: версия 0,6,0+ программе на стороне Omega не требуется настраивать параметр alpha.feature.akka.enabled=true.

  • Запустите PostgresSQL:
docker run -d -e "POSTGRES_DB=saga" -e "POSTGRES_USER=saga" -e "POSTGRES_PASSWORD=password" -p 5432:5432 postgres
  • Запустите Elasticsearch:
docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.17.1
  • Запустите Alpha:
java -jar alpha-server-${version}-exec.jar \
--spring.datasource.url=jdbc:postgresql://0.0.0.0:5432/saga?useSSL=false \
--spring.datasource.username=saga \
--spring.datasource.password=password \
--alpha.spec.names=saga-akka \
--alpha.spec.saga.akka.channel.name=memory \
--alpha.spec.saga.akka.repository.name=elasticsearch \
--alpha.spec.saga.akka.repository.elasticsearch.uris=http://127.0.0.1:9200 \
--spring.profiles.active=prd

Интерфейс управления WEB

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

Панель инструментов

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

  • TOTAL: общее количество транзакций;
  • SUCCESSFUL: количество успешно завершённых транзакций;
  • COMPENSATED: количество успешно компенсированных транзакций;
  • FAILED: количество неудачных (приостановленных) транзакций.

Active Transactions — счётчик активных транзакций:

  • COMMITTED: количество транзакций, которые были успешно завершены с момента запуска до настоящего времени;
  • COMPENSATED: количество транзакций, которые были компенсированы с момента запуска до настоящего времени;
  • SUSPENDED: количество приостановленных транзакций с момента запуска до настоящего времени.

Компоненты Active Transactions — счётчики компонентов: Events, Actors, Sagas, DB — это набор счётчиков, каждый из которых показывает количество обработчиков каждого компонента в системе Alpha, количество обработчиков до и после обработки, а также среднее время обработки события. С помощью отслеживания этих показателей можно понять текущую производительность системы и узкие места.

Events: отображает количество полученных, обработанных и отклонённых событий Alpha, а также среднее время обработки каждого события. Actors: отображает количество событий, полученных, обработанных и отклонённых состоянием машины, а также среднее время обработки каждого события. Sagas: отображает количество запущенных и завершённых глобальных транзакций, а также среднее время выполнения каждой глобальной транзакции. DB: отображает количество глобальных транзакций, сохранённых в ES, и количество глобальных транзакций, успешно сохранённых в ES.

Top 10 Slow Transactions: показывает 10 самых медленных транзакций. При нажатии на них можно увидеть подробную информацию об этой медленной транзакции. System Info: отображает текущую информацию о системе, JVM, потоках и т.д. Alpha-сервиса.

Обратите внимание: значения показателей в разделе Active Transactions сбрасываются после перезапуска.

Список транзакций Saga

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

Детали глобальной транзакции

Детали глобальной транзакции показывают информацию о событиях и субтранзакциях этой глобальной транзакции.

Панель Events: подробная информация о типе события, времени события, идентификаторе службы и идентификаторе экземпляра, отправивших событие. Sub Transactions Panel: подробные сведения о каждом идентификаторе субтранзакции, состоянии субтранзакции, времени выполнения субтранзакции.

Успешное завершение глобальной транзакции

События на карточке справа внизу имеют стрелку вниз. Нажатие на неё позволяет увидеть информацию о методе компенсации для этого события.

Компенсация успешного завершения глобальной транзакции

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

Приостановка глобальной транзакции из-за тайм-аута

Из-за установленного тайм-аута в 5 секунд и отсутствия события завершения в течение 5 секунд транзакция находится в приостановленном состоянии. Красный текст указывает на это.

Приостановка глобальной транзакции из-за непредвиденного события

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

Кластер

Необходимо загрузить основной код и скомпилировать версию 0.6.0 самостоятельно.

Зависимость от Kafka и Redis позволяет нам развернуть кластер Alpha с распределённой обработкой. Кластер Alpha основан на Akka Cluster Sharding и Akka Persistence для динамических вычислений и самовосстановления после сбоев. Завершив работу, данные всей транзакции будут сохранены в ES.

Запустить кластер Alpha очень просто. Сначала необходимо запустить промежуточное ПО Kafka, Redis, PostgreSQL/MySQL и ElasticSearch, которые используются кластером. Рекомендуется использовать Docker для запуска в рабочей среде, вместо этого можно использовать более надёжный способ развёртывания. Ниже представлен файл docker compose servicecomb-pack-middleware.yml, который можно запустить с помощью команды docker-compose -f servicecomb-pack-middleware.yml up -d.

version: '3.2'
services:
  postgres:
    image: postgres:9.6
    hostname: postgres
    container_name: postgres
    ports:
      - '5432:5432'
    environment:
      - POSTGRES_DB=saga
      - POSTGRES_USER=saga
      - POSTGRES_PASSWORD=password

  elasticsearch:
    image: elasticsearch:7.17.1
    hostname: elasticsearch
    container_name: elasticsearch
    environment:
      - "ES_JAVA_OPTS=-Xmx256m -Xms256m"
      - "discovery.type=single-node"
      - "cluster.routing.allocation.disk.threshold_enabled=false"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    ports:
      - 9200:9200
      - 9300:9300

  zookeeper:
    image: coolbeevip/alpine-zookeeper:3.4.14
    hostname: zookeeper
    container_name: zookeeper    
    ports:
      - 2181:2181

  kafka:
    image: coolbeevip/alpine-kafka:2.2.1-2.12
    hostname: kafka
    container_name: kafka    
    environment:
      KAFKA_ADVERTISED_HOST_NAME: 10.50.8.3
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
    ports:
      - 9092:9092
    links:
      - zookeeper:zookeeper
    depends_on:
      - zookeeper   

  redis:
    image: redis:5.0.5-alpine
    hostname: redis
    container_name: redis
    ports:
      - 6379:6379   

Обратите внимание: KAFKA_ADVERTISED_HOST_NAME должен быть настроен на реальный IP-адрес сервера, а не на 127.0.0.1 или localhost.

Затем мы запускаем кластер с двумя узлами Alpha. Поскольку я запускаю два узла на одном компьютере, они должны иметь разные порты.

  • План портов | Узел | gRPC порт | REST порт | Gossip порт | | --- | --- | --- | --- | | Alpha 1 | 8080 | 8090 | 8070 | | Alpha 2 | 8081 | 8091 | 8071 |

  • Параметры кластера | Параметр | Описание | | --- | --- | | server.port | REST порт, по умолчанию 8090 | | alpha.server.port | gRPC порт, по умолчанию 8080 | | akkaConfig.akka.remote.artery.canonical.port | Gossip порт, по умолчанию 8070 | | spring.kafka.bootstrap-server | Адрес Kafka | | akkaConfig.akka-persistence-redis.redis.host | IP-адрес хоста Redis | | akkaConfig.akka-persistence-redis.redis.port | Порт Redis | | akkaConfig.akka-persistence-redis.redis.database | База данных Redis | | akkaConfig.akka.cluster.seed-nodes[N] | Адреса узлов seed, если есть несколько узлов seed, то нужно написать несколько строк этого параметра, каждая строка имеет номер N, начиная с 0 и увеличиваясь | | spring.profiles.active | Необходимо заполнить prd, cluster |

  • Запуск Alpha 1

java -jar alpha-server-0.7.0-SNAPSHOT-exec.jar \
--server.port=8090 \
--server.host=127.0.0.1 \
--alpha.server.port=8080 \
--alpha.spec.names=saga-akka \
--alpha.spec.saga.akka.repository.name=elasticsearch \
--alpha.spec.saga.akka.repository.elasticsearch.uris=http://127.0.0.1:9200 \
--alpha.spec.saga.akka.channel.name=kafka \
--alpha.spec.saga.akka.channel.kafka.bootstrap-servers=127.0.0.1:9092 \
--akkaConfig.akka.remote.artery.canonical.port=8070 \
--akkaConfig.akka.cluster.seed-nodes[0]="akka://alpha-cluster@127.0.0.1:8070" \
--akkaConfig.akka-persistence-redis.redis.host=127.0.0.1 \
--akkaConfig.akka-persistence-redis.redis.port=6379 \
--spring.profiles.active=prd,cluster
  • Запуск Alpha 2
java -jar alpha-server-0.7.0-SNAPSHOT-exec.jar \
--server.port=8091 \
--server.host=127.0.0.1 \
--alpha.server.port=8081 \
--alpha.spec.names=saga-akka ## Динамическое масштабирование

* Alpha поддерживает расширение возможностей онлайн-обработки путём динамического добавления узлов.
* По умолчанию в Alpha создаётся 6 разделов топика Kafka. Это означает, что при количестве узлов в кластере больше 6 дальнейшее увеличение производительности невозможно. Вы можете изменить количество автоматически создаваемых разделов, используя параметр `kafka.numPartitions` при первоначальном запуске согласно плану.

## Приложения

[Каналы событий](eventchannel_zh.md)

[Постоянство данных транзакций](persistence_zh.md)

[Конфигурация Akka](akka_zh.md)

[API](apis_zh.md)

[Проектная документация](design_fsm_zh.md)

[Отчёт о нагрузочном тестировании](benchmark_zh.md)

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

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

1
https://api.gitlife.ru/oschina-mirror/servicecomb-ServiceComb-Saga.git
git@api.gitlife.ru:oschina-mirror/servicecomb-ServiceComb-Saga.git
oschina-mirror
servicecomb-ServiceComb-Saga
servicecomb-ServiceComb-Saga
master