Design patterns Vert.x事件总线性能问题(设计问题)
我仍然对vert.x越来越熟悉。来自SpringBoot和SpringWebFlux的背景,我想尝试一下我在SpringEco系统中使用的一些基本功能 所以我的想法是编写一个通过控制器公开的api,它将实际工作委托给服务。在vert.x world中实现这一点的唯一方法是利用事件总线。这里,我的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())获取键值列表,并通过事件总
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())