当前位置: 首页 > 知识库问答 >
问题:

有关 Vert.x 事件总线的问题

陆才俊
2023-03-14

我是Vert.x.中活动巴士的新手https://vertx.io/docs/vertx-core/java/,描述如下:

尽最大努力交付

Vert.x尽最大努力传递消息,并且不会有意识地丢弃它们。这称为尽力而为的交付。

如果您的应用程序关心丢失的消息,您应该将您的处理程序编码为等幂,并将您的发送程序编码为在恢复后重试。

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

>

  • 丢失事件总线消息的典型情况是什么?

    假设一个场景,生产者很快,消费者很慢。制片人能察觉到它并放慢发送速度吗?如何处理这种情况?

    假设另一个场景,消费者注册了事件总线,然后由于某种原因消费者不工作,这时,生产者发送返回异常吗?还是生产者不知道消费者身份继续发?这种情况怎么处理?

    事件循环线程是否负责为事件总线传递消息?

    事件总线有缓冲消息的队列吗?如果有,默认情况下大小有多大?

  • 共有1个答案

    裴理
    2023-03-14

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

    这意味着,“慢”的消费者可以再等待1000条消息,然后才会丢弃新的传入消息。我认为这很好,因此EB可以被认为是非常安全和无损的。

    当消息即将开始丢失时,您应该扩大您的缓慢消费者垂直度。

    通常情况下,消息在vert之外丢失的概率。x事件总线远大于集群节点之间的事件总线。与您的“专用”网络的本地连接相比,任何外部互联网连接都不太稳定。

    如果使用者由于某种原因无法访问,vert.x 可以通知有关消息传递的信息:

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

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

     类似资料:
    • 我正在使用vert。x 2.1.5版本。我试图在我的项目中使用事件循环。下面给出了示例代码 在此代码中,我的事件总线在执行事件循环之前返回值。我需要根据事件循环输出填充我的输出 如何实现

    • 让我们跳进 API 获取事件总线 你获取到事件总线的引用,如下所示: EventBus eb = vertx.eventBus(); 还有每个 Vert.x 实例事件总线的单个实例。 注册处理程序 这个最简单的方法来注册一个处理程序用consumer。下面是一个示例: EventBus eb = vertx.eventBus(); eb.consumer("news.uk.sport", mess

    • 注:本节未经校验,如有问题欢迎提issue 最初设想是为了提供一种向多个actor群发消息的方法,之后EventBus被一般化为一组实现一个简单接口的可组合的特质: /** * Attempts to register the subscriber to the specified Classifier * @return true if successful and false if not

    • 有人知道在Quarkus测试中监视Vert.x事件总线的方法吗?理想情况下,我希望断言,在服务层的方法期间,我们将事件发送到正确的地址,但有人知道这是否可能吗? 如果我只是尝试使用,我会得到以下错误

    • 背景 JDK中通过Observer接口和Observable类实现观察者模式, Observer对象是观察者,Observable对象是被观察者. 实现一个简单的观察者模式有以下几步: 创建被观察者, 继承自java.util.Observable类 创建观察者, 实现java.util.Observer接口 在观察者中实现void update(java.util.Observable obse

    • 我在玩Vert.x事件总线,在最简单的示例中一切都很好。 但是,我希望将消息发送到Verticle类之外的Vert.x事件总线。