일단 SQS를 터질때 까지 밀어넣어 보기로 했다.
목표 메시지수는 100만건.
100만건의 메시지를 100초안에 SQS에 넣는게 목표다. TPS 10000 이라는 소리다.
목표를 이루기위해선 첫번째 SQS의 TPS는 3000이다. 초당 3000의 메시지를 넣을수 있다.
먼저 큐를 4개를 만들었다. 목표수치에 가려면 TPS가 10000은 나와야한다.
그렇다면 큐를 병렬로 줄세운다 4개의 큐를 만든다.
이제 넣어봤다.
import boto3 import json import uuid from concurrent.futures import ThreadPoolExecutor import random import string sqs = boto3.client('sqs') queue_urls = [ 'linuxer-sqs-1', 'linuxer-sqs-2', 'linuxer-sqs-3', 'linuxer-sqs-4' ] def random_string(length): return ''.join(random.choices(string.ascii_letters + string.digits, k=length)) def create_dummy_data(): return { 'id': str(uuid.uuid4()), 'data': f"host-{random_string(5)}-count", 'padding': random_string(10 * 1024 - 100) # 10KB 크기의 더미 데이터를 생성 } def send_message_batch(queue_url, messages): entries = [] for idx, message in enumerate(messages): entries.append({ 'Id': str(idx), 'MessageBody': json.dumps(message) }) response = sqs.send_message_batch( QueueUrl=queue_url, Entries=entries ) return response def generate_and_send_dummy_data(num_messages=100000, batch_size=10, num_threads=10): with ThreadPoolExecutor(max_workers=num_threads) as executor: for _ in range(num_messages // (batch_size * num_threads * len(queue_urls))): batch_futures = [] for queue_url in queue_urls: messages = [create_dummy_data() for _ in range(batch_size)] future = executor.submit(send_message_batch, queue_url, messages) batch_futures.append(future) for future in batch_futures: future.result() if __name__ == '__main__': generate_and_send_dummy_data() 대충 이코드는 TPS 100 정도이다.
...