Задать вопрос
@Alex00qqw

Rabbitmq очередь последнего состояния (lvc). Как ее реализовать?

Есть у нас сервис который следит за местоположением ТС (транспортных средств). Задача оповещать другой сервис через amqp (выбрали rabbit) об изменении состояния ТС (скорость, координаты и тд). Хочется сделать так чтобы в очереди хранилось только последнее состояние. Если получатель по какой-то причине не прочитал предыдущее состояние ТС то сообщение перезатерается. Нашел плагин rabbitmq-lvc-exchange но не могу понять как это работает. Нужно создавать для каждого ТС свою очередь? Например для авто с id 1234567 имя очереди будет vehicle.state.change.1234567. Кто-нибудь подскажет как еще можно реализовать данную задачу именно в rabbit? Просьба не советовать использовать key-value хранилища типа redis. И еще если можно сделать одну очередь для всех ТС подскажите как это реализовать? То есть в если у нас 200 ТС то в очереди может быть максимум 200 сообщений
  • Вопрос задан
  • 96 просмотров
Подписаться 1 Сложный Комментировать
Ответ пользователя Сергей К ответам на вопрос (3)
@yarkin
Дополню по плагину, сам не использовал, но по описанию и коду можно сказать как оно работает.
(1) Когда в такой обменник публикуется сообщение:
- Сохраняется связка <routing_key>=<value> [code]
- Дальше маршрутизация происходит так же как и у Direct обменника [code]
(2) Когда к такому обменнику цепляется очередь:
- По ключу связки ищется значение из внутренней базы
- Сообщение с последним значение публикуется в очередь

То есть, если Вам нужно сохранять состояние для N объектов через такой механизм, то для получаения придётся каждый раз делать N биндингов очереди на обменник, затем N раз убирать этот биндинг. А так же не забыть повесить ограничение на длину очереди, так как никому реальные сообщение не требуются.

Как вариант можете форкнуть этот обменник и допилить его так, чтобы при публикации сохранялись только последние состояния (без дальнейшей публикации как Direct), а при подписке на обменник RabbitMQ засылал бы сразу все состояния :-)
Ответ написан
Комментировать