У меня есть поток объектов deltas (то есть объекты JSON, описывающие изменения для других объектов), поступающие из очереди сообщений сторонних разработчиков. Мне нужно применить их к соответствующим объектам в базе данных (перевод дельт в состояние). Дельты по своей сути упорядочены.Многопотоковое потребление упорядоченной очереди
Как бы то ни было, я намерен передать эти дельта в наш собственный кластер RabbitMQ, откуда группа серверов Java вытащит их, а затем применит их к базе данных (Java - это где логика обновления базы данных централизована).
Приложение дельт должно быть многопоточным, но я хочу, чтобы дельта для данного объекта всегда применялась в порядке. Чтобы действительно гарантировать это, только один поток может обрабатывать дельта для данного объекта.
С этой целью, когда я прочитал их с третьей очереди и перед тем, как поместить их в RabbitMQ, я решил, что могу разделить дельта на очереди на uuid соответствующего объекта. В принципе, каждая дельта имеет поле object_uuid
, и я бы по модулю, что uuid, скажем, 50, а затем использовать результат в качестве ключа маршрутизации, чтобы у меня было 50 очередей упорядоченных дельт в RabbitMQ.
В этот момент это просто (хе) вопрос обеспечения того, чтобы у меня был один потребитель в очереди (хотя я все еще могу иметь несколько очередей на одного потребителя). Я думал, что «эксклюзивный» параметр для очереди объявлений в AMQP может дать мне желаемое поведение, и это похоже на то, что происходит, но, к сожалению, оно связано с непосильным побочным эффектом, что очередь удаляется при отключении потребителя (это парк Java серверы, которые появляются вверх и вниз с каждой версией - очереди должны сохраняться между релизами).
Это не может быть необычной дилеммой, но я не вижу ничего, что вполне подходит этой проблеме. Разве нет никакой конструкции в RabbitMQ или AMQP, которую я могу использовать в своих интересах здесь? Есть ли способ переосмыслить эту проблему, которая позволит избежать проблемы? Или мне нужно взглянуть на распределенные блокирующие решения?
Что именно означает 'объект дельта'? Любой шанс вы могли бы привести пример того, что эти дельта и если они все применимы к одному объекту или применяются к нескольким объектам, каждый из которых имеет несколько дельт? – kha
@kha, я обновил вопрос, чтобы уточнить. Каждая дельта имеет внешний ключ для объекта, к которому должна применяться дельта. – jwilner
, так что проблема с урмом сводится к тому, что есть способ, которым rabbitmq может сохранять данные, если потребитель отключается правильно? – nafas