提交或回滚后不将消息发布到RabbitMQ
我在向RabbitMQ发布消息时遇到问题。我们的应用程序必须在事务层工作 但是,我不理解一种情况:如果我首先启动事务并提交它,那么接下来的所有消息都不会发布到RabbitMQ提交或回滚后不将消息发布到RabbitMQ,rabbitmq,amqp,Rabbitmq,Amqp,我在向RabbitMQ发布消息时遇到问题。我们的应用程序必须在事务层工作 但是,我不理解一种情况:如果我首先启动事务并提交它,那么接下来的所有消息都不会发布到RabbitMQ $connection = new \AMQPConnection([ 'host' => 'rabbitmq', 'port' => 5672, 'login' => 'guest', 'password' => 'guest', ]); $
$connection = new \AMQPConnection([
'host' => 'rabbitmq',
'port' => 5672,
'login' => 'guest',
'password' => 'guest',
]);
$connection->connect();
$channel = new \AMQPChannel($connection);
$exchange = new \AMQPExchange($channel);
$exchange->setName('some_test');
$exchange->setFlags(AMQP_DURABLE);
$exchange->setType(AMQP_EX_TYPE_DIRECT);
$exchange->declareExchange();
$queue = new \AMQPQueue($channel);
$queue->setFlags(AMQP_DURABLE);
$queue->setName('some_test_queue');
$queue->declareQueue();
$queue->bind('some_test', 'some:foo:bar');
$channel->startTransaction();
$exchange->publish('some #1', 'some:foo:bar');
$exchange->publish('some #2', 'some:foo:bar');
$channel->commitTransaction();
$exchange->publish('some #3', 'some:foo:bar');
上次未发布到exchange的邮件。但是,若我在通道中调用commitTransaction
,最后一条消息就是成功发布到队列中
我在这里阅读了文档:
也许第一次事务后RabbitMQ会将此通道标记为事务性通道,并在发布任何消息后始终等待提交/回滚?您不应该在通道上使用事务,它们占用大量资源,相反,您应该使用一些对AMQP的扩展,以轻量级发布服务器的形式 它们提供与事务相同的保证级别,但资源较少,并且比事务提供更好的吞吐量
在我们的例子中,我们只能使用事务层,因为在逻辑的末尾,我们可以使用上一个提交数据库事务和下一个提交rabbitmq事务。它保证在我们向其他消费者发送消息之前,模型将保存在数据库中。若我们之前发送了消息,那个么我们可能会遇到一个问题——消费者收到了这个消息,但应用程序并没有提交数据库事务,也并没有向数据库插入模型。在这些情况下,我们可以有一个必须回滚数据库事务的情况。使用事务层保证回滚或提交两个级别。感谢