Design patterns Vert.x事件总线性能问题(设计问题)

Design patterns Vert.x事件总线性能问题(设计问题),design-patterns,amazon-dynamodb,spring-webflux,vert.x,vertx-eventbus,Design Patterns,Amazon Dynamodb,Spring Webflux,Vert.x,Vertx Eventbus,我仍然对vert.x越来越熟悉。来自SpringBoot和SpringWebFlux的背景,我想尝试一下我在SpringEco系统中使用的一些基本功能 所以我的想法是编写一个通过控制器公开的api,它将实际工作委托给服务。在vert.x world中实现这一点的唯一方法是利用事件总线。这里,我的KeyValueServiceVerticle的getKeyValues方法应该从发布服务器(keyValueRepository.findAllItems().items())获取键值列表,并通过事件总

我仍然对vert.x越来越熟悉。来自SpringBoot和SpringWebFlux的背景,我想尝试一下我在SpringEco系统中使用的一些基本功能

所以我的想法是编写一个通过控制器公开的api,它将实际工作委托给服务。在vert.x world中实现这一点的唯一方法是利用事件总线。这里,我的
KeyValueServiceVerticle
getKeyValues
方法应该从发布服务器(
keyValueRepository.findAllItems().items()
)获取键值列表,并通过事件总线将它们发送回原始事件发布服务器api。我确实得到了预期的结果(关键值列表),但不知何故,我对性能并不满意。我在SpringWebFlux和vert.x的等效代码中添加了一些负载,我的webflux实现总是表现得更好(RPS更高)。相关存储库:

我是不是在什么地方屏蔽了密码?有没有更好的vert.x方法来实现我想要实现的目标

相关代码:

公共类KeyValueController扩展了AbstractVerticle{

  @Override
  public void start() throws Exception {
    Router router = Router.router(vertx);
    router
      .route()
      .handler(BodyHandler.create());
    router.route()
      .handler(LoggerHandler.create(LoggerFormat.DEFAULT));
    router
      .route(HttpMethod.GET, "/keyValues")
      .handler(this::getKeyValues);

    vertx
      .createHttpServer()
      .requestHandler(router)
      .listen(6678);
  }

  private void getKeyValues(RoutingContext routingContext) {
    vertx
      .eventBus()
      .request(KeyValueServiceVerticle.GET_LIST_ADDRESS, new JsonObject(), messageAsyncResult ->
        routingContext.response()
          .putHeader("content-type", "application/json")
          .end((String) messageAsyncResult.result().body())
      );
  }
}

公共类KeyValueServiceVerticle扩展了AbstractVerticle{
公共静态最终字符串GET\u LIST\u ADDRESS=“GET\u LIST\u KEY\u VAL”;
private KeyValueRepository KeyValueRepository;
私人发电配置发电配置;
@凌驾
public void start()引发异常{
发电机配置=新的发电机配置();
keyValueRepository=新的keyValueRepository(“开发付款单键值”,dynamocConfiguration.getDynamoDBEnhancedClient());
var eventBus=vertx.eventBus();
事件总线
.consumer(KeyValueServiceVerticle.GET_列表_地址,this::getKeyValues);
}
私有void getKeyValues(消息tMessage){
Observable.fromPublisher(keyValueRepository.findAllItems().items())
托利斯先生()
.订阅(tList->{
JsonArray JsonArray=新JsonArray(tList);
tMessage.reply(jsonArray.encodeprettiliy());
});
}
}

您确定位于
Observable.fromPublisher(keyValueRepository.findAllItems().items())
的发布服务器是非阻塞发布服务器吗

Rxjava2的默认设置实际上是以阻塞方式处理事件。确保以非阻塞方式处理事件的一种方法是使用
.subscribeOn(RxHelper.scheduler(vertx))
操作符,或者通过使用以下操作将Rxjava2配置为默认使用vertx事件循环,而不是标准Rxjava2线程:

RxJavaPlugins.setComputationSchedulerHandler(s -> RxHelper.scheduler(vertx));
RxJavaPlugins.setIoSchedulerHandler(s -> RxHelper.blockingScheduler(vertx));
RxJavaPlugins.setNewThreadSchedulerHandler(s -> RxHelper.scheduler(vertx));
为了使这更容易,请尝试以下方法

.end((String) messageAsyncResult.result().body())
// to
.end(messageAsyncResult.result().body().encode())

什么是
keyValueRepository.findAllItems().items()
return?如果不看代码,我会觉得这会阻止eventloop,因为我假设该操作将阻止,直到从存储中返回所有项目。它返回一个发布者。既然这是一个发布者,我是否在任何地方阻止eventloop?同时,我也在寻求实现类似行为的最佳实践(控制器服务)通过事件总线。
.end((String) messageAsyncResult.result().body())
// to
.end(messageAsyncResult.result().body().encode())