• Sonuç bulunamadı

Miralay Konağı

Belgede Geleneksel Yozgat evleri (sayfa 172-186)

2. GELENEKSEL TÜRK EVİ

3.6. Miralay Konağı

Neste primeiro método, tentamos refazer uma conexão com o serviço. Este mé- todo ao qual nos referimos simplesmente como Retry neste trabalho pode fazer com que a execução se recupere de falhas momentâneas, causadas principalmente por time-outs. A estratégia visa encapsular cada chamada de serviço em um bloco e realizar um determi- nado número de tentativas antes de desistir da comunicação com este serviço.

Para dar suporte ao Retry, o designer da composição deverá especiĄcar dois va- lores: tempo de espera (TE, critério de detecção de falhas adotado) e número máximo de

tentativas (NM T). O TE indica o tempo que o requisitante irá esperar pela resposta de um serviço. Já o NM T indica o número máximo de tentativas de comunicação com um determinado serviço. Estes são parâmetros globais da composição. Cada serviço recebe inicialmente o número de tentativas máximas de execução NM T e este valor é controlado individualmente para cada serviço. Por exemplo, considerando determinados serviços S1

e S2, temos o número de tentativas desses serviços representados, respectivamente, por

NT 1 e NT 2, sendo estes valores inicialmente iguais ao NM T global.

Para o uso do Retry, temos que deĄnir os parâmetros TE e NM T para a composição de serviço. À medida que um serviço falha em sua execução, seu parâmetro NT é diminuído em uma unidade e uma nova tentativa de execução é realizada. Quando o valor de NT for igual a zero numa tentativa de execução, detectamos que o número máximo de tentativas foi atingido, chegando a uma situação momentaneamente sem solução. Para representar o Retry, precisamos considerar o momento no qual o serviço foi chamado e o tempo atual, os quais denominaremos, respectivamente, TC e now(). Vejamos a representação na Ągura 12.

3.2. Reinvocação do Serviço 49

Figura 12 Ű Demonstração do uso do Retry

Na Ągura 12, temos um serviço S1 e o par de parâmetros (TE,NT). Observamos três situações possíveis: em (i), a chamada ao serviço é realizada com sucesso (vértice de cor verde). Em (ii), a chamada foi considerada falha porque o tempo máximo de espera da resposta foi ultrapassado (now()−TC > TE, representado pelo vértice de cor amarela). Neste caso, devemos observar se o número máximo de tentativas de execução de S1 atingiu

o limite, através de NT. Se o mesmo é maior que zero, fazemos novamente a chamada do serviço, agora com o par (TE, NT1). Na situação (iii), temos as mesmas características de (ii), porém com o parâmetro NT sendo igual a zero (vértice de cor vermelha). Neste caso, o número máximo de tentativas especiĄcadas para o Retry atingiu o limite, não havendo mais alternativas para a execução deste serviço.

3.2.1

Alterações para suporte ao Retry

Na gramática PEWS, inserimos um novo símbolo não-terminal C. Este símbolo pode gerar composições com a recuperação de falhas e sem a recuperação de falhas. O par (TE, NM T) é um par de inteiros maiores ou iguais a 0. Todos os serviços iniciarão sua execução com esses mesmos valores. A nova gramática com essa extensão é mostrada abaixo (as extensões aparecem sublinhadas):

C ::= ŚRETRYŠ Ś(Š TE Ś,Š NM T Ś)Š P | P P ::= S( ¯I, ¯O) | P1 || P2 | P1 ; P2 | [E1]P1 + [E2]P2 | IF[E1]P1 | unfold | unfolding P1 E ::= id | n | t | E1 + E2 | E1 - E2 | E1 * E2 | E1 / E2 | − E1 | E1 and E2 | E1 or E2 | not E1 | E1 == E2 | E1 ≤ E2 | E1 < E2

3.2.2

Alterações na Máquina de Redução de Grafos

Para dar suporte ao Retry na máquina de redução, propomos alterações em sua es- trutura original. As regras de transformação não são alteradas com a inserção do Retry. O mesmo apenas deĄne novos parâmetros da máquina de execução, Ącando as modiĄcações restritas às regras de redução. A proposta consiste na inserção de três novos elementos na máquina:

• Monitor (M ) Ű Este elemento é o elemento principal, responsável pelo monitora- mento da execução de um serviço. O mesmo é representado por uma lista de tuplas, que contém: uma entidade de entrada de serviços (S! ¯I, por exemplo, considerando

um serviço S com uma tupla de variáveis de entrada ¯I), onde é realizada a chamada

do serviço; um vértice de saída de serviço (S? ¯O, similar ao anterior, com ¯O sendo a

tupla de variáveis de saída), para o qual devem ser enviadas as respostas relativas à execução; o momento da chamada do serviço; e o número de tentativas restantes de execução do serviço. Dessa forma, utilizando o raciocínio e os dados descritos, no momento de uma chamada de serviço, teremos a máquina com a seguinte conĄgu- ração:

M[DS! ¯I, S? ¯O, now(), NM T E

]

• Tempo de Espera (TE) Ű Este parâmetro já foi citado anteriormente, sendo o tempo de espera máximo pela resposta dos serviços da composição;

• Número de tentativas (NM T) Ű Este parâmetro também já foi citado, sendo o número máximo de tentativas da execução dos serviços da composição;

Para realizarmos a redução com estes novos parâmetros, consideremos dois vérti- ces, um de entrada de serviço (v1 : S! ¯I) e um de saída de serviço (v2 : S? ¯O), existindo uma

aresta de controle entre ambos (v1 7→ v2). Além disso, consideremos os parâmetros globais

TE e NM T, representando respectivamente o tempo máximo de espera pela resposta de um serviço e o número de tentativas máximas de execução de um serviço da composição. Dessa forma, apresentamos a redução da primeira invocação de um serviço S por meio da seguinte forma: hG, ρ, I, O, M, TE, NM Ti, sendo G=DV[v1 : S! ¯I, v2 : S? ¯O], Ac, Ad E , indegree(v1) = 0 =⇒

3.2. Reinvocação do Serviço 51 D G, ρ, I, O[S, v 2, Eval( ¯I)], M[v1 : S! ¯I, v2 : S? ¯O, now(), NM T)], TE, NM T E , G′ =DV[v2 : S? ¯O], Ac, Ad E , Ac = Ac− {v1 7→c w | w ∈ V }, Ad = Ad− {v1 7→dw | w ∈ V },

O esquema geral de redução continua o mesmo apresentado na fundamentação. As diferenças residem na adoção dos parâmetros correspondentes ao tempo de espera TE, ao número máximo de tentativas NM T e na introdução do monitor M. O monitor M manterá o registro da execução do serviço S por meio de um nova tupla referente a sua chamada. Nesta tupla, temos: o vértice de entrada avaliado (v1); o vértice de saída para

o qual será enviada a resposta (v2); o momento da chamada do serviço S, representado

pela chamada da função auxiliar now(); e o número de tentativas de execução para este serviço (inicialmente NM T, sendo controlado invididualmente para este serviço).

Temos três possíveis situações posteriores: (i) o serviço responde antes do tempo máximo de espera; (ii) o serviço não responde antes do tempo máximo de espera, sendo o número de tentativas restantes maior que zero; e (iii) o serviço não responde antes do tempo máximo de espera, sendo o número de tentativas restantes igual a zero. O caso (iii) é um caso onde o Retry não mais oferece ações alternativas, sendo a execução deste serviço descartada (posteriormente, faremos outras veriĄcações quanto a ocorrência deste caso nas seções 3.3 e 3.4). Sendo assim, consideraremos os casos (i) e (ii).

Considerando o caso (i), teremos sucesso na execução do serviço se tivermos uma resposta da solicitação antes do término do tempo de espera, ou seja, se recebermos uma resposta e tivermos a seguinte situação:

(now() - TC) ≤ TE

Para a detecção do recebimento da resposta, temos de observar se existe alguma tupla no buffer I enviada pelo vértice v1, ou seja, se temos algum elemento do tipo

D

S, v1, ¯t

E

, indicando o recebimento da resposta para o buffer. Dessa forma, apresenta- mos a redução para o caso (i):

D G, ρ, I[S, v1, ¯t], O, M[(v1 : S! ¯I, v2 : S? ¯O, TC, NT)], TE, NM T E , sendo G=DV[v2 : S? ¯O], Ac, Ad E , indegree(v2) = 0 =⇒ hG, ρ, I, O, M, T E, NM Ti, onde G= hV, A c− {v2 7→c v| v∈ V }, Ad− {v2 7→dv| v∈ V }i, ρ= ρ[(x i, v2, ki | 1 ≤ i ≤ n)],

¯

O =< x1, ..., xn >,

¯t=< k1, ..., kn>

Observando a conĄguração inicial da máquina, vemos a presença de um elemento no buffer de entrada que contém o vértice v1. Isso indica que o serviço relacionado a

este vértice respondeu a uma requisição. Com isso, a tupla relacionada a este serviço no monitor pode ser retirada. Além disso, a resposta presente no buffer de entrada é consumida pelo vértice v2 e o mesmo é reduzido, sendo estes passos similares aos passos

da máquina original.

Considerando agora o caso (ii), teremos uma falha na execução do serviço se não tivermos uma resposta da solicitação antes do término do tempo de espera, ou seja, se não recebermos uma resposta e tivermos a seguinte situação:

(now() - TC) > TE

Para a detecção do não-recebimento da resposta, temos de observar a não-existência de uma tupla no buffer I enviada pelo vértice v1, ou seja, se não temos nenhum elemento

do tipo D

S, v1, ¯t

E

, que indicaria o recebimento da resposta para o buffer. Dessa forma, apresentamos a redução para o caso (ii):

D G, ρ, I, O, M[(v1 : S! ¯I, v2 : S? ¯O, TC, NT)], TE, NM T E , sendo G=DV[v2 : S? ¯O], Ac, Ad E , indegree(v2) = 0, (now() - TC) > TE, NT >0, ∀¯t.DS, v1, ¯t E / ∈ I =⇒ D G, ρ, I, O[S, v2, Eval( ¯I)], M[(v1 : S! ¯I, v2 : S? ¯O, now(), NT1)], TE, NM T E G=DV[v2 : S? ¯O], Ac, Ad E

Nas premissas, além da identiĄcação de que o vértice de saída v2possui indegree=0,

temos mais três informações: o tempo de espera pela resposta da execução do serviço ul- trapassou o limite; o número de tentativas restantes para a execução do mesmo é maior que zero; e que não existe um elemento no buffer de entrada cujo padrão sejaD

S, v1, ¯t

E . Como não existe nenhuma entrada para ser consumida pelo vértice v2, visto que o tempo

de espera ultrapassou o limite, consideramos esta chamada como falha, e realizamos uma nova chamada ao serviço, uma vez que ainda temos tentativas restantes a realizar. Dessa forma, a redução possui a mesma conĄguração de uma chamada de serviço, porém com

3.3. Substituição do Serviço 53

Belgede Geleneksel Yozgat evleri (sayfa 172-186)

Benzer Belgeler