Не публиковать сообщения в RabbitMQ после коммита или отката - PullRequest
0 голосов
/ 22 сентября 2019

У меня проблема с публикацией сообщений на 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');

Последние сообщения не опубликованы для обмена.Но, если я позвоню по commitTransaction в канале, последние сообщения были успешно опубликованы в очереди.

Я прочитал документацию здесь: https://www.rabbitmq.com/confirms.html#publisher-confirms

Возможно, RabbitMQ после первой транзакции пометит этот канал какТранзакционные и всегда ждать фиксации / отката после публикации каких-либо сообщений?

1 Ответ

0 голосов
/ 23 сентября 2019

Вы не должны использовать Транзакции на канале, они требуют значительных ресурсов, вместо этого вы должны использовать что-то, что является расширением AMQP в форме Облегченных Подтверждений Издателя.

Они предоставляют тот же уровень гарантии, что и транзакции.но они не требуют много ресурсов и дают вам лучшую пропускную способность, чем транзакции.

См. здесь здесь

...