2023.10.10

AWS SQSのFIFOキューを検証してみる

はじめに

こんにちは。グループ研究開発本部 次世代システム研究室のK.X.Dです。
AWS SQSのFIFOキューについて、特殊機能を検証してみます。
検証目的は同時に高スループットリクエストの時にも、FIFOキューはちゃんと順序保証できることを証明します。

1.やりたいこと

  1. AWS SQSのFIFOキュー設定
  2. AWS SDK実行環境設定
  3. FIFOキュー機能を実検証

2.環境構築

2-1.AWS SQSのFIFOキュー設定

+ キュータイプ:FIFO
+ メッセージ受信待機時間:20秒(ロングポーリング)
+ コンテンツに基づく重複排除:ON(ONにしないと、メッセージ送信の際にMessageDeduplicationIdが必須)

2-2.AWS SDK実行環境設定

今回は、AWS SDKをインストールCakephp環境で実験してみようと思います。

  • Dockerfile
FROM php:7.3-apache

COPY php.ini /usr/local/etc/php/

RUN apt-get update \
    && apt-get install -y unzip libicu-dev \
    && docker-php-ext-install intl \
    && docker-php-ext-install pdo_mysql \
    && a2enmod rewrite \
    && apt-get clean \
    && rm -fr /var/lib/apt/lists/*

WORKDIR /var/www/html
  • docker-compose
version: "3.7"
volumes:
  db-store:
    driver: local
services:
    myapp:
        build: ./docker/php
        platform: linux/x86_64
        ports:
        - "8888:80"
        tty: true
        stdin_open: true
        volumes:
            - ./src:/var/www/html
        depends_on:
            - db
    phpmyadmin:
        container_name: 'phpmyadmin'
        image: phpmyadmin/phpmyadmin
        ports:
            - '8889:80'
        depends_on:
            - db
        environment:
            - PMA_HOST=db
            - PMA_USER=user
            - PMA_PASSWORD=secret
    db:
        image: mysql:5.7
        platform: 'linux/amd64'
        volumes:
            - ./docker/mysql/conf.d:/etc/mysql/conf.d
            - db-store:/var/lib/mysql
        ports:
            - '8887:3306'
        environment:
            MYSQL_DATABASE: sampledb
            MYSQL_USER: user
            MYSQL_PASSWORD: secret
            MYSQL_ROOT_PASSWORD: secret
            TZ: "Asia/Tokyo"

DB接続必要がないですが、Cakephp環境構築揃えるためにDB Containerを用意しておきました。

  • 環境インストール:
// Docker Container起動
docker compose up -d

// Docker Container内に、Composerインストール(https://getcomposer.org/download/)

php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php -r "if (hash_file('sha384', 'composer-setup.php') === 'e21205b207c3ff031906575712edab6f13eb0b361f2085f1f1237b7126d785e826a450292b6cfd1d64d92e6563bbde02') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
php composer-setup.php
php -r "unlink('composer-setup.php');"


// Cakephp Install
cd /var/www/html && composer self-update && composer create-project --prefer-dist cakephp/app:^3.8 .

// AWS SDK Install
composer require aws/aws-sdk-php
  • AWS SDKの認証情報設定:

今回検証のために、AWSアクセスポータルを利用して、一時的のシクレートトークンを取得します。
参照:https://docs.aws.amazon.com/ja_jp/signin/latest/userguide/iam-id-center-sign-in-tutorial.html

AWS Access Key ID、AWS Secret Access Key、AWS Session Tokenのそれぞれは、Docker Container内の/root/.aws/credentialsに保存します。

[default]
aws_access_key_id = {AWS Access Key ID}
aws_secret_access_key = {AWS Secret Access Key}
aws_session_token = {AWS Session Token}

3.FIFOキュー機能を実検証

3-1.SQS Producerを作成する

/src/ShellファルダーにSqsProducerShell.phpを作成する

<?php
namespace App\Shell;

use Cake\Console\Shell;
use Aws\Sqs\SqsClient;
use Aws\Credentials\CredentialProvider;

/**
 * Sqs shell command.
 */
class SqsProducer extends Shell
{
    /**
     * Manage the available sub-commands along with their arguments and help
     *
     * @see http://book.cakephp.org/3.0/en/console-and-shells.html#configuring-options-and-generating-help
     *
     * @return \Cake\Console\ConsoleOptionParser
     */
    public function getOptionParser()
    {
        $parser = parent::getOptionParser();

        $parser
        ->addOption('bodyContent', [
            'help' => __('Body content')
        ]);

        return $parser;
    }

    /**
     * main() method.
     *
     * @return bool|int|null Success or error code.
     */
    public function main()
    {
        $bodyContent = isset($this->params['bodyContent']) ? $this->params['bodyContent'] : "SQS Test Body";
        $provider = CredentialProvider::defaultProvider();

        $sqsClient = new SqsClient([
            'profile' => 'default',
            'region' => 'ap-northeast-1',
            'version' => '2012-11-05',
            'credentials' => $provider
        ]);
        // for from 1 to 100
        for ($i = 1; $i <= 100; $i++) {
            $params = [
                'MessageAttributes' => [
                    "Index" => [
                        'DataType' => "String",
                        'StringValue' => strval($i)
                    ],
                    "ExecuteTime" => [
                        'DataType' => "String",
                        'StringValue' => strval(microtime(true))
                    ]
                ],
                'MessageGroupId' => 'messageGroup',
                'MessageBody' => $bodyContent . $i,
                'QueueUrl' => 'https://sqs.ap-northeast-1.amazonaws.com/153216492591/first_queue.fifo'
            ];
    
            $result = $sqsClient->sendMessage($params);

            var_dump($result);
        }
    }
}

3-2.SQS Consumerを作成する

/src/ShellファルダーにSqsConsumerShell.phpを作成する

<?php
namespace App\Shell;

use Cake\Console\Shell;
use Aws\Sqs\SqsClient;
use Aws\Credentials\CredentialProvider;
use Aws\Exception\AwsException;

/**
 * Sqs shell command.
 */
class SqsConsumerShell extends Shell
{
    /**
     * Manage the available sub-commands along with their arguments and help
     *
     * @see http://book.cakephp.org/3.0/en/console-and-shells.html#configuring-options-and-generating-help
     *
     * @return \Cake\Console\ConsoleOptionParser
     */
    public function getOptionParser()
    {
        $parser = parent::getOptionParser();

        return $parser;
    }

    /**
     * main() method.
     *
     * @return bool|int|null Success or error code.
     */
    public function main()
    {
        $provider = CredentialProvider::defaultProvider();

        $sqsClient = new SqsClient([
            'profile' => 'default',
            'region' => 'ap-northeast-1',
            'version' => '2012-11-05',
            'credentials' => $provider
        ]);

        $queueUrl = ''; // SQS Queue URL

        try {
            $result = $sqsClient->receiveMessage(array(
                'AttributeNames' => ['SentTimestamp'],
                'MaxNumberOfMessages' => 10,
                'MessageAttributeNames' => ['All', 'MessageDeduplicationId'],
                'QueueUrl' => $queueUrl,
                'WaitTimeSeconds' => 20,
            ));

            $messages = $result->get('Messages');

            if (empty($messages)) {
                $this->log("No messages in queue. \n", "debug");
                return;
            }
            // for messages
            foreach ($messages as $message) {
                var_dump($message);
                $this->log($message, "debug");
                $result = $sqsClient->deleteMessage([
                    'QueueUrl' => $queueUrl, // REQUIRED
                    'ReceiptHandle' => $message['ReceiptHandle'] // REQUIRED
                ]);
            }
        } catch (AwsException $e) {
            // output error message if fails
            error_log($e->getMessage());
        }
    }
}

3-3.検証実行:

  • 2ターミナルで下記のProducerコマンドを同時に実行して、キューにメッセージ送信します。
./bin/cake sqs_producer --bodyContent="Body content 1 "

./bin/cake sqs_producer --bodyContent="Body content 2 "
  • Consumerコマンドを実行して、メッセージ受信ログでキューにあるメッセージ順序確認する
./bin/cake sqs_consumer

ログは長いで、一部のみ貼り付けます。

2023-10-05 19:22:57 Debug: Array
(
[MessageId] => 346d7bd8-cc71-43d2-bc36-b1d88d998168
[ReceiptHandle] => AQEBUA8+gJQ3S0DpYNxyOvjlXRBMhojORh2tXQILMd0QczBHKgYCmLo5NGelHdZ7chG7k2yqucRbloD1urVNLk6+Xp/dIy4afVdhMfBA+JyEGQAfU/XlVtJdodLtUrlOireR+2XACw6KRDN3JxlGTyzG+xtaYwSM1xS1NV7evR9lwHQRPSbGdYYHhqLxh2p82avIdICAkrZfJuXR2Pn5v0ShVRDsdZW7kxKUtgZvIABJ7wG2hchwiNUPrxtqlVCPRtjV4zdasdv6kbq7brS77P0BZEur5X7LPS1wbGZZ++5c4fY=
[MD5OfBody] => a85b2c1147e79d5e3b36797aec5fcc47
[Body] => Body content 1 1
[Attributes] => Array
(
[SentTimestamp] => 1696533763080
)

[MD5OfMessageAttributes] => f909680bcac5546f490fb734a59d4bd2
[MessageAttributes] => Array
(
[ExecuteTime] => Array
(
[StringValue] => 1696533762.71
[DataType] => String
)

[Index] => Array
(
[StringValue] => 1
[DataType] => String
)

)

)

2023-10-05 19:22:57 Debug: Array
(
[MessageId] => c1e4d56b-ff21-40d6-afc8-ce611497cdd9
[ReceiptHandle] => AQEBxJ/i8s4E0uopZj38x037seRf6HggOnqajTTwEIuayFVWZjYNoAf3bYhJDDaVB/roUWIep9kih0Jg7yNCztahAvZVSefIN/A7nnyh6g4Ga7ngiE9/nqo3joHzPwctadSPNk/EH1vAD5KOVq4xe7n4zRePQEm0xIxGSgp76xk8qhduIKi1+WzNi0qPIOF7m4LzA4sVnmwxQWhqWo4NMZ5UBYlA/kPgvkLE0y1Csgo4afwFTLDRzo5hQURPuVpkZkR7o+yS/4/L6pwaPmAQUmiHPtysTcaOyXJyscG30J6V7VI=
[MD5OfBody] => 4bfe216ac6a51e0820d90e91c1b531e3
[Body] => Body content 1 2
[Attributes] => Array
(
[SentTimestamp] => 1696533763131
)

[MD5OfMessageAttributes] => 85e4fe9603996bfe0c3ddd5e25aabc0d
[MessageAttributes] => Array
(
[ExecuteTime] => Array
(
[StringValue] => 1696533763.1148
[DataType] => String
)

[Index] => Array
(
[StringValue] => 2
[DataType] => String
)

)

)

2023-10-05 19:22:57 Debug: Array
(
[MessageId] => e79c1381-d833-419b-a3ec-480da782aba8
[ReceiptHandle] => AQEBRe7upmxZBFq7jkeTDBAuE9wLjf/3ND1Jakj8zjId/i5Pgc6Ah0Bie6HhNATBR6wyCl2wrUjYilombVzp94CxCHQmYv/AhEDG1DupgRjEijb6LRmfkO5QQW26WwEJGPOkZicJBcQajHW3LAWCegIijFZcfSP6/mhonwtNVUN3VM4OXrWieYPcyzKJQ3E+3G67UO1Ouf2wNakgkQm/pO145j4KGr5lTPOvO06mb2Zm99h7gRKP0HzB6I1uHIlJpfdfTSSbwAwOngniasTiW2QEfoMvuk80SdXnu5Rxi165z0E=
[MD5OfBody] => a4c0ec963c2330a0a389df6e35e2a0bd
[Body] => Body content 1 3
[Attributes] => Array
(
[SentTimestamp] => 1696533763165
)

[MD5OfMessageAttributes] => b4e4c1ac1ec0bab6a5cc4ff9b2fde41c
[MessageAttributes] => Array
(
[ExecuteTime] => Array
(
[StringValue] => 1696533763.1486
[DataType] => String
)

[Index] => Array
(
[StringValue] => 3
[DataType] => String
)

)

)

2023-10-05 19:22:57 Debug: Array
(
[MessageId] => d53b1a9c-c525-48e5-9a79-817b0404db0e
[ReceiptHandle] => AQEBzkDfdFX9CzbMt/KHDfTk+m0La+YKBMClQwdcTnvxWEcvJnm/UN6EXJyakG7w+hADQzYcO/Wg6fBTClLu4/bGuuqFoOCAcjiOi44vaphskgrBcyb3e3VsnmqrMFWmB13VHsgJnTbc8O0HXqnjSyar+hk307HZBRnh6Xs8rOu4Buq5U+ksfwkWPnGzTOTK09LbAec3wv0SpvmthvhqUkFBbraxhCgJm4OceXaMGmYhx7yaa6qr+2kA9ttFcQkE4yHwimTAmaKk1CdaYM4GlZNDYelimq/uVwSM5I12Q/sXj+U=
[MD5OfBody] => 4b912bea7f9c13530399f04e1efe8b3f
[Body] => Body content 1 4
[Attributes] => Array
(
[SentTimestamp] => 1696533763194
)

[MD5OfMessageAttributes] => 2565fe5ac872328528caf479aa6b6f3f
[MessageAttributes] => Array
(
[ExecuteTime] => Array
(
[StringValue] => 1696533763.1807
[DataType] => String
)

[Index] => Array
(
[StringValue] => 4
[DataType] => String
)

)

)

2023-10-05 19:22:57 Debug: Array
(
[MessageId] => 0ad1d829-6024-4d95-8533-c4ab0d64951d
[ReceiptHandle] => AQEBOTGJD1X69sEyyi2hqKNZoCO4+0KiJTbvTDentwZzZC6JJPpgDEkBpmaSvBghZM+GYTozGeIzF80l4sDvQVPK50yfKwdZFh3DMJPlozzIN6mftGzfnSdezO2AYPLF6hTiCdS4ZhRNJgYKQnnvqfFt6az1mW+Boun9zY1pXAF58qLH8ZfnhTcij4M90ZCjmUM81wL5K0yDko41OFZaGr+jlaA7DqPZm9PA5dhmwFtwVUBB5vIfBsRaCEt1bHoLZVkq8MWNmSAVKT52/xoHIFk33Y0iliF6NAcSuH1jg26e8WQ=
[MD5OfBody] => 65e3b284ce0d3fe8596f9ac75fdfcdd9
[Body] => Body content 1 5
[Attributes] => Array
(
[SentTimestamp] => 1696533763228
)

[MD5OfMessageAttributes] => 7d36dfdb9ed6722a7fb483116dff76fa
[MessageAttributes] => Array
(
[ExecuteTime] => Array
(
[StringValue] => 1696533763.2109
[DataType] => String
)

[Index] => Array
(
[StringValue] => 5
[DataType] => String
)

)

)

2023-10-05 19:22:57 Debug: Array
(
[MessageId] => 0510e6f0-931a-48f5-b763-be9d130e734a
[ReceiptHandle] => AQEBNw6wJ5uk7ds94V9GYl2FAVEyO+aRh1LlAM02v8wRTjOhvH9oKwXMnSbp7YVWO9yiwECWVrd/l+/puci7j6XEQkPZWJNehOEQBhibZai+ql6PfpuH/uzhsNEgepcHCfYJmP2HXjwmAMecTAHijjVcWk6K4jyi7UC4PNqqHbEvZCFca5dHxnqYwHrbxlQMMzTwSGX7gOfMrjwPdJjbLf6gW5hg3H9s9UNAxaUUQYj+LMMqN0aPLQTLhpJrjG1RNQwcXlD/yGOZSFSxfBxhlcbPHi7nQ1rvMsoGrwWHLkBJPn4=
[MD5OfBody] => 61fbeb57c3f5b932e3dbb3ae448f5152
[Body] => Body content 1 6
[Attributes] => Array
(
[SentTimestamp] => 1696533763258
)

[MD5OfMessageAttributes] => 58f15aff22bbf6e50f92cedcd9c9ebab
[MessageAttributes] => Array
(
[ExecuteTime] => Array
(
[StringValue] => 1696533763.2435
[DataType] => String
)

[Index] => Array
(
[StringValue] => 6
[DataType] => String
)

)

)

2023-10-05 19:22:57 Debug: Array
(
[MessageId] => 3ba18033-9188-4573-862e-36d66e89f706
[ReceiptHandle] => AQEBAznwWxVrnaC8ESLr6ePw9z34l3Y/cfbziPpGaMsrqn32ZnvDYo02H6CAKlbJHT+NoQLr0t1weYatfzWWhd6wkq1tyorOOr+d2C92tDcvVLDryFdHf/WKOd1uGVUjEoRrPN6iRWa4aackYzVxh+fLT5EerNntRChMARXA8h6MdWTxEBs3a1d+GcEuHoaQY2EQGOpk/hQMw4L/hTgx2WClLucaOXgzVPETUxYUBvSbA7vlJjZ6ZqEEb7Wdsz05M62nyEUuntccJ+NK5mb8xWpjSrCXmmHQAD7xWdYWFY3jLog=
[MD5OfBody] => 19cbb515233ac37c2d97212b5c82e436
[Body] => Body content 1 7
[Attributes] => Array
(
[SentTimestamp] => 1696533763290
)

[MD5OfMessageAttributes] => 5c7bc99bc8d9f20184522f6738eebf82
[MessageAttributes] => Array
(
[ExecuteTime] => Array
(
[StringValue] => 1696533763.2766
[DataType] => String
)

[Index] => Array
(
[StringValue] => 7
[DataType] => String
)

)

)

2023-10-05 19:22:57 Debug: Array
(
[MessageId] => ceca441a-9f77-486d-8bac-ead2f82f458a
[ReceiptHandle] => AQEB15S/FBCOufWBKHAR7FOFKn4qceNzTTfsA+J7Jes5MnNBVfUsc9tk8XN0VU8NEnx34gjHjk5QaoP3TqokdqWL4riYIpqWQ5eLElOY4YxAIvNtHdZC6zAev0XI+JgVXkIfNfeMEHQzitSN+rStWmtikWh/NY+K5WnCac6k9q2gwz5dtDi5Wuk9BgCHWCzHYXN+Rsf1HUSY0EMjeg0n5hAul2GZICBloD5c5Cfc970kcNHHL7Bt110/2jDT0F0CwZOC3CrN705UPETINF4yyFRKYkLUo7FM8xMdQp8dhPiFJ18=
[MD5OfBody] => 07371d4faec6725f9c74e11e20aeca7b
[Body] => Body content 1 8
[Attributes] => Array
(
[SentTimestamp] => 1696533763322
)

[MD5OfMessageAttributes] => 46f703d5096efd2848fb3327405e6c44
[MessageAttributes] => Array
(
[ExecuteTime] => Array
(
[StringValue] => 1696533763.309
[DataType] => String
)

[Index] => Array
(
[StringValue] => 8
[DataType] => String
)

)

)

2023-10-05 19:22:57 Debug: Array
(
[MessageId] => 9cd299b5-43ae-4b92-905e-044a589c1182
[ReceiptHandle] => AQEBBdCBXaNWnVSwoNC2/eqUC8Qe+SSF4pCGo3cpQrfE7QWGoR/4CYTaPE65sBwR7gdUcT1dozMciy3LGnyr+QNXtmBSks1h5dsMtT64rFeb5HPP9JwB3S1aYwVlvik84SATGtxW5PTruixyX+4vPymN3NfuMb1NfRHJT3dzDKQHamauiZ/AlxjWSoG2FTzssRnBmPdoixBc8MJZ5BvDaJS0wuSouGTDmwPt3hJ5i0QOweEMnux29BkxwT3ziPXzuRUsPiVfO6tRsGyCEvp3K71B9xY4CzN+5/WD5SDFrCSzE8c=
[MD5OfBody] => 4572d674d4f470acee48125f3d2244bd
[Body] => Body content 1 9
[Attributes] => Array
(
[SentTimestamp] => 1696533763359
)

[MD5OfMessageAttributes] => a636aa52ae8043e41310654974cf57a1
[MessageAttributes] => Array
(
[ExecuteTime] => Array
(
[StringValue] => 1696533763.3439
[DataType] => String
)

[Index] => Array
(
[StringValue] => 9
[DataType] => String
)

)

)

2023-10-05 19:22:57 Debug: Array
(
[MessageId] => ee1fe79b-5906-4553-b0a4-27f34c54fbad
[ReceiptHandle] => AQEBdUAI0s4hvZszFYBJ18M06rONHmOcfKxE1hMCT25Lzgujfd8iaNYYR+WczhFWIXLG9BP0dbHlRQA8D6g6kQcPnHNab6NXVuOgvy4GRDUhmU2zxUSWg2p+iqTOnVOr4FpiZkdj9fnVTzzdyBEQAP9LGYdyWrFa1Qt18FYy1oX9Z4MBCXrZPs67MkD5p0MPHA7I8K9tTmxrqq+3ES1JGx3S0OvjiaHMaFGyWYis6MLe+Zce9wINT7RVMvzwJADOpAh46qG3oU0V7b/Yt7+9+GAI8vx69dtbgYguh0ICMcMqE3Y=
[MD5OfBody] => 6a979d801199a013ce32e8bea5c779e7
[Body] => Body content 1 10
[Attributes] => Array
(
[SentTimestamp] => 1696533763391
)

[MD5OfMessageAttributes] => 422eb634cc57ab8f95407144a8e90919
[MessageAttributes] => Array
(
[ExecuteTime] => Array
(
[StringValue] => 1696533763.3762
[DataType] => String
)

[Index] => Array
(
[StringValue] => 10
[DataType] => String
)

)

)

2023-10-05 19:22:59 Debug: Array
(
[MessageId] => 273ab9c8-1294-41af-986a-91920ed46e2b
[ReceiptHandle] => AQEBCrfFlJff5GZCPhHADXTJWWQqNh/AHhfrqrIqEjEv5FL2uhIxmqJvqK04qDC9aOR6SdNIQUEnJdv/t26xtwqg5UvcZuzx/BwAEyWhNI1JC9W2jwAJ4W7ZXTsmqAWPQru6Vr2Xrxk/7GbZNLqLLUeoUzfu/k9pFRngtkgsMAj7uZYgXeEp1acRgys23uSwxWbGCKWtD4q/YcMZ0fmg/RlAVjOVZQ5iNQelMJJqiNTaTkPzwMvZOrw4QHCQzrlAAjFm4vbUOz03iyaKHPFOtsEEsg2Hmk79lHRf+SXyZSTbEWY=
[MD5OfBody] => daf8a09f0d40e75045b574e367e824c6
[Body] => Body content 1 11
[Attributes] => Array
(
[SentTimestamp] => 1696533763420
)

[MD5OfMessageAttributes] => ed10f37b435354585926a6957a4e59b9
[MessageAttributes] => Array
(
[ExecuteTime] => Array
(
[StringValue] => 1696533763.4058
[DataType] => String
)

[Index] => Array
(
[StringValue] => 11
[DataType] => String
)

)

)

2023-10-05 19:22:59 Debug: Array
(
[MessageId] => d1de5c19-ffe5-4c3f-aa9e-50f9110cf530
[ReceiptHandle] => AQEBQYY1urksTSq2024g0lbDgHgpAVBpVxpJLBfM0Z3wnv1/rUJI3dLLMX3gqtL34zGKLNVhNMr1JRiYca0SBW2RLaUhwrr1bDMjBwmcGTvBdi5H/3A53XBFo/3UUvtG3Cq6GT6+TZZxIJyf1Empu2RWMd+WSMynQGX0L0A9Au0WhKnwFd83TJSi/rhP7bmTsooZkv3+lZ8IW8TMG95YMW9wQcnP9Ll8YfibJPKju85iNJkzxTaypO4gsLqYcyc7P4oRi2j9TdkbuLo/bivEKlRSFBQDjn3AsMC3fyUyyZ8p/bw=
[MD5OfBody] => 649857cec199e9ad483000d8a68c4754
[Body] => Body content 1 12
[Attributes] => Array
(
[SentTimestamp] => 1696533763452
)

[MD5OfMessageAttributes] => 736f294b29991f61dad8d81a650b4749
[MessageAttributes] => Array
(
[ExecuteTime] => Array
(
[StringValue] => 1696533763.4376
[DataType] => String
)

[Index] => Array
(
[StringValue] => 12
[DataType] => String
)

)

)

2023-10-05 19:22:59 Debug: Array
(
[MessageId] => c086e0ae-0947-454d-bb6c-6f76bcbc2eb7
[ReceiptHandle] => AQEBMd+P4aWhTWEPelsfQ+OqVlzNKwnfTPhR0WtvCGsnQ/tEPkEO2Gz7FstkA0nqRc4ooBHfs3HG0zBhrft6XXSgvr71GIaf6mtarfsbZvwMiaSvwUT7XtvAX+KSDZUwWboxcTRBOZdV+2kK5VE7Zqh7UwJxBJp+ECHDTigyLgQqhm6NEgmdFf7eUSaPViMw0RbTEYOpbCT6SSGTeHYWK7cCBuBpqc7Dk0s6oMlIKwWMKoMDc1G8a71G6tdjWtaLHMMNYoXpORttPurO6YWnq5qvk3KhHqHd7FQXo5znQjt9UAI=
[MD5OfBody] => 22c57cd6a0224bbbd192c6ef7c62b7d2
[Body] => Body content 1 13
[Attributes] => Array
(
[SentTimestamp] => 1696533763483
)

[MD5OfMessageAttributes] => a2c6b94533ad91409c5b71f58fa3a808
[MessageAttributes] => Array
(
[ExecuteTime] => Array
(
[StringValue] => 1696533763.4708
[DataType] => String
)

[Index] => Array
(
[StringValue] => 13
[DataType] => String
)

)

)

2023-10-05 19:22:59 Debug: Array
(
[MessageId] => 2aec2e68-72ad-4695-ad52-33f4804e444d
[ReceiptHandle] => AQEBdoB4ABcbR/yCKKfWqpsa5waUGdztoGUAdJ5bTIOBSeooqEURt+3ODOHPKB5suejhpRdJuI2WITcLS7Tb48P6AklQVc61LJFTByUvhY/R470b88LRx7ikfT8VKL6qMnmDz9+9vsd4G3ZA3+mtF7uU8RKTOg40xNxkiNHTsiE+YWeUiWSyUyh4+cyTXwDMPAPXVPXS+xgcpau0iBs6hAqmAbU5/7wVVCpDJkopDfFJQoejYBhAGqQy9yhG4NTJo5f2dFchLx30U+shztWzOa48z409LEEJbJuGJEMoNZza91Y=
[MD5OfBody] => 891240a76c2c2d24ee6714424707025a
[Body] => Body content 2 1
[Attributes] => Array
(
[SentTimestamp] => 1696533763505
)

[MD5OfMessageAttributes] => f63baf798913bf0c311f52c2f15d1ec6
[MessageAttributes] => Array
(
[ExecuteTime] => Array
(
[StringValue] => 1696533763.2659
[DataType] => String
)

[Index] => Array
(
[StringValue] => 1
[DataType] => String
)

)

)

2023-10-05 19:22:59 Debug: Array
(
[MessageId] => ebd850c6-9ba3-483d-b243-573d7bf9f942
[ReceiptHandle] => AQEBYIyvGYEg+P+ibKtvgnuliQ55uQzDBdvnskNMcjMfe1EEWFK9OTTTlDbrAUOs9UlmWT6khqxxpI557kV+EJYLp1HT1Yivl58k/+nEhEXYXee5KZQmPtTuGeUxtNa9OGDVTSKx1uclNgrYL4eCsUZMJDy9pAlmsl7pYcDjN1v9154kxkoHCyBhOJW5bGP6RdAj5KLejqh4Fq+Gsw2N8LSofwVzJfYo24xdg7vOViRkVBR20y39OMDn4WEn6OSD8wVyIodWxaYIrpp8TigkmT5pQl8RNMiFAHivwuVStiUACjs=
[MD5OfBody] => 0bbf4fe66c53e94cdeac5226f5420861
[Body] => Body content 1 14
[Attributes] => Array
(
[SentTimestamp] => 1696533763514
)

[MD5OfMessageAttributes] => f5ef2436d8271256ce5fc807ab36ede9
[MessageAttributes] => Array
(
[ExecuteTime] => Array
(
[StringValue] => 1696533763.5002
[DataType] => String
)

[Index] => Array
(
[StringValue] => 14
[DataType] => String
)

)

)

2023-10-05 19:22:59 Debug: Array
(
[MessageId] => fcc3792a-9bb8-4676-9e8e-a24fd1842835
[ReceiptHandle] => AQEBybnggsIqgemnBPZeBRpwnYt1czKTeKcnpV8y3qqH00Nv95fd260IuNRtySOqhrF+iUl6+DVetpgN5TNRoh3AqbRTQB+BBX0SxdwSI+v+1ovn+XwQ2lU9wpzq+i26RBGqrhDaoIiCW1ZbHcKDMZqIGf1/+XJHfq6zHLha426PUkobZ9vjUCNI6SWWN8MNL1nXqaT9bgclcGP01pofHjl+ZzXyqOWLY1Nly8qmwsfIT/bgAUPwWrnxoCp6NMGraovKdfSWT1dxiyjmnMJmBBDy6BnNeGx9eih/RKZKEkeKRpk=
[MD5OfBody] => 410c89235e33d9d7ee2afe53c408a57d
[Body] => Body content 1 15
[Attributes] => Array
(
[SentTimestamp] => 1696533763547
)

[MD5OfMessageAttributes] => 4efade37ad80efd63d565d2327082113
[MessageAttributes] => Array
(
[ExecuteTime] => Array
(
[StringValue] => 1696533763.5322
[DataType] => String
)

[Index] => Array
(
[StringValue] => 15
[DataType] => String
)

)

)

2023-10-05 19:22:59 Debug: Array
(
[MessageId] => bcf3d3f3-2f58-4bc9-8a2f-ad0c85109e73
[ReceiptHandle] => AQEBkuTA8p6y8jyu8pEaHuDn3Ua5PrmxPtXUqRmQrG4APVYFHnDjx522SD49T2X+TXlsILSqccdR2ziWIhho1snqUDbhVPbNSc8SSrsoYmeDvuLKgAWl/vLIs99c1yXJGUH2PyELL/rGuPsipBvw2pOuDDjX9Uhv1kGzYo3IDiRKyl6i15w5zjTNwKd6wQucZmWagsmjxnZXxXEppWqkxxe/bDg8Ha+peU5r7aD6+FfF6fvcFIP2WDeSQGlnO52RNQr+ndNrNClC32GMgtkcKBZzriF4uXzCL6dPvBlEhHvfUFs=
[MD5OfBody] => c1371e3c29f5d3f7c2c6e5d39085c4df
[Body] => Body content 2 2
[Attributes] => Array
(
[SentTimestamp] => 1696533763554
)

[MD5OfMessageAttributes] => 81f1e294a3fa6ed63a4ef0854e394ca9
[MessageAttributes] => Array
(
[ExecuteTime] => Array
(
[StringValue] => 1696533763.54
[DataType] => String
)

[Index] => Array
(
[StringValue] => 2
[DataType] => String
)

)

)

2023-10-05 19:22:59 Debug: Array
(
[MessageId] => 84445f4e-ee13-44e3-8669-1d56be00f648
[ReceiptHandle] => AQEBWV1CePE/ic5CFwJum1+/ANiTLrJRePv/hX+gtMcuTexoE8nFmxAHpKPf05ZU0bno8eNyrC6kRNFHdDNe3lxtexC86IAvHwYwmQkd1HYYqiKtF5HCJyAR6Dgr2yflNKzWT+9CNazETcImLNR/N6p4Bxbq0k5JW4/otNuaEVq2UKeIKlCVyTp9iqZEGCKDriWTZb9aLoX4zD7HbGt4jOsk6B1k7rL2Ic32vEsOh/vaoeQRKg0N2rgO+hobum17KzLuL4gm6S5x3o7XxknghcIUHvKnT+SY51MiRyFcV7rXVN4=
[MD5OfBody] => a419c37f25a016a1f9e98065e1c6161a
[Body] => Body content 1 16
[Attributes] => Array
(
[SentTimestamp] => 1696533763583
)

[MD5OfMessageAttributes] => 5f91155afe46da81e99ee0af81cb9606
[MessageAttributes] => Array
(
[ExecuteTime] => Array
(
[StringValue] => 1696533763.5657
[DataType] => String
)

[Index] => Array
(
[StringValue] => 16
[DataType] => String
)

)

)

2023-10-05 19:22:59 Debug: Array
(
[MessageId] => 85b8a54a-72c2-477c-a05b-e0dd68c5990f
[ReceiptHandle] => AQEBeo39xLdHGo8PtCWvCO8SP+148/Bx9VZfIr+6E3MMZoZcGEnHQi1OVOJPRNPdwEdY667kXNQ/ZubwM8V5XCEq+X6jJLb03zbgDGr7OeucuxH9J0mXCAwlVajphaqxyvOHCFLQkHeZ/X2x2vdHYIL8nrHPX6KHAXvqB4xSLOtPX5RdaC8giFCLUiz/jTaD9M1sc0Ji/FFp9K36Hi3gR2OOExd89e+XIOvuvFJiPRl3AKUx1Q404NqTmCmg65e6XemSCltwRUN5Zgar+SUsBY/+iaxZ8KyWZyq1taAYk6tA9fI=
[MD5OfBody] => dc165028cae3cbecdb61db402128fff0
[Body] => Body content 2 3
[Attributes] => Array
(
[SentTimestamp] => 1696533763593
)

[MD5OfMessageAttributes] => abb1b3ea1fc0b99e4dffc3d40374eeb4
[MessageAttributes] => Array
(
[ExecuteTime] => Array
(
[StringValue] => 1696533763.5733
[DataType] => String
)

[Index] => Array
(
[StringValue] => 3
[DataType] => String
)

)

)

2023-10-05 19:22:59 Debug: Array
(
[MessageId] => dffa5ae0-6f8a-4b28-a433-a6b03cd83e16
[ReceiptHandle] => AQEB1BMX3uxJaR8SI+Uv319SVSfU/j1JbclpBMVZtpFDTMrSoRi3UXaE22FASPl2T5mBM1+PsIK8LLx0SgVZ8c/Zks6ii9MkvG1yPpmM4ZpPkPcfedY6GSsszlACim3zn3RaDL6/WPf4ZYzS5x/UPl1A4wJXYbewg1wPhvzmU7NYVWXQzZiocpItKQql7OIWCfucyIbZFI5LNmGIBB1nrijFEk1Kx/BeyLKyLE3LNYZd7sFjwKLsUTvNyEWyJrcOuYi65YdKvudL25ucBYOW1KWlzbjCgoCA+5hNHsVQasWcaoE=
[MD5OfBody] => 3263d9370eed91a6b200b6d83c73e5e5
[Body] => Body content 1 17
[Attributes] => Array
(
[SentTimestamp] => 1696533763615
)

[MD5OfMessageAttributes] => 37df8f11fe3ef936e98f5e32b812a8d6
[MessageAttributes] => Array
(
[ExecuteTime] => Array
(
[StringValue] => 1696533763.5998
[DataType] => String
)

[Index] => Array
(
[StringValue] => 17
[DataType] => String
)

)

)

2023-10-05 19:23:00 Debug: Array
(
[MessageId] => f30fc025-db32-4225-b5fc-5dcc54bd15c0
[ReceiptHandle] => AQEBjncIorzRH11Y98Clro6AftcEyC4Uy+LyZZSIbj2qk3kCFAp4eQNKsENkSP+uFSjEfW8Qylqvzk5VC2CuXLB/1FEaic+noEWe0PZAQxzdOWhzxn16mQD2cpMw0OEIGdq5e88m2Z5P09gFf8S9OY2v4DGpq0inrJfpZKu48aSnlg9IFA4lvBh86vMEptvvzhHbBiCS5SOIFuL0w4TvvfXkurZOExD5yKOOxxIUkeqHK6k2iCq4kkUwekQ5gX59XTOJzxi5w0PAmHfmq6Qq8OkBGs+W0JtOlkzbN9LSyICZnrM=
[MD5OfBody] => 497c93e2b04e2c9263f0bb9fbe2af8b4
[Body] => Body content 2 4
[Attributes] => Array
(
[SentTimestamp] => 1696533763624
)

[MD5OfMessageAttributes] => 5a474b64490a88ffa7a714c9c936f20d
[MessageAttributes] => Array
(
[ExecuteTime] => Array
(
[StringValue] => 1696533763.6084
[DataType] => String
)

[Index] => Array
(
[StringValue] => 4
[DataType] => String
)

)

)

2023-10-05 19:23:00 Debug: Array
(
[MessageId] => 5c40c6af-a8be-4346-9dd2-b2bed097e2b8
[ReceiptHandle] => AQEBKmI+zmtxBmAqis3PEY/CNp44LwMwqeL1vsn/jA1nwG+Qta5NecCYZOn+JUSrinCpb87fnC2VEZpTya7MQQ6vIPPGclxK+ObQnneb0t6oPF8/BNhO/sZQ+SJuUSi0nKgy83s6NKZP1eCF3VS9dOddCi+mrvYk2kNULy9M+atSD2+6b5a2N1WW9G5xyR9oTCTRXMzJtmRmTOvNu7DEpIbwKQfEr2DMQi+ubJ3bBousFYvZFFs1PJ7zEEmpUeigAtzM3I7Ur393NEIOlxScKzwe/HiitQ/iKe2QpDZ87KizfQ4=
[MD5OfBody] => c51bab901520d35eb03ae3d9192ec971
[Body] => Body content 1 18
[Attributes] => Array
(
[SentTimestamp] => 1696533763648
)

[MD5OfMessageAttributes] => d54feb149295befbf7c32258baf0c0ec
[MessageAttributes] => Array
(
[ExecuteTime] => Array
(
[StringValue] => 1696533763.6345
[DataType] => String
)

[Index] => Array
(
[StringValue] => 18
[DataType] => String
)

)

)

ExecuteTimeはメッセージ送信時刻のMilisecondで記録しています。そちらを確認すると、キューから取ってくるメッセージがメッセージ送信順序担保することを確認できます。

4.まとめ

現代のシステムは、負荷分散ためによくMessageQueueの仕組みで活かしてます。
今回はキューサービスの一つで、AWS SQSのFIFOキューを設定、検証するにあたって、AWS SQSのFIFOキューの理解が深くなっております。
今後、チャンスがあれば、負荷分散実装に活用していきたいと思います。

宣伝

次世代システム研究室では、最新のテクノロジーを調査・検証しながらインターネットのいろんなアプリケーションの開発を行うアーキテクトを募集しています。募集職種一覧 からご応募をお待ちしています。

  • Twitter
  • Facebook
  • はてなブックマークに追加

グループ研究開発本部の最新情報をTwitterで配信中です。ぜひフォローください。

 
  • AI研究開発室
  • 大阪研究開発グループ

関連記事