@zyuzin

Как реализовать быстрый обмен сообщения между скриптами на Python через RabbitMQ?

Друзья, всем привет.

Необходима помощь знатоков Python и RabbitMQ.

> Что имеем: три сервера, два из них в яндекс облаке, на одном rabbitmq, на другом скрипт на питоне, третий находится в другом облаке и на нем тоже скрипт на питоне. Скрипты крутятся как сервисы.

> Проблема: Обмен сообщениями происходит со скорость в 1-2 сек, что как мне кажется очень медленно и что это можно ускорить.

RabbitMQ стоит дефолтный на Ubuntu.
Пример функций, отправки/получения сообщений:

connection = None
channel_pool = None
 
async def get_connection():
    global connection
 
    if connection is None or connection.is_closed:
        connection = await aio_pika.connect_robust(f"amqp://admin:pas123456@{mq_ip}/")
 
    return connection
 
 
async def get_channel():
    global channel_pool
 
    if channel_pool is None or channel_pool.is_closed:
        connection = await get_connection()
        channel_pool = await connection.channel()
 
    return channel_pool
 
 
async def publish(consumer, data=None, action=None, event=None):
    global service_uuid, service_name
 
    sender_name = service_name + '.' + service_uuid
 
    arr = {'sender': sender_name, 'consumer': consumer, 'message': {'data': data, 'action': action, 'event': event}}
    body = json.dumps(arr)
 
    await set_log(body)
 
    channel = await get_channel()
 
    exchange = await channel.declare_exchange(
        "direct", auto_delete=True
    )
 
    queue = await channel.declare_queue(
        consumer, auto_delete=True
    )
 
    await queue.bind(exchange, consumer)
 
    body = bytes(body, "utf-8")
 
    result = await exchange.publish(
        aio_pika.Message(body, content_type="text/plain"),
        consumer,
    )
 
 
async def consuming():
    global service_name, demons_server_ip
 
    connection = await get_connection()
 
    async with connection:
        queue_name = service_name + '.' + service_uuid
 
        channel: aio_pika.abc.AbstractChannel = await connection.channel()
 
        queue: aio_pika.abc.AbstractQueue = await channel.declare_queue(queue_name, auto_delete=True)
 
        async with queue.iterator() as queue_iter:
            async for message in queue_iter:
                data = message.body
                asyncio.create_task(callback(data))
                await message.ack()


Возможно ли обмен сообщениями ускорить?
  • Вопрос задан
  • 208 просмотров
Пригласить эксперта
Ответы на вопрос 1
AshBlade
@AshBlade
Просто хочу быть счастливым
Во-первых, сетевые задержки - у вас несколько серверов
Во-вторых, сам python немного медленный (может сервер не самый мощный, в нормальных серверах не должно быть проблемой)
В-третьих, прдьюсер постоянно создает новые обменники и очереди
channel = await get_channel()
 
    exchange = await channel.declare_exchange(
        "direct", auto_delete=True
    )
 
    queue = await channel.declare_queue(
        consumer, auto_delete=True
    )

В-четвертых, нужно время на подтверждение обработки запроса (await message.ack())
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы