【问题标题】:Expensive Vertx Eventbus Json handling昂贵的 Vertx Eventbus Json 处理
【发布时间】:2021-02-20 15:09:27
【问题描述】:

我有一个关于 Vertx Eventbus 以及如何正确使用它的问题。在 Vertx 中使用 EventBus 至少有两种选择:

  1. 我使用 Vertx 提供的 Eventbus 方法来调用驻留在另一个 Verticle 上的函数。这里的好处是我可以使用编解码器通过 Eventbus 传递参数。如果我只想在本地使用它,我可以传递参考。这里的缺点是我需要提供一个字符串来定义我想要调用的函数。看开发者速度,这很糟糕,因为现在我必须在代码库中搜索字符串才能找到我调用的函数。

  2. 我使用 Vertx 服务代理。这非常方便,因为它在编译时为 Eventbus 生成代理。这使我作为开发人员可以跟踪我在 Verticles 中调用的函数,而我根本不需要处理 Eventbus API。然而,它也有一些重要的缺点:现在启动时间需要更长的时间,并且服务代理正在将所有函数属性转换为 Json 和从 Json 转换。这可能对应用程序性能非常不利。

我的问题:使用 Eventbus 的最佳方式是什么?我是否遗漏了一些可以帮助我解决选项二缺点的东西?有没有我还没有看到的替代品?

谢谢

【问题讨论】:

    标签: vert.x vertx-eventbus


    【解决方案1】:

    正如您所发现的,主要方法是使用字符串地址。这样做的原因有很多,因为事件总线可能会通过网络延伸并扩展到其他 JVM、机器甚至非 JVM 环境,因此它们都应该能够处理消息。

    正如您所提到的,为了传递琐碎的 POJO,您需要一个编解码器,并且大多数编解码器区分在本地调用,因此传递引用和通过网络转换调用。所以你不必担心这里。不为您定义的每种类编写编解码器的一种简单方法是使用@DataObject 并让代码生成来处理它。这样您只需发送和接收 POJO,其余的将自动完成。至少在一段时间之前,这使用序列化(请参阅here)。

    对于服务代理,当前的实现总是序列化所有参数,但这个问题已经被提出了long time ago。但这是您为类型安全付出的代价(至少在某种程度上)。

    总而言之,没有最好的方式来使用 eventbus,这完全取决于你在寻找什么。您可以为地址定义常量字符串并使用它们,这样您就不会在整个代码中寻找字符串或寻找可以使用服务代理的类型安全变体。

    【讨论】:

    • 感谢您的回复。也许我误解了,但是服务代理会序列化 Futures 中的所有函数参数和所有返回值,即使它们是 DataObjects,对吧?在这种情况下,我付出了非常高的性能价格。
    • 你是对的,我有错误的印象,但是看了this我发现你是对的而且它总是反序列化
    • 顺便说一句,我不确定这是否是“真正的高性能价格”。如果您使用 vertx codegen 创建反序列化器,它们实际上非常非常快。不要使用杰克逊或类似的解决方案。我有使用 vertx 完成多层服务的经验,它们都在内部进行此类反序列化,整个往返每个请求的时间不到 50 毫秒。
    猜你喜欢
    • 2012-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-06
    • 2021-07-10
    • 1970-01-01
    • 1970-01-01
    • 2018-03-27
    相关资源
    最近更新 更多