Обновить

Гарантировано переложить события из БД в RabbitMq streams на .net

Нужно реализовать transaction-outbox, только без дебезиума. Казалось бы ничего сложного: в цикле читаем сообщения из бд и отправляем в стрим. Если успех, удаляем сообщение из бд. Если была ошибка, берём таймаут и начинаем всё заново.

Проблема в том, что в библиотеке RabbitMQ Stream .Net Client отправка сообщения и получение результата отправки никак не связаны между собой. Не смотря на то, что список сообщений отправляется синхронно через метод Send, результат отправки можно получить только внутри коллбэк-функции ConfirmationHandler, а значит у нас трудности.

Что делать?

Решение 1: пробрасывать через метод отправки некий контекст, например добавлять к каждому сообщению ид строки из бд и удалять строку внутриConfirmationHandler. Может сработать, но оказалось, что все свойства класса Message сериализуются и уходят в стрим, а значит будет мусор. К тому же возникают сложности с управлением транзакцией, потому что непонятно когда будет удаление и требуются дополнительные синхронизации.

Решение 2: использовать TaskCompletionSource. Перед отправкой создаём новый экземпляр TaskCompletionSource, потом ожидаем результата в надежде, что библиотека отработает как надо и количество вызовов ConfirmationHandler будет совпадать с количеством вызовов Send.

Картинка, потому что лимит по символам
Картинка, потому что лимит по символам

Такое решение работает, но всё же выглядит хрупким.

Решение 3: Использовать более низкоуровневые api библиотеки, но кажется, что уйдёт куча времени на обвязку с неясным выхлопом.

Теги:
Всего голосов 1: ↑1 и ↓0+3
Комментарии2

Записки из подполья незаконного архивирования фильмов

«Люди, видоизменяющие или уничтожающие художественные работы и наше культурное наследие ради прибылей или демонстрации власти — это варвары, и если законы США продолжат оправдывать такое поведение, то мы точно войдём в историю, как варварское общество.»

— Джордж Лукас, 1988 год

«Для меня её [оригинальной трилогии «Звёздных войн»] больше не существует. Я задумывал этот фильм именно так, и мне жаль, что вы увидели половину целого фильма и полюбили его.»

— Джордж Лукас, 2004 год

Ванкувер, 2011 год: мы с моей соседкой Виллой Росс сидим в одной из характерно стерильных монтажных студий Университета Саймона Фрейзера и уже не знаем, что делать: мы провели все выходные, ваяя из трёх разных копий вестерна Серджо Леоне 1966 года «Хороший, плохой, злой» одну версию — причём все три копии были незаконными рипами. В начале 2000-х этот фильм пал жертвой «реставрации», выполненной компанией MGM: вырезанные Серджо Леоне сцены были возвращены, увеличив время англоязычной версии с 161 до 179 минут; Клинт Иствуд и Илай Уоллак дублировали недостающие диалоги, а место умершего к тому времени Ли Ван Клифа занял похожий на него голосом дублёр. Монофоническая дорожка была переработана в многоканальный звук с неприятно современными звуками выстрелов. Почти десяток лет эта «дополненная» лента оставалась единственной продаваемой версией фильма; подобное очень часто происходит в эпоху ревизионистских студийных реставраций.

Наша цель была простой: спасти фильм от этой вивисекции. Мы планировали соединить звук уже не издававшегося DVD 1998 года (приблизительно похожий на звук международного релиза 1967 года) с видео из недавно привезённого Blu-ray итальянской версии. После того, как мы успешно преодолели многочисленные подводные камни, связанные с риппингом домашних видеозаписей конца 2000-х, наши надежды рухнули из-за катастрофического открытия: итальянская версия оказалась ещё сильнее отличающейся от международной, чем расширенная версия: печально известная сцена пытки была полностью перестроена, а у некоторых кадров отсутствовали начало и конец. Мы почти на десяток лет отказались от этой затеи.

Записки из подполья незаконного архивирования фильмов

Публикации