Сохранение рабочего процесса с Джоли - PullRequest
0 голосов
/ 18 декабря 2018

Я пытаюсь понять, как Джоли достигает устойчивости для рабочих процессов.

  • Сохраняет ли Джоли состояние рабочих процессов?
  • Это делается с помощью баз данных или файловой системы?

1 Ответ

0 голосов
/ 18 декабря 2018

Вы можете смешать три компонента языка Джоли для сохранения / загрузки состояния рабочего процесса и кода восстановления после сбоя программы:

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

Состояниеэкземпляром микросервиса Джоли является дерево (аналогично структурам XML и JSON).На практике, хотя в Jolie a = 5 вспоминается знакомое назначение переменных, найденное в других языках, в действительности происходит то, что в состоянии экземпляра, выполняющего назначение, мы создаем узел a и присваиваем a значение5.И наоборот, когда мы пишем a в программе Jolie, мы получаем доступ к значению, хранящемуся в узле a.Точно так же a.b = 6 означает создание подузла b в a и присвоение ему значения 6.

Наличие собственных структур данных дерева на языке очень полезно при отправке и получении структурированных данных., поскольку Джоли автоматически преобразует свои древовидные переменные в формат, используемый для связи с некоторым внешним клиентом / сервером через его порты.Тем не менее, переменные в форме дерева также довольно легко маршалировать / демаршалировать.Например, мы можем преобразовать текущий статус переменной дерева Джоли, вызвав библиотеку JSON (или XML) и использовать библиотеки File или Database дляпостоянство.

Я собрал ниже простой пример, чтобы проиллюстрировать мою точку зрения.В этом примере я использую процедуры saveState и loadState для сохранения и загрузки значений, хранящихся в переменной process_state, которая является корневой переменной, содержащей все соответствующие значения, используемые в рабочем процессе.Рабочий процесс начинается с блока main, где мы сохраняем некоторые данные и печатаем их для справки (операции valueToPrettyString и println).Затем мы сохраняем текущее состояние (saveState) и продолжаем с stage1.Поскольку переменная process_state.c равна "bad", мы выдаем ошибку (MyFault).Блок install улавливает ошибку и выполняет процедуру recv_stage1.Процедура отменяет предыдущее, ошибочное состояние программы, восстанавливает сохраненное в файле и изменяет переменную process_state.c.Сделав это, мы снова выполняем stage1.

include "console.iol"
include "json_utils.iol"
include "string_utils.iol"
include "file.iol"

define saveState
{
  getJsonString@JsonUtils( process_state )( marshalled_state.content );
  writeFile@File( marshalled_state )();
  undef( marshalled_state.content )
}

define loadState {
  undef( process_state );
  readFile@File( marshalled_state )( marshalled_state.content );
  getJsonValue@JsonUtils( marshalled_state.content )( process_state );
  undef( marshalled_state.content )
}

define recv_stage1 {
  scope( recv_stage1 ){
     loadState;
     process_state.c = "fine";
     valueToPrettyString@StringUtils( process_state )( state_pretty_print );
     println@Console( state_pretty_print )()
  }
}

define stage1 {
  scope( stage1 ){
    install( MyFault => 
      println@Console( "MyFault, loading saved state" )(); recv_stage1; stage1 );
    if ( process_state.c == "bad" ){
      throw( MyFault )
    } else {
      println@Console( "Everything went " + process_state.c )()
    }
  }
}

main
{
  marshalled_state.filename = "instance_XXX.json";
  with ( process_state ){
    .a = 42;
    .b << "I" { .love = "very", .much = "jolie" };
    valueToPrettyString@StringUtils( process_state )( state_pretty_print );
    println@Console( state_pretty_print )();
    saveState;
    .c = "bad";
    stage1
  }
}

Этот тип подготовки может использоваться также для восстановления после сбоев (например, путем указания переменной, которая была достигнута на последнем этапе).

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

Ссылки

  • Фабрицио Монтези, Клаудио Гуиди и Джанлуиджи Заваттаро.(2014).Сервис-ориентированное программирование с Джоли.В A. Bouguettaya, QZ Sheng & F. Daniel (Eds.), Фонды веб-сервисов (стр. 81–107).Springer https://doi.org/10.1007/978-1-4614-7518-7_4
  • Фабрицио Монтези, Клаудио Гуиди, Иван Ланезе и Джанлуиджи Заваттаро.(2008).Динамические механизмы обработки ошибок для сервис-ориентированных приложений.https://doi.org/10.1109/ECOWS.2008.20
...