Вопросы для автобуса Vert.x - PullRequest
2 голосов
/ 20 марта 2020

Я новичок в шине событий в Vert.x. В руководстве https://vertx.io/docs/vertx-core/java/ оно описывается следующим образом:

Лучшая доставка

Vert.x делает все возможное, чтобы доставлять сообщения и не будет сознательно выкинь их. Это называется доставкой с максимальным усилием.

Если ваше приложение заботится о потерянных сообщениях, вам следует закодировать свои обработчики как идемпотентные, а отправителям повторить попытку после восстановления.

Моя система не ожидает потери каких-либо сообщений, поэтому я должен понять шину событий и решить, использовать ли Vert.x или нет. Вот мои вопросы:

  1. Каков типичный сценарий потери сообщений для шины событий?

  2. Предположим, что сценарий быстрый, а производитель медленный. Может ли продюсер воспринять это и замедлить отправку? Как справиться с этой ситуацией?

  3. Предположим, что другой сценарий - регистрация потребителя для шины событий, то по какой-то причине потребитель не работает, в это время производитель отправляет исключение возврата? Или производитель не знает статус потребителя и продолжает отправлять? Как справиться с этой ситуацией?

  4. Является ли событие l oop потоком, ответственным за доставку сообщений для шины событий?

  5. Есть ли в шине событий очередь для буферизации сообщений? Если да, то по умолчанию, насколько большой для размера?

1 Ответ

0 голосов
/ 20 марта 2020

По умолчанию буфер событийной шины содержит 1000 событий на одного потребителя, и ограничение можно изменить.

Это означает, что «медленный» потребитель может подождать еще 1000 сообщений, прежде чем новые входящие сообщения будут отброшены. Я думаю, что это очень хорошо, и, следовательно, EB можно считать довольно безопасным и без потерь.

Когда сообщения начинают сбрасываться, вам следует увеличить вашу медленную вертикалку.

Обычно вероятность потери сообщения вне шины событий vert.x намного больше, чем между узлами кластера. Любое внешнее соединение inte rnet не так стабильно по сравнению с локальными соединениями вашей "частной" сети.

Если потребитель по какой-либо причине недоступен, vert.x может уведомить о доставке сообщения:

vertx.eventBus().request( 'some.addr', 'some payload' ){ AsyncResult ar ->
  if( ar.succeded() )
    println 'ok'
  else 
    println "Error : ${ar.cause()}"
} 

В случае неудачной доставки из-за отсутствия клиента, вы получите соответствующее исключение

...