1

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

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

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

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

谢谢

4

1 回答 1

0

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

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

至于Service Proxy,目前的实现总是序列化所有参数,但这个问题很久以前就已经提出了。但这是您为类型安全付出的代价(至少在某种程度上)。

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

于 2020-11-17T13:15:07.330 回答