O PAI EAS disponibiliza três interfaces para interação com uma fila de inferência assíncrona: uma API HTTP, um SDK Python e a CLI eascmd. Este documento aborda as três opções.
Como funciona
Ao implantar um serviço de inferência assíncrona, o EAS cria automaticamente duas filas:
Fila de entrada: recebe solicitações de inferência dos clientes.
Fila de saída (sink): armazena os resultados de inferência gravados pelo serviço.
O fluxo de dados é o seguinte:
Envie uma solicitação de inferência para a fila de entrada. O EAS retorna imediatamente um ID de solicitação e um índice de fila.
O serviço de inferência lê os dados da fila de entrada, executa a inferência e grava os resultados na fila de saída.
Recupere o resultado da fila de saída usando o ID da solicitação ou o índice.
Pré-requisitos
Antes de começar, verifique se você tem:
Um serviço de inferência assíncrona implantado no PAI EAS
O endpoint da fila de entrada, o endpoint da fila de saída e o token do seu serviço
Para encontrar esses valores, acesse a aba Inference Service, clique em no nome do serviço para abrir a página Overview e, em seguida, clique em View Endpoint Information na seção Basic Information.

Os formatos dos endpoints são:
|
Endpoint |
Formato |
Exemplo |
|
Fila de entrada |
|
|
|
Fila de saída (sink) |
|
|
Acesse um serviço de fila por API
Todas as solicitações HTTP exigem um cabeçalho Authorization com o token do seu serviço.
Referência rápida:
|
Operação |
Método |
Caminho |
Parâmetros principais |
|
Enviar dados |
POST |
|
|
|
Visualize detalhes da fila |
GET |
|
— |
|
Consultar dados por índice |
GET |
|
|
|
Consultar dados por ID de solicitação |
GET |
|
|
|
Consultar resultados de inferência |
GET |
|
|
|
Exclua um único item |
DELETE |
|
— |
|
Truncar a fila |
DELETE |
|
— |
Envie dados para uma fila
Envie uma solicitação para a fila de entrada usando curl:
curl -v http://182848887922****.cn-shanghai.pai-eas.aliyuncs.com/api/predict/qservice \
-H 'Authorization: YmE3NDkyMzdiMzNmMGM3ZmE4ZmNjZDk0M2NiMDA3OTZmNzc1MT****==' \
-d '[{}]'
A resposta inclui:
> POST /api/predict/qservice HTTP/1.1
> Host: 182848887922****.cn-shanghai.pai-eas.aliyuncs.com
> Authorization: YmE3NDkyMzdiMzNmMGM3ZmE4ZmNjZDk0M2NiMDA3OTZmNzc1MT****==
>
< HTTP/1.1 200 OK
< Content-Length: 19
< X-Eas-Queueservice-Request-Id: 4e034bnvb-e783-4272-9333-68x6a1v8dc6x
<
1033
A resposta retorna dois identificadores para uso em consultas posteriores:
Cabeçalho
X-Eas-Queueservice-Request-Id: o ID da solicitação (4e034bnvb-e783-4272-9333-68x6a1v8dc6x).Corpo da resposta: o índice da fila (
1033).
Envie dados prioritários
Por padrão, a fila processa dados na ordem FIFO (First-In, First-Out). Para priorizar solicitações específicas, adicione _priority_=1 à string de consulta:
curl -v "http://182848887922****.cn-shanghai.pai-eas.aliyuncs.com/api/predict/qservice?_priority_=1" \
-H 'Authorization: YmE3NDkyMzdiMzNmMGM3ZmE4ZmNjZDk0M2NiMDA3OTZmNzc1MT****==' \
-d '[{}]'
Os dados prioritários são enviados aos assinantes antes dos dados com prioridade padrão.
Visualize detalhes da fila
Adicione _attrs_=true a uma solicitação GET para recuperar metadados da fila:
curl -v -H 'Authorization: YmE3NDkyMzdiMzNmMGM3ZmE4ZmNjZDk0M2NiMDA3OTZmNzc1MT****==' \
"http://182848887922****.cn-shanghai.pai-eas.aliyuncs.com/api/predict/qservice?_attrs_=true"
A resposta é um objeto json:
{"consumers.stats.total":"0","consumers.status.total":"0","meta.header.group":"X-EAS-QueueService-Gid","meta.header.priority":"X-EAS-QueueService-Priority","meta.header.user":"X-EAS-QueueService-Uid","stream.maxPayloadBytes":"524288","meta.name":"pmml_test","meta.state":"Normal","stream.approxMaxLength":"4095","stream.firstEntry":"0","stream.lastEntry":"0","stream.length":"1"}
Campos principais:
|
Campo |
Descrição |
|
|
Tamanho máximo em bytes de um único item de dados |
|
|
Número máximo de itens de dados que a fila pode armazenar |
|
|
Índice do primeiro item na fila |
|
|
Índice do último item na fila |
|
|
Número atual de itens na fila |
|
|
Estado atual da fila |
Alternativamente, acesse a página Elastic Algorithm Service (EAS), clique em no nome do serviço e mude para a aba Asynchronous Queue.

Consulte dados
Escolha um método de recuperação adequado ao seu caso de uso:
|
Método |
Funcionamento |
Quando usar |
|
Polling |
Consulta dados por índice ou ID de solicitação sob demanda |
Ideal para recuperar um item específico ou verificar o estado da fila ocasionalmente |
|
Assinatura |
Assina via WebSocket para receber dados conforme chegam |
Recomendado para processamento contínuo de fluxo ou cenários de alto throughput |
Faça polling de dados da fila de entrada
Consulte dados por índice ou ID de solicitação:
# Query by index
curl -v -H 'Authorization: YmE3NDkyMzdiMzNmMGM3ZmE4ZmNjZDk0M2NiMDA3OTZmNzc1MT****==' \
"http://182848887922****.cn-shanghai.pai-eas.aliyuncs.com/api/predict/qservice?_index_=1022"
# Query by request ID
curl -v -H 'Authorization: YmE3NDkyMzdiMzNmMGM3ZmE4ZmNjZDk0M2NiMDA3OTZmNzc1MT****==' \
"http://182848887922****.cn-shanghai.pai-eas.aliyuncs.com/api/predict/qservice?requestId=87633037-39a4-40bf-8405-14f8e0c31896"
Resposta:
> GET /api/predict/qservice?_index_=1022&_auto_delete_=false HTTP/1.1
> Host: 182848887922****.cn-shanghai.pai-eas.aliyuncs.com
> Authorization: YmE3NDkyMzdiMzNmMGM3ZmE4ZmNjZDk0M2NiMDA3OTZmNzc1MT****==
>
< HTTP/1.1 200 OK
< Content-Length: 4
< Content-Type: text/plain; charset=utf-8
<
[{}]
Códigos de status da resposta:
|
Código de status |
Significado |
|
|
Dados encontrados e retornados |
|
|
Não existem dados correspondentes (retornado imediatamente quando |
Parâmetros de consulta:
|
Parâmetro |
Tipo |
Padrão |
Descrição |
|
|
INT |
|
Índice inicial. Defina este valor próximo ao índice do item alvo para maior eficiência na consulta. |
|
|
INT |
|
Número de itens a recuperar. |
|
|
BOOL |
|
Exclui os itens consultados da fila após a recuperação. |
|
|
STRING |
|
Tempo de espera caso não existam dados correspondentes. O valor |
|
|
STRING |
— |
Tag integrada usada para localizar um item específico. O framework EAS marca cada item de entrada com |
Faça polling de resultados de inferência da fila de saída
Consulte resultados na fila de saída usando o ID de solicitação do envio original:
curl -v -H 'Authorization: YmE3NDkyMzdiMzNmMGM3ZmE4ZmNjZDk0M2NiMDA3OTZmNzc1MT****==' \
"http://182848887922****.cn-shanghai.pai-eas.aliyuncs.com/api/predict/qservice/sink?requestId=0337f7a1-a6f6-49a6-8ad7-ff2fd12bbe2d"
Resposta:
> GET /api/predict/qservice/sink?requestId=0337f7a1-a6f6-49a6-8ad7-ff2fd12b**** HTTP/1.1
> Host: 182848887922****.cn-shanghai.pai-eas.aliyuncs.com
> Authorization: YmE3NDkyMzdiMzNmMGM3ZmE4ZmNjZDk0M2NiMDA3OTZmNzc1MT****==
>
< HTTP/1.1 200 OK
< Content-Length: 53
< Content-Type: text/plain; charset=utf-8
<
[{"p_0":0.5224580736905329,"p_1":0.4775419263094671}]
Exclua dados
Remova dados da fila de duas maneiras: exclua um único item ou trunque todos os itens até um determinado índice.
Exclua um único item
curl -XDELETE -v -H 'Authorization: YmE3NDkyMzdiMzNmMGM3ZmE4ZmNjZDk0M2NiMDA3OTZmNzc1MT****==' \
"http://182848887922****.cn-shanghai.pai-eas.aliyuncs.com/api/predict/qservice?_index_=1022"
Resposta:
> DELETE /api/predict/qservice?_index_=1022 HTTP/1.1
> Host: 182848887922****.cn-shanghai.pai-eas.aliyuncs.com
> Authorization: YmE3NDkyMzdiMzNmMGM3ZmE4ZmNjZDk0M2NiMDA3OTZmNzc1MT****==
>
< HTTP/1.1 200 OK
< Content-Length: 4
< Content-Type: text/plain; charset=utf-8
<
OK
Parâmetro:
|
Parâmetro |
Tipo |
Descrição |
|
|
INT |
Índice do item a excluir |
Trunque a fila
Exclua todos os itens com índice inferior ao valor especificado:
curl -XDELETE -v -H 'Authorization: YmE3NDkyMzdiMzNmMGM3ZmE4ZmNjZDk0M2NiMDA3OTZmNzc1MT****==' \
"http://182848887922****.cn-shanghai.pai-eas.aliyuncs.com/api/predict/qservice?_index_=1023&_trunc_=true"
Resposta:
> DELETE /api/predict/qservice?_index_=1023&_trunc_=true HTTP/1.1
> Host: 182848887922****.cn-shanghai.pai-eas.aliyuncs.com
> Authorization: YmE3NDkyMzdiMzNmMGM3ZmE4ZmNjZDk0M2NiMDA3OTZmNzc1MT****==
>
< HTTP/1.1 200 OK
< Content-Length: 4
< Content-Type: text/plain; charset=utf-8
<
OK
Parâmetros:
|
Parâmetro |
Tipo |
Descrição |
|
|
INT |
Índice de corte. Todos os itens com índice inferior a este valor serão excluídos. |
|
|
BOOL |
Deve ser |
Assine uma fila (SDK Python)
Para processamento contínuo de fluxo, assine a fila de saída usando o SDK Python. O serviço de fila utiliza o protocolo WebSocket para manter uma conexão persistente e enviar dados aos assinantes assim que chegarem. O tamanho da janela de assinatura é controlado pela configuração worker_threads na instância do serviço de inferência.
Um serviço de inferência não é obrigatório. Use o sdk para assinar a fila de entrada em um serviço personalizado e grave os resultados em uma fila de mensagens de terceiros ou em um armazenamento como o Object Storage Service (oss).
Instale o sdk:
pip install eas_prediction --user
Assine a fila de saída:
O exemplo abaixo usa QueueClient para enviar 10 itens à fila de entrada e assinar os resultados da fila de saída. Em produção, utilize threads separadas para envio e assinatura.
#!/usr/bin/env python
from eas_prediction import QueueClient
# Create a client for the input queue.
input_queue = QueueClient('182848887922****.cn-shanghai.pai-eas.aliyuncs.com', 'qservice')
# To set a custom user or group:
# input_queue = QueueClient('182848887922****.cn-shanghai.pai-eas.aliyuncs.com', 'qservice', uid='your_user_id', gid='your_group_id')
input_queue.set_token('YmE3NDkyMzdiMzNmMGM3ZmE4ZmNjZDk0M2NiMDA3OTZmNzc1MT****==')
input_queue.init()
# Create a client for the output queue.
sink_queue = QueueClient('182848887922****.cn-shanghai.pai-eas.aliyuncs.com', 'qservice/sink')
sink_queue.set_token('YmE3NDkyMzdiMzNmMGM3ZmE4ZmNjZDk0M2NiMDA3OTZmNzc1MT****==')
sink_queue.init()
# Send 10 items to the input queue.
for x in range(10):
index, request_id = input_queue.put('[{}]')
print(index, request_id)
# Print queue attributes.
attrs = input_queue.attributes()
print(attrs)
# Subscribe to the output queue with a window size of 5.
i = 0
watcher = sink_queue.watch(0, 5, auto_commit=False)
for x in watcher.run():
print(x.data.decode('utf-8'))
# Commit each item after processing.
sink_queue.commit(x.index)
i += 1
if i == 10:
break
# Close the watcher. Each QueueClient instance supports only one active watcher.
# Failing to close the watcher causes an error on the next watch() call.
watcher.close()
Acesse um serviço de fila via eascmd
A ferramenta eascmd encapsula toda a API do serviço de fila. Utilize o subcomando eascmd stream para operar e depurar um serviço de fila diretamente da linha de comando.
A versão do eascmd deve ser superior a 2.6.0. Para instruções de download e configure, consulte Baixe e autentique o cliente .
Referência rápida:
|
Comando |
Descrição |
|
|
Configure o acesso ao serviço de fila |
|
|
Visualize detalhes da fila |
|
|
Envie dados inline |
|
|
Envie todas as linhas de um arquivo |
|
|
Consulta até 10 itens com timeout |
|
|
Filtra por ID de solicitação |
|
|
Exclua um único item por índice |
|
|
Trunca todos os itens até o índice 4 |
|
|
Assina (commit manual) |
|
|
Assina (auto-commit) |
Configure o acesso
Execute eascmd stream config para apontar a CLI para o seu serviço de fila:
eascmd stream config \
--url=http://182848887922****.cn-shanghai.pai-eas.aliyuncs.com/api/predict/qservice \
--token=YmE3NDkyMzdiMzNmMGM3ZmE4ZmNjZDk0M2NiMDA3OTZmNzc1MT****==
Após a configuração, o eascmd utiliza default_group e default_user como valores padrão para group_id e user_id. Substitua-os usando --group e --user em qualquer comando subsequente.
Visualize detalhes da fila
eascmd stream info
Saída de exemplo:
[OK] Attributes:
consumers.list.[0] : Id: imageasync.imageasync-35d72370-5f576f7c8d-2mdb4, Index: 0, Pending: 0, Status: Running, Idle: 19.997s, Window: 5, Slots: 5, AutoCommit: false
consumers.stats.total : 1
consumers.status.total : 1
groups.list.[0] : Id: imageasync, Index: 0, Pending: 0, Delivered: 1, Consumers: 1
meta.header.group : X-EAS-QueueService-Gid
meta.header.priority : X-EAS-QueueService-Priority
meta.header.user : X-EAS-QueueService-Uid
meta.maxPayloadBytes : 8192
meta.name : imageasync-queue-38895e88
meta.state : Normal
stream.approxMaxLength : 230399
stream.firstEntry : 0
stream.lastEntry : 0
stream.length : 0
Para descrições dos campos, consulte Visualize detalhes da fila. Use o comando info para verifique o estado da fila e testar a conectividade.
Envie dados
Envie dados inline com a flag -d:
eascmd stream put -d "10s"
Saída:
[OK] 1
[INFO] Put data done.
Total time cost: 401.892141ms
Total size: 3.00 B
Total: 1, success: 1, failed: 0
Envie todas as linhas de um arquivo com a flag -f:
eascmd stream put -f test.data
Saída:
[INFO] Opening data file: test.data
[OK] 2
[OK] 3
[OK] 4
...
Consulte dados
Busque até 10 itens com timeout de 3 segundos:
eascmd stream get -l10 --timeout=3s
Saída:
[OK] [0 - 1] tags[Header:Content-Type=text/plain; charset=utf-8 requestId=e47b76e2-2648-40fe-9197-a268015cbd1f ts@source=1685802680575] data1
[OK] [1 - 2] tags[Header:Content-Type=text/plain; charset=utf-8 requestId=51d13952-6ba3-4d52-b548-e58837675c7a ts@source=1685807531686] data2
[OK] [2 - 3] tags[Header:Content-Type=text/plain; charset=utf-8 requestId=ef6940e3-159c-45f3-a96d-bc0acd71275f ts@source=1685807531701] OK
...
Cada linha contém três colunas:
[received_index - queue_index]: por exemplo,[0 - 1]indica que o primeiro item recebido possui índice de fila 1.-
tags[...]: metadados anexados ao item:Header:*: cabeçalhos HTTP da solicitação original.requestId: ID de solicitação gerado automaticamente.ts@source: timestamp Unix de quando a fila de entrada recebeu a solicitação.ts@sink: timestamp Unix de quando a fila de saída recebeu os dados.
Conteúdo dos dados.
Se uma instância de serviço de inferência estiver em execução simultaneamente, ela poderá consumir dados da fila de entrada antes que você consiga consultá-los. Adicione a flag -k para consultar a partir da fila de saída.
Para filtrar por ID de solicitação:
eascmd stream get --tags requestId=ef6940e3-159c-45f3-a96d-bc0acd71275f
Saída:
[OK] [0 - 3] tags[Header:Content-Type=text/plain; charset=utf-8 requestId=ef6940e3-159c-45f3-a96d-bc0acd71275f ts@source=1685807531701] OK
Exclua dados
Exclua um único item por índice:
eascmd stream delete 3
Confirme quando solicitado:
Deleting index(es):
3 [y/N]y
[OK] deleted
Trunque todos os itens até um determinado índice:
eascmd stream trunc 4
Confirme quando solicitado:
trunc stream from index: 4 [y/N]y
[OK] truncated
Assine a fila
Utilize o comando watch para assinar e receber dados à medida que são enviados. Por padrão, o cliente realiza o commit de cada item manualmente:
eascmd stream watch
Saída:
[INFO] Start to watch: index: 0, indexOnly: false, autoCommit: false, window: 10
I0604 09:20:45.211243 66197 queue.go:532] watch via websocket
[OK] [0 - 4] tags[Header:Content-Type=text/plain; charset=utf-8 requestId=2a5645b6-9ee5-4026-bdee-fab31e435934 ts@sink=1685807531718 ts@source=1685807531715] data4
commit: 4 ? [Y/n]
Insira
Ypara confirmar o item e receber o próximo.Insira
npara executar um commit negativo (rejeitar o item):
commit: 5 ? [Y/n]n
negative: 5 ? [Y/n]y
Para detalhes sobre a semântica de commit e commit negativo, consulte Commit e Negativo.
Para que o servidor realize o commit dos itens automaticamente:
eascmd stream watch --auto-commit
Saída:
[INFO] Start to watch: index: 0, indexOnly: false, autoCommit: true, window: 10
I0604 09:30:08.554542 66408 queue.go:532] watch via websocket
[OK] [0 - 5] tags[Header:Content-Type=text/plain; charset=utf-8 requestId=64ba6aaf-49b0-45c7-8d79-6cf6dc1065d0 ts@sink=1685807531733 ts@source=1685807531730] data5
[OK] [1 - 6] tags[Header:Content-Type=text/plain; charset=utf-8 requestId=5825dd3e-a5e2-4754-a946-96e068d643c8 ts@sink=1685807531771 ts@source=1685807531768] data6
...
Para visualize todas as opções e comandos disponíveis do eascmd stream, execute eascmd stream help.
Próximos passos
Assinatura e push do serviço de fila: saiba mais sobre grupos de consumidores, usuários e semântica de commit.
Baixe e autentique o cliente: configure e atualize o
eascmd.