昂贵的Vertx Eventbus Json处理

时间:2020-11-08 14:15:01

标签: vert.x vertx-eventbus

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

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

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

我的问题:使用Eventbus的最佳方法是什么?我是否缺少可以帮助我解决第二种缺点的东西?有没有我看不到的替代品?

谢谢

1 个答案:

答案 0 :(得分:0)

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

如您所提到的,

为了传递平凡的POJO,您需要一个编解码器,并且大多数编解码器区分本地调用与本地引用之间的区别,从而传递引用和通过网络转换进行调用。因此,您无需为此担心。一种不为您定义的每种类编写编解码器的简便方法是使用@DataObject并让代码生成来处理它。这样,您就可以发送和接收POJO,其余的将自动完成。至少直到一段时间之前,才使用序列化(请参见here)。

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

总结起来,没有使用 best 的方法来使用eventbus,这完全取决于您要查找的内容。您可以为地址定义常量字符串,并使用它们,以便您不必在代码中寻找字符串,也可以使用服务代理来查找类型安全的变体。

相关问题