Vert.x 事件总线的问题

Questions for Vert.x event bus

我是 Vert.x 中事件总线的新手。在指南https://vertx.io/docs/vertx-core/java/中,描述如下:

Best-effort delivery

Vert.x does its best to deliver messages and won’t consciously throw them away. This is called best-effort delivery.

If your application cares about lost messages, you should code your handlers to be idempotent, and your senders to retry after recovery.

我的系统不希望丢失任何消息,所以我必须了解事件总线并决定是否使用 Vert.x。以下是我的问题:

  1. 事件总线丢失消息的典型场景是什么?

  2. 假设一个场景,producer快,consumer慢。可以 生产者感知它并减慢发送速度?这种情况怎么处理?

  3. 假设另外一个场景,consumer注册了event bus,那么由于某些原因 consumer 不工作,此时,producer 发送 return 例外?或者生产者不知道消费者的状态而继续 发送?这种情况怎么处理?

  4. 事件循环线程是否负责传递消息 对于事件总线?

  5. 事件总线是否有队列来缓冲消息?如果是,默认大小是多少?

默认情况下,事件总线缓冲区为每个消费者保存 1000 个事件,并且可以更改限制。

这意味着,"slow" 消费者可以在丢弃新传入消息之前再等待 1000 条消息。我认为这很好,因此EB可以被认为是非常安全和无损的。

当消息即将开始丢失时,您应该扩大慢速消费者 Verticle。

通常 在 vert.x 事件总线 之外 的消息丢弃概率远大于 节点之间 簇。与您的 "private" 网络的本地连接相比,任何外部互联网连接都不稳定。

如果消费者因任何原因无法访问,vert.x 可以通知消息传递:

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

如果由于消费者不在场而导致交付失败,您将获得适当的例外