【问题标题】:Questions for Vert.x event busVert.x 事件总线的问题
【发布时间】:2020-03-20 03:41:24
【问题描述】:

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

尽力交付

Vert.x 尽最大努力传递消息,不会有意识地抛出 他们离开。这称为尽力而为。

如果您的应用程序关心丢失的消息,您应该编写自己的代码 处理程序是幂等的,您的发件人在恢复后重试。

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

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

  2. 假设一个场景,生产者快,消费者慢。可以 生产者察觉到它并减慢发送速度?这种情况该如何处理?

  3. 假设另一个场景,消费者注册事件总线,然后出于某种原因 消费者不工作,此时生产者是否发送返回 例外?或者生产者不知道消费者状态并继续 发送?这种情况该如何处理?

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

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

【问题讨论】:

    标签: vert.x


    【解决方案1】:

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

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

    当消息即将开始被丢弃时,你应该扩大你的慢消费者 Verticle。

    通常,vert.x 事件总线之外的消息丢弃的概率远大于集群的节点之间的概率。与您的“私有”网络的本地连接相比,任何外部互联网连接都不是那么稳定。

    如果消费者由于某种原因无法访问,vert.x 可以通知消息传递:

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

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

    【讨论】:

    • 感谢您的及时回复。它有助于。必须进一步澄清。哪个组件负责事件总线中的消息转发?是事件循环线程吗?
    • 不确定你的意思,但是对于消息发送,集群技术负责,比如 hazelcast
    • 谢谢。还有一个问题,如何更改事件缓冲区大小(您提到默认为 1000)?我想让它变大。
    • @Joe 从stackoverflow.com/questions/59266097/… 得到一些启示:)
    • 非常感谢,非常有帮助。
    猜你喜欢
    • 1970-01-01
    • 2023-01-26
    • 1970-01-01
    • 1970-01-01
    • 2019-05-19
    • 1970-01-01
    • 2021-04-06
    • 2021-08-08
    • 2015-03-23
    相关资源
    最近更新 更多