176 lines
5.2 KiB
Markdown
176 lines
5.2 KiB
Markdown
# NGCloud SQS — Managed Message Queue Service
|
||
|
||
Совместимый с Amazon SQS сервис очередей сообщений на базе [ElasticMQ](https://github.com/softwaremill/elasticmq).
|
||
|
||
## Демо-стенд
|
||
|
||
| | |
|
||
|---|---|
|
||
| **Web UI** | https://sqs.kube5s.ru/ |
|
||
| **SQS Endpoint** | `https://sqs.kube5s.ru/sqs/test001` |
|
||
| **Access Key** | `SQSAK-test001-ae4dc8` |
|
||
| **Secret Key** | `J8mElXq8Nwww8iFRtGJCm8KfxM9XSTluTqS2A67xsEE` |
|
||
| **Region** | `us-east-1` (любая) |
|
||
|
||
---
|
||
|
||
## AWS CLI
|
||
|
||
Самый простой способ работы — через стандартный AWS CLI.
|
||
|
||
```bash
|
||
export AWS_ACCESS_KEY_ID="SQSAK-test001-ae4dc8"
|
||
export AWS_SECRET_ACCESS_KEY="J8mElXq8Nwww8iFRtGJCm8KfxM9XSTluTqS2A67xsEE"
|
||
export AWS_DEFAULT_REGION="us-east-1"
|
||
ENDPOINT="--endpoint-url https://sqs.kube5s.ru/sqs/test001"
|
||
```
|
||
|
||
### Создать очередь
|
||
```bash
|
||
aws sqs create-queue --queue-name myqueue $ENDPOINT
|
||
```
|
||
|
||
### Список очередей
|
||
```bash
|
||
aws sqs list-queues $ENDPOINT
|
||
```
|
||
|
||
### Отправить сообщение
|
||
```bash
|
||
aws sqs send-message \
|
||
--queue-url https://sqs.kube5s.ru:443/sqs/test001/test001/myqueue \
|
||
--message-body "Hello from CLI!" \
|
||
$ENDPOINT
|
||
```
|
||
|
||
### Получить сообщение
|
||
```bash
|
||
aws sqs receive-message \
|
||
--queue-url https://sqs.kube5s.ru:443/sqs/test001/test001/myqueue \
|
||
$ENDPOINT
|
||
```
|
||
|
||
### Удалить очередь
|
||
```bash
|
||
aws sqs delete-queue \
|
||
--queue-url https://sqs.kube5s.ru:443/sqs/test001/test001/myqueue \
|
||
$ENDPOINT
|
||
```
|
||
|
||
> **Совет:** `--endpoint-url` — единственное отличие от работы с Amazon SQS. Весь остальной код без изменений.
|
||
|
||
---
|
||
|
||
## curl
|
||
|
||
### Создать очередь
|
||
```bash
|
||
curl -s -u "SQSAK-test001-ae4dc8:J8mElXq8Nwww8iFRtGJCm8KfxM9XSTluTqS2A67xsEE" \
|
||
"https://sqs.kube5s.ru/sqs/test001?Action=CreateQueue&QueueName=myqueue&Version=2012-11-05"
|
||
```
|
||
|
||
### Отправить сообщение
|
||
```bash
|
||
curl -s -u "SQSAK-test001-ae4dc8:J8mElXq8Nwww8iFRtGJCm8KfxM9XSTluTqS2A67xsEE" \
|
||
"https://sqs.kube5s.ru/sqs/test001?Action=SendMessage&QueueUrl=https://sqs.kube5s.ru/sqs/test001/test001/myqueue&MessageBody=HelloWorld&Version=2012-11-05"
|
||
```
|
||
|
||
### Получить сообщение
|
||
```bash
|
||
curl -s -u "SQSAK-test001-ae4dc8:J8mElXq8Nwww8iFRtGJCm8KfxM9XSTluTqS2A67xsEE" \
|
||
"https://sqs.kube5s.ru/sqs/test001?Action=ReceiveMessage&QueueUrl=https://sqs.kube5s.ru/sqs/test001/test001/myqueue&Version=2012-11-05"
|
||
```
|
||
|
||
---
|
||
|
||
## Python (boto3)
|
||
|
||
```python
|
||
import boto3
|
||
|
||
sqs = boto3.client(
|
||
"sqs",
|
||
endpoint_url="https://sqs.kube5s.ru/sqs/test001",
|
||
region_name="us-east-1",
|
||
aws_access_key_id="SQSAK-test001-ae4dc8",
|
||
aws_secret_access_key="J8mElXq8Nwww8iFRtGJCm8KfxM9XSTluTqS2A67xsEE",
|
||
)
|
||
|
||
# Создать очередь
|
||
queue = sqs.create_queue(QueueName="myqueue")
|
||
print(queue["QueueUrl"])
|
||
|
||
# Отправить сообщение
|
||
sqs.send_message(QueueUrl=queue["QueueUrl"], MessageBody="Hello from Python!")
|
||
|
||
# Получить сообщение
|
||
msgs = sqs.receive_message(QueueUrl=queue["QueueUrl"])
|
||
print(msgs["Messages"][0]["Body"])
|
||
```
|
||
|
||
---
|
||
|
||
## Node.js (@aws-sdk/client-sqs)
|
||
|
||
```js
|
||
const { SQSClient, CreateQueueCommand, SendMessageCommand, ReceiveMessageCommand } = require("@aws-sdk/client-sqs");
|
||
|
||
const sqs = new SQSClient({
|
||
endpoint: "https://sqs.kube5s.ru/sqs/test001",
|
||
region: "us-east-1",
|
||
credentials: {
|
||
accessKeyId: "SQSAK-test001-ae4dc8",
|
||
secretAccessKey: "J8mElXq8Nwww8iFRtGJCm8KfxM9XSTluTqS2A67xsEE",
|
||
},
|
||
});
|
||
|
||
const queue = await sqs.send(new CreateQueueCommand({ QueueName: "myqueue" }));
|
||
await sqs.send(new SendMessageCommand({ QueueUrl: queue.QueueUrl, MessageBody: "Hello!" }));
|
||
const res = await sqs.send(new ReceiveMessageCommand({ QueueUrl: queue.QueueUrl }));
|
||
console.log(res.Messages[0].Body);
|
||
```
|
||
|
||
---
|
||
|
||
## Проверка работоспособности
|
||
|
||
В репозитории есть `quick_test.sh` — скрипт для быстрой проверки сервиса.
|
||
|
||
**Требования:** `curl`, `bash`.
|
||
|
||
```bash
|
||
bash quick_test.sh
|
||
```
|
||
|
||
Что проверяет:
|
||
1. Создание очереди
|
||
2. Очередь видна в списке
|
||
3. Отправка сообщения
|
||
4. Получение сообщения (тело совпадает)
|
||
5. Удаление очереди
|
||
6. Очередь исчезла из списка
|
||
|
||
Ожидаемый вывод:
|
||
```
|
||
=== SQS Quick Test ===
|
||
|
||
✅ Создание очереди
|
||
✅ Очередь в списке
|
||
✅ Отправка сообщения
|
||
✅ Получение сообщения
|
||
✅ Удаление очереди
|
||
✅ Очередь удалена из списка
|
||
|
||
Результат: 6 OK / 0 FAIL
|
||
Всё работает!
|
||
```
|
||
|
||
---
|
||
|
||
## Особенности
|
||
|
||
- **Полная совместимость с Amazon SQS API** — AWS SDK и CLI работают без изменений, только endpoint меняется
|
||
- **Физическая изоляция** — каждый тенант получает отдельный pod, namespace, диск
|
||
- **Persistence** — данные сохраняются при перезапуске
|
||
- **Web UI** — визуальное управление очередями
|