#!/bin/bash # Updated: 2026-04-12 05:40 UTC # payload_latency_probe.sh — узкий замер SendMessage latency для payload 10KB и 32KB. set -euo pipefail # ysqs выполняет aws sqs для Yandex MQ. ysqs() { AWS_ACCESS_KEY_ID="$Y_AK" AWS_SECRET_ACCESS_KEY="$Y_SK" \ AWS_DEFAULT_REGION="$Y_REGION" \ aws --endpoint-url "$Y_EP" --output json sqs "$@" >/dev/null 2>&1 } # osqs выполняет aws sqs для shared-sqs. osqs() { AWS_ACCESS_KEY_ID="$O_AK" AWS_SECRET_ACCESS_KEY="$O_SK" \ AWS_DEFAULT_REGION="$O_REGION" \ aws --endpoint-url "$O_EP" --output json sqs "$@" >/dev/null 2>&1 } # ms_now возвращает текущее время в миллисекундах. ms_now() { date +%s%3N } # calc_stats считает min/avg/max/p95 по файлу latency. calc_stats() { local file_path="$1" sort -n "$file_path" | awk ' { values[NR] = $1; total += $1 } END { p95_index = int(NR * 0.95) if (p95_index < 1) p95_index = 1 printf "%d %d %d %d\n", values[1], int(total / NR), values[NR], values[p95_index] }' } # cleanup удаляет временные объекты после замера. cleanup() { set +e if [[ -n "${Y_QURL:-}" ]]; then AWS_ACCESS_KEY_ID="$Y_AK" AWS_SECRET_ACCESS_KEY="$Y_SK" AWS_DEFAULT_REGION="$Y_REGION" \ aws --endpoint-url "$Y_EP" --output json sqs delete-queue --queue-url "$Y_QURL" >/dev/null 2>&1 || true fi if [[ -n "${O_QURL:-}" ]]; then AWS_ACCESS_KEY_ID="$O_AK" AWS_SECRET_ACCESS_KEY="$O_SK" AWS_DEFAULT_REGION="$O_REGION" \ aws --endpoint-url "$O_EP" --output json sqs delete-queue --queue-url "$O_QURL" >/dev/null 2>&1 || true fi rm -rf "$TMPDIR" } trap cleanup EXIT Y_AK="YCAJEQDz_Eg_i4C4M7TAen2fd" Y_SK="YCMDfD8OKFK51knPyydwQOYts7Q81_3YBhv4sd_j" Y_REGION="ru-central1" Y_EP="https://message-queue.api.cloud.yandex.net" O_AK="SSAK-ed0b0c64dcc135adad9e11be" O_SK="f917c133e4ad74cf37c8e3ba29d74a39f42f117a202bd672436c92fdb6b6f3dc" O_REGION="us-east-1" O_EP="https://qu.kube5s.ru" O_TID="t-e0ce25e83be94c58" ITERATIONS=7 TMPDIR=$(mktemp -d /tmp/payload_latency_probe_XXXXX) TS=$(date +%s) head -c 10240 /dev/urandom | base64 | head -c 10240 > "$TMPDIR/payload_10k.txt" head -c 32768 /dev/urandom | base64 | head -c 32768 > "$TMPDIR/payload_32k.txt" Y_QNAME="payload-probe-y-${TS}" O_QNAME="payload-probe-o-${TS}" Y_CREATE_RAW=$(AWS_ACCESS_KEY_ID="$Y_AK" AWS_SECRET_ACCESS_KEY="$Y_SK" AWS_DEFAULT_REGION="$Y_REGION" aws --endpoint-url "$Y_EP" --output json sqs create-queue --queue-name "$Y_QNAME") Y_QURL=$(echo "$Y_CREATE_RAW" | python3 -c 'import json,sys; print(json.load(sys.stdin)["QueueUrl"])') osqs create-queue --queue-name "$O_QNAME" O_QURL="${O_EP}/${O_TID}/${O_QNAME}" run_probe() { local provider_name="$1" local queue_url="$2" local payload_file="$3" local result_file="$4" local runner="$5" : > "$result_file" for _ in $(seq 1 "$ITERATIONS"); do local started_at started_at=$(ms_now) "$runner" send-message --queue-url "$queue_url" --message-body "file://$payload_file" echo $(( $(ms_now) - started_at )) >> "$result_file" done local stats_line stats_line=$(calc_stats "$result_file") echo "${provider_name}|$(echo "$stats_line" | awk '{print $1"|"$2"|"$3"|"$4}')" } echo "payload_kb|provider|min|avg|max|p95" run_probe "yandex" "$Y_QURL" "$TMPDIR/payload_10k.txt" "$TMPDIR/y_10k.txt" ysqs | awk -F'|' '{print "10|"$0}' run_probe "shared-sqs" "$O_QURL" "$TMPDIR/payload_10k.txt" "$TMPDIR/o_10k.txt" osqs | awk -F'|' '{print "10|"$0}' run_probe "yandex" "$Y_QURL" "$TMPDIR/payload_32k.txt" "$TMPDIR/y_32k.txt" ysqs | awk -F'|' '{print "32|"$0}' run_probe "shared-sqs" "$O_QURL" "$TMPDIR/payload_32k.txt" "$TMPDIR/o_32k.txt" osqs | awk -F'|' '{print "32|"$0}'