Как отправить несколько пакетных сообщений из списка в очередь SQS, используя Boto3 и Python - PullRequest
0 голосов
/ 06 июня 2019

У меня есть список целых чисел (integerList), которые я хотел бы передать в очередь SQS, где каждое сообщение в очереди является целым числом из списка.

Я могу сделать это одно сообщение за раз с помощью команды send_message(), код которой приведен ниже.

import boto3

sqsResource = boto3.resource('sqs')

def write_sqs(integerList):
    queue = sqsResource.get_queue_by_name(QueueName=NAMEOFQUEUEHERE)
    for i in integerList:
        response = queue.send_message(MessageBody=str(i),
                                      MessageGroupId='TESTING')

Однако я хотел бы ускорить функцию и отправлять сообщения партиями.В настоящее время AWS SQS позволяет пакетировать до 10 сообщений одновременно с помощью команды send_messages(), но я не уверен, как создать атрибут Entries= для пакетной отправки.Я разбиваю integerList на меньшие списки из 10, используя chunks = [integerList[x:x+10] for x in range(0, len(integerList), 10)], но следующие шаги неясны.

Ответы [ 2 ]

0 голосов
/ 09 июня 2019

Основываясь на ответе @liorko и некоторых методах проб и ошибок, похоже, это работает и намного быстрее, чем метод 1 на 1, который я использовал ранее.

import boto3

sqsResource = boto3.resource('sqs')

def write_sqs(integerList):
    queue = sqsResource.get_queue_by_name(QueueName=NAMEOFQUEUEHERE)
    maxBatchSize = 10 #current maximum allowed
    chunks = [integerList[x:x+maxBatchSize] for x in range(0, len(integerList), maxBatchSize)]
    for chunk in chunks:
        entries = []
        for x in chunk:
            entry = {'Id': str(x), 
                     'MessageBody': str(x), 
                     'MessageGroupId': 'ANYTHINGYOUWANT'}
            entries.append(entry)
        response = queue.send_messages(Entries=entries)

0 голосов
/ 06 июня 2019

Согласно документации Entries представляет собой список сообщений.
Для каждой записи в Entries тип параметров подробно указан по ссылке.

import boto3

sqsResource = boto3.resource('sqs')

def write_sqs(integerList):
    queue = sqsResource.get_queue_by_name(QueueName=NAMEOFQUEUEHERE)
    entries = []

    for i in integerList:
        entry =  {
            'Id': 'id%s' % str(integerList[i]),
            'MessageBody': str(integerList[i])
            }
        entries.append(entry)

    response = queue.send_messages(entries)
...