Efetivação em Duas Fases

Slides

1. Preparando uma viagem

1.1. Preparando uma viagem

Tomas está planejando uma viagem e precisa de hospedagem e passagens aéreas.

thinking-about-trip.png

Entretando, Tomas está com medo de reservar o hotel e acabar não conseguindo passagem. Ou pior, comprar as passagens e acabar não conseguindo um hotel pra ficar.

1.2. Iniciando reserva do hotel

Tomas tem um plano! Primeiro, ele abre o site do hotel e inicia uma reserva. Esses sites normalmente seguram as reservas iniciadas por alguns minutos para você preencher seus dados de pagamento, então existe uma certa garantia de que a hospedagem será do Tomas se ele confirmar a tempo.

hotel-reservation.png

1.3. Iniciando reserva das passagens aéreas

Depois, ele muda de aba para o site da companhia aérea e inicia a reserva do voo.

flight-reservation.png

PS: Para efeitos desse exemplo, vamos considerar que os sites de companhia aérea funcionam decentemente.

1.4. Confirmando a reserva do hotel

Agora que o Tomas sabe que tem as passagens e hospedagem que precisa, ele inicia as confirmações.

hotel-confirmation.png

1.5. Confirmando a reserva das passagens aéreas

Em seguida, ele confirma as passagens aéreas.

flight-confirmation.png

1.6. Protocolo de preparação de viagem do Tomas

Assumindo que:

  • Os sites de hotel e passagens aéreas vão manter disponíveis os itens selecionados enquanto a reserva não expirar

    • Por exemplo, se o Tomas iniciou uma reserva do último quarto de hotel, aquele hotel vai aparecer indisponível se outra pessoa procurar enquanto o Tomas não finaliza sua compra, ou seu tempo expira.
  • Os sites não vão ficar indisponíveis durante o processo
  • O Tomas tem tempo suficiente para confirmar as duas reservas antes de alguma delas expirarem

    • Por exemplo, o Tomas não vai ficar sem internet no meio do processo.

Podemos garantir que:

  • Se o Tomas reservar a passagem aérea, ele conseguirá hospedagem.
  • Se o Tomas reservar hospedagem, ele conseguirá passagem aérea.

2. Efetivação em duas fases

2.1. Efetivação em duas fases (Two-Phase Commit)

Podemos dizer que o protocolo do Tomas é uma efetivação em duas fases.

  • Na primeira fase, ele prepara as reservas em ambos os sites, e aguarda confirmação
  • Na segunda fase, ele efetiva as reservas preparadas na primeira fase

2.2. Primeira fase: preparar hotel

Primeiro, o Tomas requisita uma preparação do site do hotel. Preparar aqui significa:

  • “Oi, se tiver um quarto de hotel disponível pro dia tal, me avisa e guarda ele pra mim. Te confirmo e dou meus dados de pagamento daqui a pouco.”

As partes importantes são:

  • Me avisa se tem hotel disponível
  • Deixa ele guardado pra mim

prepare-hotel.png

2.3. Primeira fase: preparar passagens aéreas

Novamente, as partes importantes são:

  • Me avisa se tem passagem aérea disponível
  • Deixa guardado pra mim

prepare-flight.png

2.4. Primeira fase: aguardar confirmações

Para finalizar a primeira fase, o Tomas deve receber a confirmação de que as preparações foram positivas.

  • Se alguma das reservas não funcionar, ele aborta a operação, cancelando ou fechando a aba do outro site.

all-prepared.png

2.5. Segunda fase: confirmar todas as reservas

Na segunda fase, considerando que as preparações foram positivas, basta que o Tomas confirme todas as reservas.

  • Isso é a efetivação da operação (commit).
  • Commit pode também ser traduzido como comprometer-se. É quando o Tomas dá os dados de cartão de crédito dele e se compromete com a compra.

commit.png

2.6. Termos do protocolo Two-Phase Commit

translation.png

2.7. Propriedade

Queremos garantir que:

  • Se o Tomas reservar a passagem aérea, ele conseguirá hospedagem.
  • Se o Tomas reservar hospedagem, ele conseguirá passagem aérea.

Pensando que podemos ter vários outros resource managers, podemos generalizar isso como:

  • Se um resource manager for efetivado, então todos os outros devem ser também

2.9. Separação de memória

  • Nas especificações, o que cada componente do sistema conhece fica sempre to estado da nossa máquina de estados.
  • Na realidade de sistemas distribuídos, é importante considerar que esse conhecimento está separado

    • Só o site do hotel sabe da disponibilidade de quartos e pode fazer reservas
    • Só o site da companhia aérea sabe da disponibilidade de voos e pode fazer reservas
  • Se a memória fosse uma só, seria muito mais simples

2.10. Atomicidade

Operações atômicas são aquelas que podem executar sem “interrupção” de outro processo.

  • São aquelas que conseguimos executar de certeza, não importa o que aconteça com os outros fatores.

    • “Outros fatores” depende do nosso nível de abstração e suposições

Exemplo de operações atômicas:

  • Iniciar uma reserva
  • Confirmar uma reserva
  • Cancelar uma reserva

Exemplo de operação não atômica:

  • Comprar uma passagem aérea

    • Considerando o nível de abstração do exemplo do Tomas, é possível dar início e até finalizar a compra de hospedagem enquanto ele compra passagens aéreas.
    • Se algo pode acontecer enquanto a operação acontece, a operação não é atômica.

2.11. Atomicidade em modelos

Uma ação vai sempre representar uma operação atômica

  • Nada pode acontecer enquanto uma transição do sistema acontece
  • Depende completamente do nível de abstração que escolhemos
    • Podemos entrar em mais detalhe e considerar cada clique que o Tomas dá nos sites.

PS: No trabalho 1, o nível de abstração mais apropriado é uma transição por turno.

2.12. Aplicação prática de Two-Phase Commit

Um exemplo de aplicação é para escrever dados em múltiplos bancos de dados diferentes, a fim de manter consistência de dados entre eles.

  • Semelhante ao exemplo em (HOWARD, 2016)

  • Já usei em uma migração de bancos de dados

2.13. Referências

HOWARD, H. Consensus & organising coffee - computerphile. Disponível em: <https://www.youtube.com/watch?v=jn3DBzr--Ok>.