Транзакционность


#1

@sergey.novikov @Bronislav https://www.rabbitmq.com/amqp-0-9-1-reference.html#class.tx

3 метода в компоненте

  • УстановитьИспользованиеТранзакции(...)
  • ЗафиксироватьТранзакциюВКанале(...)
  • ОтменитьТранзакциюВКанале(...)

Собственно объект действия “КаналПередачи”

То есть порядок вызова следующий

  • открываем соединение
  • объявляем канал передачи
  • устанавливаем признак использования транзакций - это формально является конструкцией НачатьТранзакцию в первый раз
  • что-то публикуем - в очереди, в точки обмена и т.д.
  • фиксируем или отменяем транзакцию согласно своей логике приложения
    • фиксация или отмена в любом случае закрывает старую и объявляет новую
  • что-то публикуем - в очереди, в точки обмена и т.д.

как то так

P.S. Планируется в релизе 1.3/1.4


#2

До чего дошел прогресс… а это как под низом работает?


#3

Это поддерживается на стороне сервера

Servers SHOULD implement atomic transactions

всем сообщениям в данном канале начинает присваиваться TRAN_ID - которые кстати проставляются в свойствах каждого сообщения.


#4

и консьюмер эти сообщения не берет пока TRAN_ID не объявлен как зафиксированная транзакция?


#5

Еще “хуже”…

Внутри транзакции могут происходит события “публикации” и “подтверждения доставки”, то есть не только отправка, но и забор сообщений - если транзакция откатывается,откатываются еще и полученные сообщения как “не полученные”.

Если consumer подписан на очередь где сообщения еще не закомитчены - он их как бы не увидит… Вот только я сейчас проверяю, необходимо ли клиенту для этого также явно указывать что он работает в транзакционном режиме.


#6

Клиент вроде как должен сам в props проверять, есть ли TRAN_ID и на основании этого логику строить.


#7

Ой-вей… Надо бы это сначала на стендах обкатать, прежде чем в бой запускать.


#8

Ну так на внутренней конфе и обкатаем