следует использовать один или несколько клиентов sqs для получения и удаления сообщений? - PullRequest
0 голосов
/ 30 октября 2019

Я хотел бы создать две функции receive_message и delete_message из одной очереди sqs. Должен ли я использовать тот же клиент sqs для получения и удаления, или я могу использовать разные? Есть ли какие-либо накладные расходы на создание нового клиента sqs, который имеет значение с точки зрения скорости и производительности?

Я провел два теста.

Тест 1 - использование разных клиентов sqs в функции приема и удаления сообщений. и я записал прошедшее время.

Тест 2 - это использование тех же sqs-клиентов для получения и удаления, а также я записал прошедшее время

test1:

def receive_delete_message():
    """Receive message from SQS"""
    sqs = boto3.client("sqs")
    queue_url = "my sqs url"
    response = sqs.receive_message(
        QueueUrl=queue_url,
        AttributeNames=[
            'SentTimestamp'
        ],
        MaxNumberOfMessages=10,  # [1, 10] default is 1, 10 is desired
        MessageAttributeNames=[
            'All'
        ],
        VisibilityTimeout=1,  # default is 30sec
        WaitTimeSeconds=20  # [0, 20]. short poll if 0, otherwise long poll
    )
    if "Messages" not in response:  # empty sqs queue
        print("empty queue")
        return
    messages = response["Messages"]
    for i, message in enumerate(messages):
        receipt_handle = message['ReceiptHandle']
        print("this is message {}, {}".format(i+1, message["Body"]))
        delete_message(receipt_handle)

def delete_message(receipt_handle):
    sqs2 = boto3.client("sqs")
    queue_url = "my sqs url"
    sqs2.delete_message(
        QueueUrl=queue_url,
        ReceiptHandle=receipt_handle
    )
    print("message deleted")

start = time.time()
receive_delete_message()
print(time.time() - start)

test2:

sqs = boto3.client("sqs")
queue_url = "my sqs url"


def receive_delete_message():
    """Receive message from SQS"""
    response = sqs.receive_message(
        QueueUrl=queue_url,
        AttributeNames=[
            'SentTimestamp'
        ],
        MaxNumberOfMessages=10,  # [1, 10] default is 1, 10 is desired
        MessageAttributeNames=[
            'All'
        ],
        VisibilityTimeout=1,  # default is 30sec
        WaitTimeSeconds=20  # [0, 20]. short poll if 0, otherwise long poll
    )
    if "Messages" not in response:  # empty sqs queue
        print("empty queue")
        return
    messages = response["Messages"]
    for i, message in enumerate(messages):
        receipt_handle = message['ReceiptHandle']
        print("this is message {}, {}".format(i+1, message["Body"]))
        delete_message(receipt_handle)


def delete_message(receipt_handle):
    sqs.delete_message(
        QueueUrl=queue_url,
        ReceiptHandle=receipt_handle
    )
    print("message deleted")


start = time.time()
receive_delete_message()
print(time.time() - start)

результат теста 1:

this is message 1, message1000
message deleted
this is message 2, message1002
message deleted
this is message 3, message1003
message deleted
this is message 4, message1004
message deleted
this is message 5, message1007
message deleted
this is message 6, message1008
message deleted
this is message 7, message1018
message deleted
this is message 8, message1025
message deleted
this is message 9, message1034
message deleted
this is message 10, message1036
message deleted
1.526839017868042

результат теста 2

this is message 1, message1002
message deleted
this is message 2, message1013
message deleted
this is message 3, message1017
message deleted
this is message 4, message1028
message deleted
this is message 5, message1029
message deleted
this is message 6, message1044
message deleted
this is message 7, message1047
message deleted
this is message 8, message1005
message deleted
this is message 9, message1006
message deleted
this is message 10, message1015
message deleted
0.5138881206512451

Ответы [ 2 ]

0 голосов
/ 31 октября 2019

В основном вы создаете второй объект, который имеет те же права доступа, что и первый. Учетные данные совпадают.

Если вы рассматриваете возможность удаления сообщения от клиента (возможно, 2 лямбда), а не от получателя, вы ДОВЕРЯЕТЕ, что получатель получателя ВСЕГДА преуспеет и удалит сообщение. Что произойдет, если потребитель потерпит неудачу и вы удалите сообщение из очереди?

Я также второй, что говорит Джармод. Увидеть разницу от 1 до ~ 1 секунды не является значимым показателем производительности. В целом, один потребитель Lambda, который читает из очереди, хорош для небольшого варианта использования. Если вы действительно ищете что-то готовое для производства, я бы посмотрел что-то вроде: https://docs.aws.amazon.com/autoscaling/ec2/userguide/as-using-sqs-queue.html

0 голосов
/ 30 октября 2019

На мой взгляд, вам нужно будет выполнить этот тест сотни раз, чтобы получить значимые данные. Основными причинами использования нескольких клиентов является то, что вы хотите настроить таргетинг на несколько регионов AWS или использовать несколько наборов учетных данных AWS. В этом случае я бы просто использовал один клиент.

...