docs: rebuild showcase repository
This commit is contained in:
@@ -0,0 +1,49 @@
|
|||||||
|
# Benchmark Comparison
|
||||||
|
|
||||||
|
Итог сравнительных тестов shared-SQS и Yandex MQ.
|
||||||
|
|
||||||
|
## Главное
|
||||||
|
|
||||||
|
- shared-SQS показал конкурентоспособные результаты относительно Yandex MQ.
|
||||||
|
- На основных API-операциях shared-SQS быстрее или на уровне Yandex MQ.
|
||||||
|
- Проверкой охвачены все 17 поддерживаемых SQS-операций.
|
||||||
|
|
||||||
|
## Показательные результаты
|
||||||
|
|
||||||
|
Формат: min / avg / max / p95, миллисекунды.
|
||||||
|
|
||||||
|
| Operation | Yandex MQ | shared-SQS |
|
||||||
|
|---|---:|---:|
|
||||||
|
| GetQueueUrl | 766 / 1346 / 2266 / 2060 | 739 / 752 / 770 / 760 |
|
||||||
|
| GetQueueAttributes | 804 / 820 / 847 / 828 | 738 / 752 / 768 / 765 |
|
||||||
|
| SendMessage 1KB | 804 / 811 / 824 / 823 | 748 / 760 / 770 / 767 |
|
||||||
|
| SendMessage 10KB | 916 / 967 / 996 / 987 | 880 / 913 / 965 / 951 |
|
||||||
|
| SendMessage 32KB | 905 / 930 / 948 / 947 | 883 / 904 / 939 / 928 |
|
||||||
|
| SendMessageBatch 10 | 784 / 803 / 827 / 820 | 718 / 746 / 782 / 759 |
|
||||||
|
| ReceiveMessage | 782 / 826 / 869 / 864 | 738 / 748 / 777 / 751 |
|
||||||
|
| DeleteMessage | 783 / 800 / 823 / 814 | 727 / 742 / 757 / 755 |
|
||||||
|
| DeleteMessageBatch 10 | 818 / 845 / 872 / 864 | 742 / 783 / 821 / 810 |
|
||||||
|
| ChangeMessageVisibilityBatch 10 | 806 / 829 / 848 / 841 | 803 / 824 / 838 / 836 |
|
||||||
|
|
||||||
|
## Покрытие
|
||||||
|
|
||||||
|
В тестах проверены:
|
||||||
|
- все 17 SQS-операций;
|
||||||
|
- smoke-сценарии;
|
||||||
|
- batch операции;
|
||||||
|
- queue lifecycle;
|
||||||
|
- tags;
|
||||||
|
- visibility timeout.
|
||||||
|
|
||||||
|
## Throughput
|
||||||
|
|
||||||
|
Тест `SendMessage 1KB`, 5 воркеров по 10 сообщений:
|
||||||
|
|
||||||
|
| Provider | Success | Total Time | Approx. Throughput |
|
||||||
|
|---|---:|---:|---:|
|
||||||
|
| Yandex MQ | 50 / 50 | 9116 ms | ~5 msg/s |
|
||||||
|
| shared-SQS | 50 / 50 | 8580 ms | ~5 msg/s |
|
||||||
|
|
||||||
|
## Вывод
|
||||||
|
|
||||||
|
shared-SQS уже выглядит сильной AWS SQS-compatible реализацией для пользовательских сценариев: latency низкая, batch-операции быстрые, покрытие операций полное.
|
||||||
@@ -1,132 +1,84 @@
|
|||||||
# NGCloud Shared SQS — Multi-Tenant Message Queue Service
|
# shared-SQS — AWS SQS Compatible Message Queue
|
||||||
|
|
||||||
Совместимый с Amazon SQS мультитенантный сервис очередей сообщений.
|
Совместимый с Amazon SQS сервис очередей сообщений с поддержкой изолированных тенантов.
|
||||||
Один кластер — много тенантов, каждый с изолированными очередями и credentials.
|
|
||||||
|
Сервис предназначен для работы через стандартные AWS SDK и AWS CLI: в обычном клиентском коде меняется только endpoint.
|
||||||
|
|
||||||
## Демо-стенд
|
## Демо-стенд
|
||||||
|
|
||||||
| | |
|
| | |
|
||||||
|---|---|
|
|---|---|
|
||||||
| **Web UI** | https://qu.kube5s.ru/ui/ |
|
| Web UI | https://qu.kube5s.ru/ui/ |
|
||||||
| **SQS Endpoint** | `https://qu.kube5s.ru` |
|
| SQS Endpoint | https://qu.kube5s.ru |
|
||||||
| **Access Key** | `SSAK-demo-shared-sqs` |
|
| Region | us-east-1 |
|
||||||
| **Secret Key** | `demo-secret-key-shared-sqs-ngcloud-2026` |
|
| Demo Access Key | SSAK-demo-shared-sqs |
|
||||||
| **Region** | `us-east-1` (любая) |
|
| Demo Secret Key | demo-secret-key-shared-sqs-ngcloud-2026 |
|
||||||
|
|
||||||
Демо-тенант `demo-service` предустановлен с 5 очередями и сообщениями.
|
Demo credentials предназначены для ознакомительного доступа.
|
||||||
Credentials фиксированы — работают после любого рестарта стенда.
|
Для собственных write-сценариев используйте tenant credentials своего окружения.
|
||||||
|
|
||||||
---
|
## Что поддерживается
|
||||||
|
|
||||||
## Быстрый старт
|
shared-SQS покрывает 17 SQS-операций:
|
||||||
|
|
||||||
### Настройка AWS CLI
|
- CreateQueue
|
||||||
|
- DeleteQueue
|
||||||
|
- GetQueueAttributes
|
||||||
|
- GetQueueUrl
|
||||||
|
- ListQueues
|
||||||
|
- PurgeQueue
|
||||||
|
- SetQueueAttributes
|
||||||
|
- TagQueue
|
||||||
|
- UntagQueue
|
||||||
|
- ListQueueTags
|
||||||
|
- SendMessage
|
||||||
|
- SendMessageBatch
|
||||||
|
- ReceiveMessage
|
||||||
|
- DeleteMessage
|
||||||
|
- DeleteMessageBatch
|
||||||
|
- ChangeMessageVisibility
|
||||||
|
- ChangeMessageVisibilityBatch
|
||||||
|
|
||||||
|
## Быстрый старт через AWS CLI
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
export AWS_ACCESS_KEY_ID="SSAK-demo-shared-sqs"
|
export AWS_ACCESS_KEY_ID="YOUR_ACCESS_KEY"
|
||||||
export AWS_SECRET_ACCESS_KEY="demo-secret-key-shared-sqs-ngcloud-2026"
|
export AWS_SECRET_ACCESS_KEY="YOUR_SECRET_KEY"
|
||||||
export AWS_DEFAULT_REGION="us-east-1"
|
export AWS_DEFAULT_REGION="us-east-1"
|
||||||
ENDPOINT="--endpoint-url https://qu.kube5s.ru"
|
ENDPOINT="--endpoint-url https://qu.kube5s.ru"
|
||||||
```
|
```
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## AWS CLI
|
|
||||||
|
|
||||||
Самый простой способ работы — через стандартный AWS CLI.
|
|
||||||
|
|
||||||
### Установка
|
|
||||||
|
|
||||||
Linux / macOS (pip):
|
|
||||||
|
|
||||||
```bash
|
|
||||||
pip install awscli
|
|
||||||
```
|
|
||||||
|
|
||||||
Linux (пакет):
|
|
||||||
|
|
||||||
```bash
|
|
||||||
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o awscliv2.zip
|
|
||||||
unzip awscliv2.zip && sudo ./aws/install
|
|
||||||
```
|
|
||||||
|
|
||||||
macOS (brew):
|
|
||||||
|
|
||||||
```bash
|
|
||||||
brew install awscli
|
|
||||||
```
|
|
||||||
|
|
||||||
Windows: скачайте установщик с [https://aws.amazon.com/cli/](https://aws.amazon.com/cli/)
|
|
||||||
|
|
||||||
Проверка: `aws --version`
|
|
||||||
|
|
||||||
### Создать очередь
|
### Создать очередь
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
aws sqs create-queue --queue-name myqueue $ENDPOINT
|
aws sqs create-queue --queue-name demo-queue $ENDPOINT
|
||||||
```
|
```
|
||||||
|
|
||||||
### Список очередей
|
### Получить URL очереди
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
aws sqs list-queues $ENDPOINT
|
aws sqs get-queue-url --queue-name demo-queue $ENDPOINT
|
||||||
```
|
```
|
||||||
|
|
||||||
### Отправить сообщение
|
### Отправить сообщение
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
aws sqs send-message \
|
QUEUE_URL=$(aws sqs get-queue-url --queue-name demo-queue $ENDPOINT --query QueueUrl --output text)
|
||||||
--queue-url "$(aws sqs get-queue-url --queue-name myqueue $ENDPOINT --query QueueUrl --output text)" \
|
aws sqs send-message --queue-url "$QUEUE_URL" --message-body "Hello from shared-SQS" $ENDPOINT
|
||||||
--message-body "Hello from CLI!" \
|
|
||||||
$ENDPOINT
|
|
||||||
```
|
```
|
||||||
|
|
||||||
### Получить сообщение
|
### Получить сообщение
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
aws sqs receive-message \
|
aws sqs receive-message --queue-url "$QUEUE_URL" --wait-time-seconds 5 $ENDPOINT
|
||||||
--queue-url "$(aws sqs get-queue-url --queue-name myqueue $ENDPOINT --query QueueUrl --output text)" \
|
|
||||||
$ENDPOINT
|
|
||||||
```
|
```
|
||||||
|
|
||||||
### Удалить очередь
|
### Удалить очередь
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
aws sqs delete-queue \
|
aws sqs delete-queue --queue-url "$QUEUE_URL" $ENDPOINT
|
||||||
--queue-url "$(aws sqs get-queue-url --queue-name myqueue $ENDPOINT --query QueueUrl --output text)" \
|
|
||||||
$ENDPOINT
|
|
||||||
```
|
```
|
||||||
|
|
||||||
> **Совет:** `--endpoint-url` — единственное отличие от работы с Amazon SQS.
|
|
||||||
> Весь остальной код без изменений.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## curl
|
|
||||||
|
|
||||||
### Создать очередь
|
|
||||||
|
|
||||||
```bash
|
|
||||||
curl -s -u "SSAK-demo-shared-sqs:demo-secret-key-shared-sqs-ngcloud-2026" \
|
|
||||||
"https://qu.kube5s.ru/?Action=CreateQueue&QueueName=myqueue&Version=2012-11-05"
|
|
||||||
```
|
|
||||||
|
|
||||||
### Отправить сообщение
|
|
||||||
|
|
||||||
```bash
|
|
||||||
curl -s -u "SSAK-demo-shared-sqs:demo-secret-key-shared-sqs-ngcloud-2026" \
|
|
||||||
"https://qu.kube5s.ru/?Action=SendMessage&QueueUrl=https://qu.kube5s.ru/queue/myqueue&MessageBody=HelloWorld&Version=2012-11-05"
|
|
||||||
```
|
|
||||||
|
|
||||||
### Получить сообщение
|
|
||||||
|
|
||||||
```bash
|
|
||||||
curl -s -u "SSAK-demo-shared-sqs:demo-secret-key-shared-sqs-ngcloud-2026" \
|
|
||||||
"https://qu.kube5s.ru/?Action=ReceiveMessage&QueueUrl=https://qu.kube5s.ru/queue/myqueue&Version=2012-11-05"
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Python (boto3)
|
## Python (boto3)
|
||||||
|
|
||||||
```python
|
```python
|
||||||
@@ -136,92 +88,80 @@ sqs = boto3.client(
|
|||||||
"sqs",
|
"sqs",
|
||||||
endpoint_url="https://qu.kube5s.ru",
|
endpoint_url="https://qu.kube5s.ru",
|
||||||
region_name="us-east-1",
|
region_name="us-east-1",
|
||||||
aws_access_key_id="SSAK-demo-shared-sqs",
|
aws_access_key_id="YOUR_ACCESS_KEY",
|
||||||
aws_secret_access_key="demo-secret-key-shared-sqs-ngcloud-2026",
|
aws_secret_access_key="YOUR_SECRET_KEY",
|
||||||
)
|
)
|
||||||
|
|
||||||
# Создать очередь
|
queue = sqs.create_queue(QueueName="demo-queue")
|
||||||
queue = sqs.create_queue(QueueName="myqueue")
|
queue_url = queue["QueueUrl"]
|
||||||
print(queue["QueueUrl"])
|
|
||||||
|
|
||||||
# Отправить сообщение
|
sqs.send_message(QueueUrl=queue_url, MessageBody="Hello from Python")
|
||||||
sqs.send_message(QueueUrl=queue["QueueUrl"], MessageBody="Hello from Python!")
|
messages = sqs.receive_message(QueueUrl=queue_url, WaitTimeSeconds=5)
|
||||||
|
print(messages)
|
||||||
# Получить сообщение
|
|
||||||
msgs = sqs.receive_message(QueueUrl=queue["QueueUrl"])
|
|
||||||
print(msgs["Messages"][0]["Body"])
|
|
||||||
```
|
```
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Node.js (@aws-sdk/client-sqs)
|
## Node.js (@aws-sdk/client-sqs)
|
||||||
|
|
||||||
```javascript
|
```javascript
|
||||||
const { SQSClient, CreateQueueCommand, SendMessageCommand, ReceiveMessageCommand } = require("@aws-sdk/client-sqs");
|
const {
|
||||||
|
SQSClient,
|
||||||
|
CreateQueueCommand,
|
||||||
|
SendMessageCommand,
|
||||||
|
ReceiveMessageCommand,
|
||||||
|
} = require("@aws-sdk/client-sqs");
|
||||||
|
|
||||||
const sqs = new SQSClient({
|
const sqs = new SQSClient({
|
||||||
endpoint: "https://qu.kube5s.ru",
|
endpoint: "https://qu.kube5s.ru",
|
||||||
region: "us-east-1",
|
region: "us-east-1",
|
||||||
credentials: {
|
credentials: {
|
||||||
accessKeyId: "SSAK-demo-shared-sqs",
|
accessKeyId: "YOUR_ACCESS_KEY",
|
||||||
secretAccessKey: "demo-secret-key-shared-sqs-ngcloud-2026",
|
secretAccessKey: "YOUR_SECRET_KEY",
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
const queue = await sqs.send(new CreateQueueCommand({ QueueName: "myqueue" }));
|
const queue = await sqs.send(new CreateQueueCommand({ QueueName: "demo-queue" }));
|
||||||
await sqs.send(new SendMessageCommand({ QueueUrl: queue.QueueUrl, MessageBody: "Hello!" }));
|
await sqs.send(new SendMessageCommand({ QueueUrl: queue.QueueUrl, MessageBody: "Hello" }));
|
||||||
const res = await sqs.send(new ReceiveMessageCommand({ QueueUrl: queue.QueueUrl }));
|
const result = await sqs.send(new ReceiveMessageCommand({ QueueUrl: queue.QueueUrl, WaitTimeSeconds: 5 }));
|
||||||
console.log(res.Messages[0].Body);
|
console.log(result.Messages);
|
||||||
```
|
```
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Тесты
|
## Тесты
|
||||||
|
|
||||||
В репозитории два тестовых скрипта.
|
### quick_test.sh
|
||||||
|
|
||||||
### quick_test.sh — быстрая проверка
|
Короткий smoke test основных операций:
|
||||||
|
|
||||||
Требования: `aws cli`, `bash`
|
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
bash quick_test.sh
|
AWS_ACCESS_KEY_ID=... AWS_SECRET_ACCESS_KEY=... bash quick_test.sh
|
||||||
```
|
```
|
||||||
|
|
||||||
19 тестов: health, создание тенанта, CRUD через AWS CLI, UI API (создание/удаление очереди, send/peek/purge сообщений).
|
Проверяет базовый lifecycle очереди и сообщения:
|
||||||
|
- CreateQueue
|
||||||
|
- ListQueues
|
||||||
|
- GetQueueUrl
|
||||||
|
- SendMessage
|
||||||
|
- ReceiveMessage
|
||||||
|
- DeleteMessage
|
||||||
|
- DeleteQueue
|
||||||
|
|
||||||
### hardcore_test.sh — полный тест (AWS CLI + curl)
|
### hardcore_test.sh
|
||||||
|
|
||||||
Требования: `aws cli`, `curl`, `bash`
|
Расширенный compatibility test:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
bash hardcore_test.sh
|
AWS_ACCESS_KEY_ID=... AWS_SECRET_ACCESS_KEY=... bash hardcore_test.sh
|
||||||
```
|
```
|
||||||
|
|
||||||
28 групп тестов:
|
Покрывает все 17 SQS-операций, включая:
|
||||||
|
- queue attributes
|
||||||
|
- tags
|
||||||
|
- batch операции
|
||||||
|
- visibility timeout
|
||||||
|
- purge
|
||||||
|
- queue lifecycle
|
||||||
|
|
||||||
- Admin API: создание, список, удаление тенантов
|
## Сравнительные тесты
|
||||||
- CRUD через AWS CLI и через curl
|
|
||||||
- Кросс-доставка: CLI отправляет → curl получает (и наоборот)
|
|
||||||
- Изоляция тенантов: тенант A не видит очереди тенанта B
|
|
||||||
- Невалидный ввод: неавторизованный доступ, несуществующие очереди
|
|
||||||
- Спецсимволы: JSON, XML-сущности, Unicode, эмодзи
|
|
||||||
- Batch операции: SendMessageBatch, DeleteMessageBatch
|
|
||||||
- Visibility timeout: сообщение скрыто → снова доступно
|
|
||||||
- Лимиты: максимум очередей на тенанта
|
|
||||||
- Load test: 20 сообщений throughput
|
|
||||||
- Целостность: проверка MD5
|
|
||||||
- Edge cases: длинные имена, большие сообщения, граничные параметры
|
|
||||||
- UI API: создание/удаление очередей, send/peek/purge сообщений, изоляция
|
|
||||||
|
|
||||||
---
|
Краткий пользовательский summary лежит в файле `BENCHMARK-COMPARISON.md`.
|
||||||
|
|
||||||
## Особенности
|
Ключевой вывод: shared-SQS показывает конкурентоспособные результаты относительно Yandex MQ и покрывает полный набор заявленных пользовательских сценариев.
|
||||||
|
|
||||||
- **Полная совместимость с Amazon SQS API** — AWS SDK и CLI работают без изменений, только endpoint меняется
|
|
||||||
- **Мультитенантность** — каждый тенант с изолированными credentials (Access Key / Secret Key) и лимитами
|
|
||||||
- **Изоляция** — тенант видит только свои очереди, чужие недоступны
|
|
||||||
- **Persistence на Redis** — очереди и сообщения сохраняются при перезапуске сервиса (write-through через Redis)
|
|
||||||
- **Web UI** — визуальное управление тенантами и мониторинг очередей
|
|
||||||
- **Admin API** — программное управление тенантами (создание, удаление, просмотр)
|
|
||||||
- **Batch операции** — SendMessageBatch, DeleteMessageBatch для высокой пропускной способности
|
|
||||||
|
|||||||
Regular → Executable
+101
-901
File diff suppressed because it is too large
Load Diff
Regular → Executable
+58
-69
@@ -1,100 +1,89 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
# quick_test.sh — быстрая проверка shared-sqs (6 тестов)
|
# quick_test.sh — public smoke test for shared-SQS
|
||||||
# Требования: aws cli, bash
|
|
||||||
# Запуск: bash quick_test.sh
|
|
||||||
|
|
||||||
set -uo pipefail
|
set -euo pipefail
|
||||||
|
|
||||||
# Конфигурация — можно переопределить через переменные окружения
|
|
||||||
BASE_URL="${BASE_URL:-https://qu.kube5s.ru}"
|
BASE_URL="${BASE_URL:-https://qu.kube5s.ru}"
|
||||||
export AWS_ACCESS_KEY_ID="${AWS_ACCESS_KEY_ID:-SSAK-demo-shared-sqs}"
|
AWS_ACCESS_KEY_ID="${AWS_ACCESS_KEY_ID:-}"
|
||||||
export AWS_SECRET_ACCESS_KEY="${AWS_SECRET_ACCESS_KEY:-demo-secret-key-shared-sqs-ngcloud-2026}"
|
AWS_SECRET_ACCESS_KEY="${AWS_SECRET_ACCESS_KEY:-}"
|
||||||
export AWS_DEFAULT_REGION="${AWS_DEFAULT_REGION:-us-east-1}"
|
AWS_DEFAULT_REGION="${AWS_DEFAULT_REGION:-us-east-1}"
|
||||||
ENDPOINT="--endpoint-url ${BASE_URL}"
|
ENDPOINT="--endpoint-url ${BASE_URL}"
|
||||||
|
|
||||||
QUEUE_NAME="quick-test-$(date +%s)"
|
QUEUE_NAME="quick-test-$(date +%s)"
|
||||||
PASS=0
|
PASS=0
|
||||||
FAIL=0
|
FAIL=0
|
||||||
TOTAL=0
|
|
||||||
|
|
||||||
# check — проверяет что вывод содержит паттерн
|
require_env() {
|
||||||
check() {
|
local name="$1"
|
||||||
local name="$1" output="$2" pattern="$3"
|
if [[ -z "${!name:-}" ]]; then
|
||||||
TOTAL=$((TOTAL + 1))
|
echo "Missing required env: $name"
|
||||||
if echo "$output" | head -20 | grep -qiE "$pattern"; then
|
exit 2
|
||||||
echo " [PASS] $name"
|
|
||||||
PASS=$((PASS + 1))
|
|
||||||
else
|
|
||||||
echo " [FAIL] $name"
|
|
||||||
echo " pattern: $pattern"
|
|
||||||
echo " output: $(echo "$output" | head -3)"
|
|
||||||
FAIL=$((FAIL + 1))
|
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ok() {
|
||||||
|
echo " [PASS] $1"
|
||||||
|
PASS=$((PASS + 1))
|
||||||
|
}
|
||||||
|
|
||||||
|
fail() {
|
||||||
|
echo " [FAIL] $1"
|
||||||
|
FAIL=$((FAIL + 1))
|
||||||
|
}
|
||||||
|
|
||||||
|
check() {
|
||||||
|
local label="$1"
|
||||||
|
local body="$2"
|
||||||
|
local pattern="$3"
|
||||||
|
if echo "$body" | grep -qE "$pattern"; then
|
||||||
|
ok "$label"
|
||||||
|
else
|
||||||
|
fail "$label :: $(echo "$body" | head -3 | tr '\n' ' ')"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
require_env AWS_ACCESS_KEY_ID
|
||||||
|
require_env AWS_SECRET_ACCESS_KEY
|
||||||
|
export AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY AWS_DEFAULT_REGION
|
||||||
|
|
||||||
echo "═══════════════════════════════════════════"
|
echo "═══════════════════════════════════════════"
|
||||||
echo " Shared SQS — Quick Test"
|
echo " shared-SQS Quick Test"
|
||||||
echo " Endpoint: $BASE_URL"
|
echo " Endpoint: $BASE_URL"
|
||||||
echo " Queue: $QUEUE_NAME"
|
echo " Queue: $QUEUE_NAME"
|
||||||
echo "═══════════════════════════════════════════"
|
echo "═══════════════════════════════════════════"
|
||||||
echo ""
|
|
||||||
|
|
||||||
# 1. Создать очередь
|
echo "▶ CreateQueue"
|
||||||
echo "▶ Создание очереди"
|
|
||||||
OUT=$(aws sqs create-queue --queue-name "$QUEUE_NAME" $ENDPOINT 2>&1)
|
OUT=$(aws sqs create-queue --queue-name "$QUEUE_NAME" $ENDPOINT 2>&1)
|
||||||
check "create-queue" "$OUT" "QueueUrl"
|
check "CreateQueue" "$OUT" "QueueUrl"
|
||||||
QUEUE_URL=$(echo "$OUT" | python3 -c "import sys,json; print(json.load(sys.stdin)['QueueUrl'])" 2>/dev/null)
|
QUEUE_URL=$(echo "$OUT" | python3 -c 'import sys,json; print(json.load(sys.stdin)["QueueUrl"])' 2>/dev/null || true)
|
||||||
|
|
||||||
# 2. Список очередей — должна быть наша
|
echo "▶ ListQueues"
|
||||||
echo ""
|
|
||||||
echo "▶ Список очередей"
|
|
||||||
OUT=$(aws sqs list-queues $ENDPOINT 2>&1)
|
OUT=$(aws sqs list-queues $ENDPOINT 2>&1)
|
||||||
check "list-queues contains $QUEUE_NAME" "$OUT" "$QUEUE_NAME"
|
check "ListQueues" "$OUT" "$QUEUE_NAME"
|
||||||
|
|
||||||
# 3. Отправить сообщение
|
echo "▶ GetQueueUrl"
|
||||||
echo ""
|
OUT=$(aws sqs get-queue-url --queue-name "$QUEUE_NAME" $ENDPOINT 2>&1)
|
||||||
echo "▶ Отправка сообщения"
|
check "GetQueueUrl" "$OUT" "QueueUrl"
|
||||||
OUT=$(aws sqs send-message --queue-url "$QUEUE_URL" --message-body "Hello Quick Test!" $ENDPOINT 2>&1)
|
|
||||||
check "send-message" "$OUT" "MessageId"
|
|
||||||
|
|
||||||
# 4. Получить сообщение
|
echo "▶ SendMessage"
|
||||||
echo ""
|
OUT=$(aws sqs send-message --queue-url "$QUEUE_URL" --message-body "Hello Quick Test" $ENDPOINT 2>&1)
|
||||||
echo "▶ Получение сообщения"
|
check "SendMessage" "$OUT" "MessageId"
|
||||||
|
|
||||||
|
echo "▶ ReceiveMessage"
|
||||||
OUT=$(aws sqs receive-message --queue-url "$QUEUE_URL" --wait-time-seconds 5 $ENDPOINT 2>&1)
|
OUT=$(aws sqs receive-message --queue-url "$QUEUE_URL" --wait-time-seconds 5 $ENDPOINT 2>&1)
|
||||||
check "receive-message" "$OUT" "Hello Quick Test"
|
check "ReceiveMessage" "$OUT" "Hello Quick Test"
|
||||||
RECEIPT=$(echo "$OUT" | python3 -c "import sys,json; print(json.load(sys.stdin)['Messages'][0]['ReceiptHandle'])" 2>/dev/null)
|
RECEIPT=$(echo "$OUT" | python3 -c 'import sys,json; msgs=json.load(sys.stdin).get("Messages", []); print(msgs[0]["ReceiptHandle"] if msgs else "")' 2>/dev/null || true)
|
||||||
|
|
||||||
# 5. Удалить сообщение (confirm delivery)
|
echo "▶ DeleteMessage"
|
||||||
echo ""
|
|
||||||
echo "▶ Удаление сообщения"
|
|
||||||
if [[ -n "$RECEIPT" ]]; then
|
if [[ -n "$RECEIPT" ]]; then
|
||||||
OUT=$(aws sqs delete-message --queue-url "$QUEUE_URL" --receipt-handle "$RECEIPT" $ENDPOINT 2>&1)
|
aws sqs delete-message --queue-url "$QUEUE_URL" --receipt-handle "$RECEIPT" $ENDPOINT >/dev/null 2>&1 && ok "DeleteMessage" || fail "DeleteMessage"
|
||||||
# delete-message returns empty on success
|
|
||||||
if [[ -z "$OUT" || "$OUT" == "" ]]; then
|
|
||||||
TOTAL=$((TOTAL + 1)); PASS=$((PASS + 1))
|
|
||||||
echo " [PASS] delete-message"
|
|
||||||
else
|
|
||||||
check "delete-message" "$OUT" "^$"
|
|
||||||
fi
|
|
||||||
else
|
else
|
||||||
TOTAL=$((TOTAL + 1)); FAIL=$((FAIL + 1))
|
fail "DeleteMessage (no receipt handle)"
|
||||||
echo " [FAIL] delete-message — no receipt handle"
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# 6. Удалить очередь
|
echo "▶ DeleteQueue"
|
||||||
echo ""
|
aws sqs delete-queue --queue-url "$QUEUE_URL" $ENDPOINT >/dev/null 2>&1 && ok "DeleteQueue" || fail "DeleteQueue"
|
||||||
echo "▶ Удаление очереди"
|
|
||||||
OUT=$(aws sqs delete-queue --queue-url "$QUEUE_URL" $ENDPOINT 2>&1)
|
|
||||||
if [[ -z "$OUT" || "$OUT" == "" ]]; then
|
|
||||||
TOTAL=$((TOTAL + 1)); PASS=$((PASS + 1))
|
|
||||||
echo " [PASS] delete-queue"
|
|
||||||
else
|
|
||||||
check "delete-queue" "$OUT" "^$"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Итог
|
|
||||||
echo ""
|
|
||||||
echo "═══════════════════════════════════════════"
|
echo "═══════════════════════════════════════════"
|
||||||
echo " ИТОГО: $PASS/$TOTAL PASS, $FAIL FAIL"
|
echo " RESULT: PASS=$PASS FAIL=$FAIL"
|
||||||
echo "═══════════════════════════════════════════"
|
echo "═══════════════════════════════════════════"
|
||||||
[[ $FAIL -eq 0 ]] && exit 0 || exit 1
|
[[ $FAIL -eq 0 ]]
|
||||||
|
|||||||
Reference in New Issue
Block a user