APIs e Microsserviços

31 mai, 2011

Computação em Nuvem com Amazon Web Services – Parte 04: sistema de mensagens confiável com o SQS

Publicidade

Conheça os conceitos básicos do Amazon SimpleDB (SDB) e explore algumas
das funções fornecidas pelo boto, uma biblioteca Python de software
livre para interação com SDB. Nesta série “Computação em nuvem com Amazon Web Services”,
saiba mais sobre a computação em nuvem usando Amazon Web Services. Você pode conferir os artigos anteriores que já foram publicados:

Agora você pode explorar como os serviços fornecem uma alternativa convincente para
arquitetar e desenvolver aplicativos escaláveis e confiáveis.
Neste artigo, conheça o serviço de sistema de mensagens
confiável e escalável fornecido pelo Amazon Simple Queue Service (SQS).

Amazon SQS

Amazon Simple Queue Service (SQS) é uma estrutura de sistema de
mensagens escalável e confiável que simplifica a criação, o
armazenamento e a recuperação de mensagens de texto.

É possível usá-lo
como base para unir os aplicativos baseados nos seus Amazon Web
Services. Usar SQS é uma excelente forma de criar aplicativos Web
realmente desacoplados. Você paga pelas mensagens totalmente com base no
uso. Toda a estrutura de enfileiramento é executada dentro do ambiente
seguro dos próprios datacenters do Amazon.

Alguns recursos fornecidos pelo SQS:

  1. Confiabilidade: SQS foi projetado para armazenar as mensagens de maneira redundante em vários datacenters e disponibilizá-las sempre.
  2. Simplicidade: O modelo de programação para acessar e usar SQS é simples e pode ser
    usado a partir de uma variedade de linguagens de programação.
  3. Segurança: O SQS foi projetado para fornecer um alto nível de segurança. O acesso às mensagens está restrito aos usuários autorizados.
  4. Escalabilidade: O SQS permite criar aplicativos baseados em fila que podem ler e gravar mensagens ilimitadas, sem nenhuma restrição ou limite.
  5. Baixo custo: As taxas do SQS o tornam uma alternativa realmente econômica e atraente para as suas necessidades de mensagens.

O restante desta seção explora os conceitos que sustentam a estrutura do SQS.

Mensagens

Mensagens contém dados de texto de até 8 KB. Cada mensagem é
armazenada até ser recuperada pelo aplicativo de recebimento. Um valor
de tempo limite de visibilidade, em segundos, é especificado quando o
aplicativo de recebimento lê uma mensagem de uma fila. Isso funciona
mais como uma trava e assegura que, pelo período especificado:

  • A mensagem recuperada não estará disponível a qualquer outro consumidor da fila.
  • A
    mensagem somente reaparecerá na fila quando o período de temo limite
    expirar se, e somente se, ela não tiver sido excluída pelo processo de
    leitura.

As mensagens ficam retidas em uma fila por quatro dias. O SQS excluirá automaticamente todas as mensagens que estiverem nas
filas por mais de quatro dias.

SQS segue o modelo de “consistência eventual”,
significando que é possível enviar uma mensagem à fila, mas um
consumidor dessa fila pode não ver a mensagem por um período
significativo. A mensagem será

finalmente entregue, mas essa será uma consideração importante se o seu aplicativo considerar a ordem das mensagens.

Uma mensagem consiste nas partes mostradas na Tabela 1.

Tabela 1. Partes de uma mensagem

Parte Descrição
MessageId Um ID exclusivo que faz referência à mensagem.
ReceiptHandle Um identificador exclusivo retornado quando uma mensagem é recebida de
uma fila. Esse identificador é diferente toda vez que você recebe uma
mensagem da fila. Ele é obrigatório quando você exclui a mensagem.
MD5OfBody A compilação MD5 da cadeia de caractere do corpo da mensagem com codificação não URL.
Body Os dados da mensagem real.

O CTO do Amazon, Werner Vogels, tem uma discussão da lógica para consistência eventual do seu blog, Consulte a seção Recursos para maiores informações.

Filas

Filas são contêineres para as mensagens. Cada mensagem deve
especificar uma fila que a manterá. As mensagens enviadas a uma fila
permanecem nela até elas serem explicitamente excluídas. A ordem da
fila é a primeira a entrar e sair, mas a ordem não é garantida.

Cada
fila tem um tempo limite de visibilidade padrão de 30 segundos. É
possível alterar esse valor para toda a fila ou ele pode ser definido
individualmente para cada mensagem sendo recuperada.

O tempo limite
máximo de visibilidade de uma fila ou mensagem é de duas horas (7200
segundos). O SQS reserva-se o direito de excluir automaticamente as
filas caso não haja nenhuma atividade na fila por 30 dias corridos.

Considerações de design

O SQS é um pouco diferente das estruturas de fila comuns. Há três
coisas que devem ser consideradas antes de se projetar os aplicativos
baseados em SQL:

  • O SQS não garante a ordem das mensagens em uma fila.

    As mensagens são ordenadas de maneira desordenada
    na fila. Elas não são realmente armazenadas na ordem em que são
    adicionadas à fila.
    O SQS tentará preservar a ordem das mensagens, mas
    não há garantia de que você receberá mensagens na ordem exata em que
    elas são enviadas. Se a ordem das mensagens for importante para o seu
    aplicativo, será preciso adicionar dados de sequência a cada mensagem.

  • O SQS não garante a exclusão de uma mensagem na fila.

    Você deve projetar o seu aplicativo de forma que
    ele não seja afetado se a mesma mensagem for processada mais de uma vez.
    Todas as mensagens são armazenadas em vários servidores pelo SQS para
    fornecer redundância e alta disponibilidade. Se um desses vários
    servidores ficar indisponível enquanto uma mensagem estiver sendo
    excluída, é possível, em raras circunstâncias, obter uma cópia da
    mensagem novamente enquanto estiver recuperando mensagens.

  • O SQS não garante que todas as mensagens da fila serão retornadas quando consultadas.

    O SQS usa amostragem de mensagem com base em
    distribuição aleatória ponderada e retorna mensagens somente do
    subconjunto amostrado de servidores quando você consulta as mensagens.
    Embora uma determinada solicitação possa não retornar todas as mensagens
    da fila, se continuar recuperando mensagens da fila, ocorrerá a
    amostragem de todos os servidores, e você receberá todas as suas
    mensagens.

Versões de API

Cada versão da API é geralmente conhecida pelo
uso da data de release. É
altamente recomendado que os usuários:

  • Comecem a migrar todos os aplicativos que criaram usando a versão mais antiga da API assim que possível.
  • Para minimizar qualquer interrupção, use a versão mais recente da API ao criar novos aplicativos com SQS.

Em 2008, a versão atualizou a precificação, o que reduzirá o custo
de uso do SQS para a maioria dos usuários, e incluiu recursos e
modificações adicionais. Entretanto, ela também apresentou mudanças
significativas e incompatíveis com as APIs mais antigas.

Todas as
bibliotecas e ferramentas criadas com a versão mais antiga precisarão
ser modificadas. Uma descrição detalhada das mudanças entre as versões
está disponível no Web site do SQS.

Preços

Os seguintes detalhes da precificação são para a versão de 2008. É possível obter os detalhes da estrutura de precificação
para as versões mais antigas do site do SQS (consulte mais informações em Recursos).
A precificação tem como base o número de solicitações feitas ao SQS, o que inclui as seguintes operações:

  • CreateQueue
  • ListQueues
  • DeleteQueue
  • SendMessage
  • ReceiveMessage
  • DeleteMessage
  • SetQueueAttributes
  • GetQueueAttributes

Tabela 2. Precificação de solicitações

Tipo Custo
Solicitação para SQS $0,000001 por solicitação

A quantidade de dados transferida para o e do SQS. Não há
nenhum encargo para os dados transferidos entre as instâncias SQS e EC2.

Tabela 3. Precificação de transferência de dados

Tipo de transferência Custo
Transferência de todos os dados $0,100 por GB — transferência de entrada de todos os dados

$0,170 por GB — primeiros 10 TB/mês de dados transferência de saída
$0,130 por GB — próximos 40 TB/mês de dados transferência de saída
$0,110 por GB — próximos 100 TB/mês de dados transferência de saída
$0,100 por GB — transferência de saídade dados /mês acima de 150 TB

Confira Amazon SQS para as informações de precificação mais recentes. É
possível também usar Amazon Web Services Simple Monthly Calculator para
calcular os seus custos de uso mensais do SQS e os outros Amazon Web
Services (consulte mais em Recursos).

Apresentando a Amazon Web Services e SQS

Para começar a explorar o SQS, será preciso primeiro se inscrever em uma conta Amazon
Web Services.
Consulte a Parte 2 desta série para instruções detalhadas sobre a inscrição em Amazon Web Services.

Quando você tiver uma conta Amazon Web Services, ative o serviço Amazon SQS para a sua conta:

  1. Faça login
    na sua conta Amazon Web Services.
  2. Navegue para a página inicial do SQS.
  3. Clique em Sign Up For Amazon SQS no lado direito.
  4. Forneça as informações solicitadas e finalize o processo de inscrição.

Toda
comunicação com qualquer um dos Amazon Web Services será por meio da
interface SOAP ou da interface de consulta. Neste artigo, você usa a
interface de consulta por meio de uma biblioteca de terceiros para
comunicação com o SQS.

É preciso obter suas chaves de acesso, que podem ser acessadas pela página de dados da conta de serviços da Web
selecionando View Access Key Identifiers. Você está agora configurado para usar Amazon Web Services e ativou o serviço SQS para a sua conta.

Interação com SQS

Para este exemplo, use uma biblioteca de terceiros de software livre Python com o nome
boto para se familiarizar com SQS executando pequenos fragmentos de código em um shell Python.

Instalar boto e configurar o ambiente

Faça o download do boto
A versão mais recente, no momento da redação deste
artigo, era 1.4c. Descompacte o archive ZIP no diretório de sua escolha.
Vá até esse diretório e execute setup.py para instalar boto no seu ambiente Python local, como mostrado na Listagem 1.

Listagem 1. Instalar boto

$ cd directory_where_you_unzipped_boto

$ python setup.py install

Configure algumas variáveis de ambiente para apontar para as chaves de
acesso de Amazon Web Services. As chaves de acesso estão disponíveis em Web Services Account information.

Listagem 2. Configurar variáveis de ambiente

# Export variables with your AWS access keys
$ export AWS_ACCESS_KEY_ID=Your_AWS_Access_Key_ID
$ export AWS_SECRET_ACCESS_KEY=Your_AWS_Secret_Access_Key

Verifique se tudo está configurado corretamente iniciando um shell
Python e importando a biblioteca boto, como indicado na Listagem 3.

Listagem 3. Verificar a configuração

$ python
Python 2.4.5 (#1, Apr 12 2008, 02:18:19)
[GCC 4.0.1 (Apple Computer, Inc. build 5367)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import boto
>>>

Explorar SQS com boto

Use a classe SQSConnection para fornecer a interface
principal para a interação com o SQS. O meio para o uso de boto é o
console Python. O exemplo chama métodos diferentes no objeto SQSConnection
e examina as respostas retornadas pelo SQS, o que o ajudará a se
familiarizar com a API enquanto você explora os conceitos que estão por
trás de SQS.

A primeira etapa é criar um objeto de conexão
com o SQS usando as chaves de acesso de Amazon Web Services exportadas
anteriormente para o seu ambiente. A biblioteca boto sempre verifica o
ambiente primeiro para detectar se essas variáveis são definidas. Se
elas forem definidas, boto automaticamente as usará ao criar a conexão.

Listagem 4. Criar uma conexão para SQS

>>> import boto
>>> sqs_conn = boto.connect_sqs()
>>>

No restante deste artigo, é possível usar o objeto sqs_conn, criado acima, para interagir com o SQS. É possível criar uma fila
especificando um nome para a fila, junto com um valor de tempo limite de
visibilidade opcional. Se você omitir um valor para o tempo limite,
boto criará a fila com o valor padrão de 30 segundos fornecido pelo SQS.

Listagem 5. Criar uma fila

>>> q1 = sqs_conn.create_queue('devworks-sqs-1')
>>>
>>> q1.get_timeout()
30
>>> q2 = sqs_conn.create_queue('devworks-sqs-2', 60)
>>>
>>> q2.get_timeout()
60
>>>

Recupere uma lista de todas as suas filas, que retorna um objeto
resultset que é essencialmente uma lista Python, como mostrado na
Listagem 6. É possível iterar essa lista e acessar todas as informações
pertinentes de cada fila.

Listagem 6. Listar todas as filas

>>> all_queues = sqs_conn.get_all_queues()
>>>
>>> len(all_queues)
2
>>>
>>> for q in all_queues:
... print q.id
... print q.count()
... print q.get_timeout()
... print q.url
...
/devworks-sqs-1
0
30
http://queue.amazonaws.com/devworks-sqs-1

/devworks-sqs-2
0
60
http://queue.amazonaws.com/devworks-sqs-2

É preciso excluir todas as mensagens de uma fila antes de excluir a fila.
Há um método clear() em boto que pode ser usado para excluir todas as mensagens de uma fila.

Listagem 7. Apagar e excluir filas

>>> q2.clear()
0
>>> sqs_conn.delete_queue(q2)
True
>>>

É possível enviar mensagens de texto com um tamanho máximo de 8 KB para
uma fila. Crie uma nova mensagem usando o boto da classe Message, como mostrado na Listagem 8.

Listagem 8. Enviar uma mensagem

>>> from boto.sqs.message import Message
>>>
>>> m1 = Message()
>>>
>>> m1.set_body('Hi there devworks!')
>>>
>>> status = q1.write(m1)
>>>
>>> print status
True
>>>

A recuperação de mensagens de uma fila retorna um objeto result-set,
que é uma lista Python contendo objetos de mensagens. Cada objeto de
mensagem tem um ID exclusivo e um identificador de recebimento associado
a ele.

Quando você lê uma mensagem em uma fila, essa mensagem
automaticamente se torna invisível para todos os outros consumidores da
fila até o período de tempo limite de visibilidade definido para a fila
expirar.

Após a expiração, a mensagem aparece mais uma vez na fila,
dando a outro consumidor a chance de recuperar a mensagem e processá-la.
Entretanto, se a mensagem for excluída da fila antes da expiração do
tempo limite de visibilidade, a sua exclusão será definitiva e não
aparecerá na fila novamente.

Listagem 9. Recuperar uma mensagem

>>> msgs = q1.get_messages()
>>>
>>> len(msgs)
1
>>>
>>> for msg in msgs:
... print "Message ID: ",msg.id
... print "Message Handle: ",msg.receipt_handle
... print "Queue ID: ", msg.queue.id
... print "Message Body: ", msg.get_body()
...
Message ID: 9a930aaf-87de-48ad-894d-b22dd0b1cd1b

Message Handle: Prl0vft3nRjgDDT33svtLnzyPQGWFpRusXdn2v3Lwq+TDtD3hk3aBKbSH1mGc4hzO/VZO
IC0RFyAd7MhbJKPGHn3x35CTz9dAQeNoKYAHiwERXc/xrYXBLGngyuJI+kGmbjvIKqA/wpfQpqzPk2bVA==

Queue ID: /devworks-sqs-1

Message Body: Hi there devworks!
>>>

É possível recuperar mais de uma mensagem especificando o número de
mensagens. A opção padrão em boto é retornar uma mensagem. Vamos
adicionar outra mensagem à fila e recuperar todas as mensagens, como
indicado na Listagem 10. Tenha em mente que pode levar um minuto ou
mais para que uma mensagem recém-adicionada apareça na fila.

Listagem 10. Recuperar várias mensagens

>>> m2 = Message()
>>>
>>> m2.set_body('Still there?')
>>>
>>> status = q1.write(m2)
>>>
>>> print status
True
>>>
>>> msgs = q1.get_messages(10)
>>>
>>> len(msgs)
2
>>>
>>> for msg in msgs:
... print "Message ID: ",msg.id
... print "Message Handle: ",msg.receipt_handle
... print "Queue ID: ", msg.queue.id
... print "Message Body: ", msg.get_body()
... print "*"*80
...
Message ID: 9a930aaf-87de-48ad-894d-b22dd0b1cd1b

Message Handle: Prl0vft3nRjgDDT33svtLnzyPQGWFpRusXdn2v3Lwq+TDtD3hk3aBKbSH1mGc4hzO/VZOIC0R
FyAd7MhbJKPGHn3x35CTz9dAQeNoKYAHiwERXc/xrYXBLGngyuJI+kGmbjvIKqA/wpfQpqzPk2bVA==

Queue ID: /devworks-sqs-1

Message Body: Hi there devworks!


Message ID: ce1632b3-0a6e-4ee2-a5b0-b2e9821d150f

Message Handle: Prl0vft3nRiRunVNVvjOQEc7Tm+uSBQpW4bZcpFMbzWTDtD3hk3aBKbSH1mGc4hzO/VZOIC0R
FxbhtlykUxvNbRQNWJqrMXrxj5m6GwhA7iX0Nu9mqjo+9/hnda8Ou0df+LQ3dOMfXSybzbhed128w==

Queue ID: /devworks-sqs-1

Message Body: Still there?
>>>

As mensagens podem ser excluídas da fila chamando delete_message(). Lembre-se, é preciso excluir todas as mensagens de uma fila antes de excluir uma fila.

Listagem 11. Excluir uma mensagem

>>> msgs = q1.get_messages()
>>>
>>> len(msgs)
1
>>> print msgs[0].get_body()
Hi there devworks!
>>>
>>> q1.delete_message(msgs[0])
True
>>>

Conclusão

Este artigo apresentou o serviço SQS do Amazon. Você viu alguns dos
conceitos básicos e explorou algumas das funções fornecidas por boto,
uma biblioteca Python de software livre para interação com SQS. É
altamente recomendado ler o Guia do desenvolvedor do SQS do Amazon para
obter mais informações.

Aguarde a parte final desta série onde vamos examinar Amazon SimpleDB para o processamento de conjunto de dados na nuvem.

Recursos

Aprender

Discutir

Confira blogs do developerWorks
e participe da
comunidade do developerWorks.

***

artigo publicado originalmente no developerWorks Brasil, por Prabhakar Chaganti

Prabhakar Chaganti é o diretor de tecnologia (CTO) da Ylastic, uma empresa que está criando
uma interface unificada exclusiva para arquitetar, gerenciar e monitorar todo o ambiente de
computação da nuvem AWS de um usuário: EC2, S3, SQS e SimpleDB. Ele é autor de dois livros
recentes, Xen Virtualization e GWT Java AJAX Programming É também vencedor do
prêmio de escolha da comunidade pelo dispositivo virtual mais inovador no VMware Global Virtual
Appliance Challenge.