Обмен заголовками RabbitMQ со списком
У меня возникли некоторые проблемы, пытаясь понять, как работает обмен заголовками типов.
Только один обмен, myExchange
Три очереди:
- myQueue1
- myQueue2
- myQueue3
Наручники:
- myExchange => myQueue1 (x-match: any, myHeader: [test1])
- myExchange => myQueue2 (x-match: any, myHeader: [test2])
- myExchange => myQueue3 (x-match: any, myHeader: [test1, test2, test3])
Я ожидаю, что заголовок сообщения будет иметь несколько значений; любая комбинация test1, test2, test3 (пример: только test1, test1 и test2, test3 и test2 и т. д.)
myQueue3 получает сообщения, только если они имеют myHeaders: [test1, test2, test3]. Я ожидаю, что myQueue3 будет получать сообщения, например, test1 и test2.
myQueue1 получает сообщения, только если у них есть myHeaders: [test1]. Я ожидаю, что myQueue1 будет получать сообщения, например, для test1 и [test1, test2].
Есть ли способ добиться такого поведения? Спасибо
3 ответа
Для этого у меня есть хитрость.
Наручники:
- myExchange => myQueue1 (x-match: any, test1: true)
- myExchange => myQueue2 (x-match: any, test2: true)
- myExchange => myQueue3 (x-match: any, test1: true, test2: true, test3: true)
myQueue1 получит все сообщения с заголовками, содержащими {test1: true}.
myQueue2 получит все сообщения с заголовками, содержащими {test2: true}.
myQueue3 получит все сообщения с заголовками, содержащими одно из следующих значений: {test1: true}, {test2: true} или {test3: true}.
Я предпочитаю это, потому что ключ маршрутизации ограничен 255 байтами, но ограничение количества элементов в заголовке очень велико.
По производительности я не знаю что лучше.
Вы можете объявить несколько привязок для одной и той же очереди.
В вашем случае очередь 3 будет иметь три разных привязки.
Я согласен с комментариями, я пытался добиться чего-то, что на данный момент не поддерживается. Я буду использовать ключи маршрутизации.