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。以下是我的问题:
事件总线丢失消息的典型场景是什么?
假设一个场景,producer快,consumer慢。可以
生产者感知它并减慢发送速度?这种情况怎么处理?
假设另外一个场景,consumer注册了event bus,那么由于某些原因
consumer 不工作,此时,producer 发送 return
例外?或者生产者不知道消费者的状态而继续
发送?这种情况怎么处理?
事件循环线程是否负责传递消息
对于事件总线?
事件总线是否有队列来缓冲消息?如果是,默认大小是多少?
默认情况下,事件总线缓冲区为每个消费者保存 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()}"
}
如果由于消费者不在场而导致交付失败,您将获得适当的例外
我是 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。以下是我的问题:
事件总线丢失消息的典型场景是什么?
假设一个场景,producer快,consumer慢。可以 生产者感知它并减慢发送速度?这种情况怎么处理?
假设另外一个场景,consumer注册了event bus,那么由于某些原因 consumer 不工作,此时,producer 发送 return 例外?或者生产者不知道消费者的状态而继续 发送?这种情况怎么处理?
事件循环线程是否负责传递消息 对于事件总线?
事件总线是否有队列来缓冲消息?如果是,默认大小是多少?
默认情况下,事件总线缓冲区为每个消费者保存 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()}"
}
如果由于消费者不在场而导致交付失败,您将获得适当的例外