Java 限制Vert.x中队列和垂直通道的数量

Java 限制Vert.x中队列和垂直通道的数量,java,actor,vert.x,Java,Actor,Vert.x,我们现在正在重构用Vert.x编写的消息传递应用程序。应用程序处理来自用户的传入消息。最初,它的实现是为了让单个verticle实例侦听事件总线中的单个队列并处理所有传入消息 我们想做的是重构它,使它的工作方式有点类似于actor模型:我们为每个活动用户部署一个verticle实例,并使它侦听特定于用户的队列。通过这种方式,verticle实例可以维护特定于用户的状态,并且消息处理的并行化变得更加容易 然而,问题是,这将导致在eventbus中部署大量垂直站点(30k-50k并行)和大量队列。此

我们现在正在重构用Vert.x编写的消息传递应用程序。应用程序处理来自用户的传入消息。最初,它的实现是为了让单个verticle实例侦听事件总线中的单个队列并处理所有传入消息

我们想做的是重构它,使它的工作方式有点类似于actor模型:我们为每个活动用户部署一个verticle实例,并使它侦听特定于用户的队列。通过这种方式,verticle实例可以维护特定于用户的状态,并且消息处理的并行化变得更加容易

然而,问题是,这将导致在eventbus中部署大量垂直站点(30k-50k并行)和大量队列。此外,我们还需要手动维护垂直链接(取消部署未使用的垂直链接,并在新用户发出消息时部署这些垂直链接)


问题是-这种演员风格的体系结构适合vert.x吗?它能同时处理大量部署的Verticle和eventbus队列吗?

这里需要做一个主要的更正-eventbus是一个队列。因此,您不会有“大量队列”。只有一个。在一个队列中会有大量地址

但是这个数字有这么大吗?那么,一个50K元素的HashMap可以被认为是巨大的吗?可能不会,至少在钥匙方面。现在请注意,这仅适用于非集群模式下的Vert.x。集群Vert.x是不同的(尽管仍然可以工作)

现在,拥有这些竖直是另一回事。每个垂直体都是一个单独的对象,如果您计划在其中存储一些数据,它将更大。但是,如果你能买得起带有一些像样RAM(16GB+)的机器,它应该可以正常工作


不过,在这个解决方案中,让我担心的是,您计划按需部署Verticle,然后取消部署它们。它确实会导致延迟,因此用户在发送第一条消息时会遇到性能下降的问题。

这里需要做一个主要的更正-EventBus是一个单一队列。因此,您不会有“大量队列”。只有一个。在一个队列中会有大量地址

但是这个数字有这么大吗?那么,一个50K元素的HashMap可以被认为是巨大的吗?可能不会,至少在钥匙方面。现在请注意,这仅适用于非集群模式下的Vert.x。集群Vert.x是不同的(尽管仍然可以工作)

现在,拥有这些竖直是另一回事。每个垂直体都是一个单独的对象,如果您计划在其中存储一些数据,它将更大。但是,如果你能买得起带有一些像样RAM(16GB+)的机器,它应该可以正常工作

不过,在这个解决方案中,让我担心的是,您计划按需部署Verticle,然后取消部署它们。它确实会导致延迟,因此用户发送的第一条消息的性能会下降。

您所谓的“演员风格”并不意味着必须为每个用户膨胀一个新的verticle实例。如果你这样做,你将得到一个98%冗余的系统

为每个用户注册一个事件总线地址并使用某种持久性存储来跟踪它们就足够了。这种存储可以是用于长期持久性的任何DB,也可以是用于短期的集群范围的共享dmap,或者两者的组合

也许您甚至不需要每个用户的地址方案。当用户通过某种类型的
EventBusBridge
不断连接到您的系统时,这样的方案很好。如果不是这种情况,您可以为所有用户注册单个事件总线地址,并根据负载处理消息。

您所谓的“参与者风格”并不意味着您必须为每个用户膨胀一个新的verticle实例。如果你这样做,你将得到一个98%冗余的系统

为每个用户注册一个事件总线地址并使用某种持久性存储来跟踪它们就足够了。这种存储可以是用于长期持久性的任何DB,也可以是用于短期的集群范围的共享dmap,或者两者的组合

也许您甚至不需要每个用户的地址方案。当用户通过某种类型的
EventBusBridge
不断连接到您的系统时,这样的方案很好。如果不是这种情况,则可以为所有用户注册单个事件总线地址,并基于负载处理消息