|
Асинхронный RPC с использованием Spring и RabbitMQ
|
|||
---|---|---|---|
#18+
Привет, потратил довольно много времени, и никак не разберусь, подскажите пожалуйста как правильно. Есть приложение, метод помеченный @Async, из него делается вызов другого метода через rabbit(другой сервис), rabbitTemplate.convertSendAndReceive(...). При этом, на стороне consumer я хочу использовать ack/nack подтверждения, что бы сообщение в ребите не терялось и обрабатывалось наверняка - channel.basicAck/Nack. Так же, для rabbitTemplate я использую таймаут на стороне producer, который равен установленному TTL для сообщений той очереди, через которую летит RPC вызов. Проблема - я запускаю два окна консоли с consumers и одно окно producer - получаю не ожидаемое поведение - у меня 2 consumer могут забрать одно сообщение и потом вернуть его обработанным два раза. Подскажите пожалуйста как это правильно реализовать ? Исходная задача такая - есть producer и есть consumers - необходимо обрабатывать сообщения, в случае неудачи - возвращать их обратно в очередь для последующей обработки, 1 сообщение - одна обработка от consumer, если он по каким то причинам не обработал сообщение - оно возвращается обратно в очередь и его берёт друго consumer. Так же для сообщений должен существовать TTL. Так же для consumers у меня на данный момент есть вот такой конфиг Код: java 1. 2. 3. 4.
Но тут тоже не понятный для меня момент - если с конфигом - то в админке rabbit на графике - Queued messages ничего не отрисовывается, а на Message rates есть, а если убрать настройки для ручного подтверждения - то и там и там отрисовывается. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.10.2018, 13:24 |
|
Асинхронный RPC с использованием Spring и RabbitMQ
|
|||
---|---|---|---|
#18+
alexander00513Есть приложение, метод помеченный @Async, из него делается вызов другого метода через rabbit Rabbit не знаю, но вот асинхронностью помечать метод исходный думаю не стоит. Вы ведь просто ставите в очередь. Затрат никаких, поэтому асинхронность тут не нужна. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.10.2018, 13:35 |
|
Асинхронный RPC с использованием Spring и RabbitMQ
|
|||
---|---|---|---|
#18+
Хз чо там у рабита но у Кафки если партий меньше чем консумеров то те кто не входят в это количество тупо ничего никогда не получат ... |
|||
:
Нравится:
Не нравится:
|
|||
29.10.2018, 10:00 |
|
Асинхронный RPC с использованием Spring и RabbitMQ
|
|||
---|---|---|---|
#18+
Petro123, дело в том, что RPC блокирующий вызов, с таймаутом, и после получение результата, там довольно много логики по прсингу ответа и манипуляций с ним. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.10.2018, 10:47 |
|
Асинхронный RPC с использованием Spring и RabbitMQ
|
|||
---|---|---|---|
#18+
andreykaT, ну у ребита в этом плане round robin - он по очереди раздаёт сообщения для consumers, но у меня проблема в том, что бывает так, что они гребут вместе одно сообщение ... |
|||
:
Нравится:
Не нравится:
|
|||
29.10.2018, 10:48 |
|
Асинхронный RPC с использованием Spring и RabbitMQ
|
|||
---|---|---|---|
#18+
alexander00513Petro123, дело в том, что RPC блокирующий вызов, с таймаутом, и после получение результата, там довольно много логики по прсингу ответа и манипуляций с ним.не понял. Системы с очередями развязано получение ответа и постановка в очередь. Как можно ставить в очередь блокирующем вызове? Поток ставит в очередь и сразу освобождается и возврат управления. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.10.2018, 11:10 |
|
Асинхронный RPC с использованием Spring и RabbitMQ
|
|||
---|---|---|---|
#18+
Petro123, если мы говорим о простой отправке сообщения в очередь - да, там не блокирующий вызов, но тут речь о RPC - метод кладёт сообщение в очередь и ожидает ответ некоторое время, ограниченное таймаутом. Вот Spring интерфейс, реализация в RabbitTemplate, для RPC вызова Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
... |
|||
:
Нравится:
Не нравится:
|
|||
29.10.2018, 11:23 |
|
Асинхронный RPC с использованием Spring и RabbitMQ
|
|||
---|---|---|---|
#18+
alexander00513метод кладёт сообщение в очередь и ожидает ответ некоторое время, ограниченное таймаутом.зачем это вообще делать? Это изврат имхо. Сидеть на двух стульях сразу. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.10.2018, 11:26 |
|
Асинхронный RPC с использованием Spring и RabbitMQ
|
|||
---|---|---|---|
#18+
alexander00513andreykaT, ну у ребита в этом плане round robin - он по очереди раздаёт сообщения для consumers, но у меня проблема в том, что бывает так, что они гребут вместе одно сообщение ...и снова о кафке: там тоже можно сделать чтоб все консамеры гребли одно сообщение. но. если ты их объединяешь в консамер-групп то тогда работает по раундробину. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.10.2018, 12:16 |
|
|
start [/forum/topic.php?fid=59&msg=39724355&tid=2121690]: |
0ms |
get settings: |
10ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
105ms |
get topic data: |
12ms |
get forum data: |
2ms |
get page messages: |
53ms |
get tp. blocked users: |
1ms |
others: | 16ms |
total: | 216ms |
0 / 0 |