Junior — Middle
84
¿Cómo garantizar una colocación confiable de la solicitud desde la base de datos en la cola de mensajes?
Empresas donde se preguntó
Respuesta de la IA
sobes.tech AI
Чтобы надежно поставить заявку из базы данных в очередь сообщений, нужно обеспечить атомарность операции и обработку с гарантией доставки. Обычно это достигается с помощью транзакций и подтверждений.
Примерный подход:
- В базе данных создается запись заявки с флагом "неотправлено".
- В транзакции:
- Создается запись заявки.
- Отправляется сообщение в очередь (например, RabbitMQ, Kafka).
- Если отправка успешна, обновляется флаг заявки на "отправлено".
- Если отправка сообщения не удалась, транзакция откатывается, чтобы заявка не осталась в базе без сообщения.
Если очередь поддерживает подтверждения (ack), нужно дождаться подтверждения доставки сообщения.
Пример на Python с использованием библиотеки pika для RabbitMQ и SQLAlchemy:
from sqlalchemy import create_engine, Column, Integer, String, Boolean
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base
import pika
Base = declarative_base()
class Request(Base):
__tablename__ = 'requests'
id = Column(Integer, primary_key=True)
data = Column(String)
sent = Column(Boolean, default=False)
engine = create_engine('sqlite:///requests.db')
Session = sessionmaker(bind=engine)
connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel()
channel.queue_declare(queue='task_queue', durable=True)
session = Session()
try:
new_request = Request(data='some data')
session.add(new_request)
session.flush() # получить id
message = new_request.data
channel.basic_publish(
exchange='',
routing_key='task_queue',
body=message,
properties=pika.BasicProperties(delivery_mode=2) # persistent message
)
new_request.sent = True
session.commit()
except Exception as e:
session.rollback()
print('Ошибка при отправке заявки:', e)
finally:
session.close()
connection.close()
Таким образом, либо заявка и сообщение создаются вместе, либо не создаются вовсе, что обеспечивает надежность.