1

У меня есть простой вопрос относительно архитектуры моего приложения Amazon Simple Workflow/AWS Flow для Ruby. Для фона у меня есть простой рабочий процесс с одним действием, выполняемым в слое AWS Flow для Ruby на Opsworks. У меня есть отдельный REST API, работающий на уровне сервера приложений Rails на Opsworks, который я хотел бы запустить рабочий процесс.Требуется класс рабочего процесса в стартовом коде рабочего процесса

Код в REST API, который стартует рабочий процесс:

1: domain = AWS::SimpleWorkflow.new.domains['my_domain'] 
2: workflow_client = AWS::Flow::workflow_client(domain.client, domain) {{from_class: MyWorkflowClass}} 
3: workflow_client.start_execution(input_1: @input1, input_2: @input2) 

Мое предположение, что мой рабочий процесс и REST основы кода API может быть отделено и что единственный общий компонент будет быть aws-flow рубин драгоценный камень и require 'aws/decider'. Тем не менее, я считаю, что мой REST API также должен иметь require 'PATH_TO_MY_WORKFLOW_CLASS'. Когда я удалить эту строку кода из файла кода в моем REST API, который стартует рабочий процесс, я получаю следующее сообщение об ошибке:

undefined method `_options' for nil:NilClass; ["/Users/MyName/.rvm/gems/ruby-2.0.0-p247/gems/aws-flow-2.2.1/lib/aws/decider/utilities.rb:183:in `interpret_block_for_options'", "/Users/MyName/.rvm/gems/ruby-2.0.0-p247/gems/aws-flow-2.2.1/lib/aws/decider/implementation.rb:73:in `workflow_client'" 
(error at line 2 above) 

я ошибаюсь? Должен ли я действительно нуждаться в MyWorkflowClass в моем стартовом приложении рабочего процесса (т. Е. Мой REST API), или я делаю что-то неправильно? Я просмотрел документацию и не смог найти четкого ответа на этот вопрос. Все образцы, которые я могу найти, действительно имеют класс рабочего процесса, включенный в код запуска рабочего процесса, но я не уверен, что это связано с тем, что они объединены в простой пример или если это так, потому что это так, как должно быть. Причина, по которой я не беру образцы по номиналу, заключается в том, что требование класса рабочего процесса в стартовом коде рабочего процесса не имеет для меня никакого смысла. Он связывает два приложения слишком жестко по моему вкусу.

ответ

0

Я разместил сообщение на aws-flow-ruby sdk и получил ответ от инженера Amazon. Короче говоря, вы можете использовать опцию :from_class или опции :prefix_name и :execution_method вместе.


Есть два способа запуска рабочего процесса в коде

1) Использование АМС SDk непосредственно. В этом случае ваш код не должен знать ничего о классе рабочего процесса. Вам просто нужен домен, тип рабочего процесса (имя и версия) и идентификатор рабочего процесса. Это будет выглядеть примерно так -

require 'aws-sdk-v1' 
swf = AWS::SimpleWorkflow.new.client 
swf.start_workflow_execution(
    domain: "HelloWorld", 
    workflow_type: { 
    name: "HelloWorldWorkflow", 
    version: "1.0" 
    }, 
    workflow_id: "foo", 
    input: ...., 
    ....other options (optional)... 
) 

Как вы можете видеть выше, это не требует класса рабочего процесса вообще.

2) Использование драгоценного камня aws-flow (это то, что вы делаете выше). Существует два способа использования клиента рабочего процесса, предоставленного драгоценным камнем aws-flow, для запуска выполнения. Вы можете использовать клиент как общий клиент и не привязывать его к любому классу рабочих процессов, или вы можете использовать параметр: from_class для выбора параметров из определенного класса рабочего процесса. Чтобы использовать параметр from_class, вам нужно иметь класс в ObjectSpace (следовательно, вам нужно потребовать файл рабочего процесса).

С from_class -

require 'aws/decider' 
domain = AWS::SimpleWorkflow.new.domains['my_domain'] 
workflow_client = AWS::Flow::workflow_client(domain.client, domain) {{from_class: "MyWorkflowClass"}} 
workflow_client.start_execution(input_1: @input1, input_2: @input2) 

Без from_class -

require 'aws/decider' 
domain = AWS::SimpleWorkflow.new.domains['my_domain'] 
workflow_client = AWS::Flow::workflow_client(domain.client, domain) {{ 
    prefix_name: "YourClassName", 
    execution_method: "workflow_method_name", 
    version: "1.0", 
    ...other options... 
}} 
workflow_client.start_execution(input_1: @input1, input_2: @input2) 

Рекомендуемый способ начать выполнение рабочего процесса заключается в использовании WorkflowClient AWS потока вместо того, чтобы использовать SDK непосредственно.


Дополнительные замечания относительно ввода принятой последовательности действий:


В SDK и консоль будет принимать только строки в качестве входных данных. Это может быть строка свободной формы, но если ваш рабочий процесс написан с использованием рубинового потока, эта строка должна быть сериализованной формой вашего ввода, чтобы WorkflowWorker мог десериализовать ввод, когда он подбирает задачу и преобразовывает ее в объекты ruby ​​(в этом case a hash).

При использовании ручного потока WorkflowClient клиент будет автоматически сериализовать хеш ввода (или любой другой ввод) в строку перед отправкой в ​​SWF. По умолчанию для aws-потока используется конвертер данных на основе YAML (он может быть отменен).

Если вы просто хотите увидеть, что ваш вход хэш будет выглядеть как строки, вы можете сделать следующее -

AWS::Flow::FlowConstants.default_data_converter.dump(input_hash) 

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