提交或回滚后不将消息发布到RabbitMQ

提交或回滚后不将消息发布到RabbitMQ,rabbitmq,amqp,Rabbitmq,Amqp,我在向RabbitMQ发布消息时遇到问题。我们的应用程序必须在事务层工作 但是,我不理解一种情况:如果我首先启动事务并提交它,那么接下来的所有消息都不会发布到RabbitMQ $connection = new \AMQPConnection([ 'host' => 'rabbitmq', 'port' => 5672, 'login' => 'guest', 'password' => 'guest', ]); $

我在向RabbitMQ发布消息时遇到问题。我们的应用程序必须在事务层工作

但是,我不理解一种情况:如果我首先启动事务并提交它,那么接下来的所有消息都不会发布到RabbitMQ

$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事务。它保证在我们向其他消费者发送消息之前,模型将保存在数据库中。若我们之前发送了消息,那个么我们可能会遇到一个问题——消费者收到了这个消息,但应用程序并没有提交数据库事务,也并没有向数据库插入模型。在这些情况下,我们可以有一个必须回滚数据库事务的情况。使用事务层保证回滚或提交两个级别。感谢