Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Асинхронный RPC с использованием Spring и RabbitMQ / 9 сообщений из 9, страница 1 из 1
28.10.2018, 13:24
    #39724046
alexander00513
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Асинхронный RPC с использованием Spring и RabbitMQ
Привет, потратил довольно много времени, и никак не разберусь, подскажите пожалуйста как правильно.
Есть приложение, метод помеченный @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.
listener:
      simple:
        acknowledge-mode: manual
        prefetch: 1



Но тут тоже не понятный для меня момент - если с конфигом - то в админке rabbit на графике - Queued messages ничего не отрисовывается, а на Message rates есть, а если убрать настройки для ручного подтверждения - то и там и там отрисовывается.
...
Рейтинг: 0 / 0
28.10.2018, 13:35
    #39724049
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Асинхронный RPC с использованием Spring и RabbitMQ
alexander00513Есть приложение, метод помеченный @Async, из него делается вызов другого метода через rabbit
Rabbit не знаю, но вот асинхронностью помечать метод исходный думаю не стоит.
Вы ведь просто ставите в очередь. Затрат никаких, поэтому асинхронность тут не нужна.
...
Рейтинг: 0 / 0
29.10.2018, 10:00
    #39724287
andreykaT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Асинхронный RPC с использованием Spring и RabbitMQ
Хз чо там у рабита но у Кафки если партий меньше чем консумеров то те кто не входят в это количество тупо ничего никогда не получат
...
Рейтинг: 0 / 0
29.10.2018, 10:47
    #39724322
alexander00513
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Асинхронный RPC с использованием Spring и RabbitMQ
Petro123, дело в том, что RPC блокирующий вызов, с таймаутом, и после получение результата, там довольно много логики по прсингу ответа и манипуляций с ним.
...
Рейтинг: 0 / 0
29.10.2018, 10:48
    #39724325
alexander00513
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Асинхронный RPC с использованием Spring и RabbitMQ
andreykaT, ну у ребита в этом плане round robin - он по очереди раздаёт сообщения для consumers, но у меня проблема в том, что бывает так, что они гребут вместе одно сообщение
...
Рейтинг: 0 / 0
29.10.2018, 11:10
    #39724339
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Асинхронный RPC с использованием Spring и RabbitMQ
alexander00513Petro123, дело в том, что RPC блокирующий вызов, с таймаутом, и после получение результата, там довольно много логики по прсингу ответа и манипуляций с ним.не понял.
Системы с очередями развязано получение ответа и постановка в очередь.
Как можно ставить в очередь блокирующем вызове?
Поток ставит в очередь и сразу освобождается и возврат управления.
...
Рейтинг: 0 / 0
29.10.2018, 11:23
    #39724355
alexander00513
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Асинхронный RPC с использованием Spring и RabbitMQ
Petro123, если мы говорим о простой отправке сообщения в очередь - да, там не блокирующий вызов, но тут речь о RPC - метод кладёт сообщение в очередь и ожидает ответ некоторое время, ограниченное таймаутом.
Вот Spring интерфейс, реализация в RabbitTemplate, для RPC вызова

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
/**
	 * Basic RPC pattern with conversion. Send a Java object converted to a message to a
	 * specific exchange with a specific routing key and attempt to receive a response,
	 * converting that to a Java object. Implementations will normally set the reply-to
	 * header to an exclusive queue and wait up for some time limited by a timeout.
	 *
	 * @param exchange the name of the exchange
	 * @param routingKey the routing key
	 * @param message a message to send
	 * @param correlationData data to correlate publisher confirms.
	 * @return the response if there is one
	 * @throws AmqpException if there is a problem
	 */
	Object convertSendAndReceive(String exchange, String routingKey, Object message,
			CorrelationData correlationData) throws AmqpException;
...
Рейтинг: 0 / 0
29.10.2018, 11:26
    #39724358
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Асинхронный RPC с использованием Spring и RabbitMQ
alexander00513метод кладёт сообщение в очередь и ожидает ответ некоторое время, ограниченное таймаутом.зачем это вообще делать?
Это изврат имхо. Сидеть на двух стульях сразу.
...
Рейтинг: 0 / 0
29.10.2018, 12:16
    #39724400
andreykaT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Асинхронный RPC с использованием Spring и RabbitMQ
alexander00513andreykaT, ну у ребита в этом плане round robin - он по очереди раздаёт сообщения для consumers, но у меня проблема в том, что бывает так, что они гребут вместе одно сообщение
...и снова о кафке: там тоже можно сделать чтоб все консамеры гребли одно сообщение. но. если ты их объединяешь в консамер-групп то тогда работает по раундробину.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Асинхронный RPC с использованием Spring и RabbitMQ / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]