Junior — Middle
87
Wie kann eine zuverlässige Platzierung der Anfrage aus der Datenbank in die Nachrichtenwarteschlange sichergestellt werden?
Unternehmen wurden gefragt
Antwort von AI
sobes.tech KI
Чтобы надежно поставить заявку из базы данных в очередь сообщений, нужно обеспечить атомарность операции и обработку с гарантией доставки. Обычно это достигается с помощью транзакций и подтверждений.
Примерный подход:
- В базе данных создается запись заявки с флагом "неотправлено".
- В транзакции:
- Создается запись заявки.
- Отправляется сообщение в очередь (например, 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()
Таким образом, либо заявка и сообщение создаются вместе, либо не создаются вовсе, что обеспечивает надежность.