Состояние машины
В версии ServiceComb Pack 0.5.0 мы начали использовать модель состояния машины для решения сложных отношений между событиями и состояниями в распределённых транзакциях. Мы рассматриваем Alpha как ящик, который может записывать различные состояния каждой глобальной транзакции. После получения сообщения о транзакции (запуск глобальной транзакции, остановка глобальной транзакции, сбой глобальной транзакции, запуск субтранзакции, остановка субтранзакции, сбой субтранзакции и т. д.) от Omega, Alpha выполняет некоторые действия (ожидание, компенсация, тайм-аут) и переключает состояние.
Распределённые транзакции создают сложные ситуации, и мы надеемся определить состояние машины с помощью чёткого DSL, а также решить проблемы с сохранением состояния машины и распределением. После попытки мы считаем, что Akka — хороший выбор. Давайте вместе рассмотрим эту новую функцию.
Основные обновления
Быстрый старт
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.
docker run -d -e "POSTGRES_DB=saga" -e "POSTGRES_USER=saga" -e "POSTGRES_PASSWORD=password" -p 5432:5432 postgres
docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.17.1
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
После включения режима состояния машины мы также предоставляем простой интерфейс управления, где вы можете увидеть показатели производительности Alpha, статистику глобальных транзакций и детали транзакций.
На панели инструментов в верхней части отображается количество уже завершённых глобальных транзакций:
Active Transactions — счётчик активных транзакций:
Компоненты 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 позволяет отображать все завершённые глобальные транзакции, включая идентификатор службы, идентификатор экземпляра, идентификатор глобальной транзакции, количество включённых субтранзакций, время выполнения и окончательное состояние (успешное выполнение, успешная компенсация, приостановка). При нажатии на глобальную транзакцию можно просмотреть подробную информацию о ней. Также можно выполнить поиск по идентификатору глобальной транзакции в поле поиска в верхней части списка.
Детали глобальной транзакции показывают информацию о событиях и субтранзакциях этой глобальной транзакции.
Панель 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
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 )