在 Spring Boot 中使用 Disruptor
Using Disruptor with Spring Boot
我的 Spring 引导应用程序中有以下 Reactor 配置:
@Configuration
public class AsyncConfig {
@Bean
public EventBus eventBus(){
return EventBus.create(getDispatcher("rb-relay"));
}
public MultiThreadDispatcher getDispatcher(String name){
return new WorkQueueDispatcher(name, 4, 1024, null);
}
}
基本上我正在做的是:每当请求到达我的端点时,我将它转发到我的应用程序中注册的其他端点。为此,我将每个传入请求发送到总线:
@Service
public class URLRelayPublisher {
@Autowired
EventBus bus;
@Autowired
DestinationURLRepository repository;
public void relay(HttpServletRequest request){
repository.findAll()
.forEach(destinationURL -> bus.notify("relay", Event.wrap(new RelayEvent(destinationURL, request))));
}
}
和我的消费者
@Component
@Log
public class URLRelayReceiver implements Consumer<Event<RelayEvent>> {
@Autowired
RestTemplate template;
@Override
public void accept(Event<RelayEvent> relayEvent) {
try{
HttpServletRequest request = relayEvent.getData().getRequest();
DestinationURL destinationURL = relayEvent.getData().getDestinationURL();
log.info("Relaying for "+destinationURL.getUrl());
Map<String, String> headers = buildHeader(request);
template.postForLocation(destinationURL.getUrl(), headers, request.getParameterMap());
}catch (RestClientException e){
log.info("Could not relay event: "+e.getMessage());
}
}
Disruptor 声称处理大约 6-8 Mi TPS,尽管当我 siege
应用程序 (siege -d 2 -c 50 -t30S -H 'Content-Type: application/json' -H 'Auth-Token: qyz3kHZFuXRw8nm14uYLjLNoQ' 'http://127.0.0.1:8080/callback POST {"content": "message"}'
) 我得到大约 96 TPS。我的问题是:1)上面的配置是否足以使用 Disruptor? 2) 如何确保我在这里使用的是 Disruptor?
disruptor 可以 "process" 6-8 Mi TPS,但这意味着它可以在线程之间交换 6-8 Mi 事件。它没有对 spring-boot 应用程序的吞吐量做出任何声明。
因此在您的示例中,它在各种 Consumers
之间传递 RelayEvent
。鉴于在 spring-boot 应用程序的上下文中进行的所有其他工作将主导应用程序的性能而不是破坏者。
我的 Spring 引导应用程序中有以下 Reactor 配置:
@Configuration
public class AsyncConfig {
@Bean
public EventBus eventBus(){
return EventBus.create(getDispatcher("rb-relay"));
}
public MultiThreadDispatcher getDispatcher(String name){
return new WorkQueueDispatcher(name, 4, 1024, null);
}
}
基本上我正在做的是:每当请求到达我的端点时,我将它转发到我的应用程序中注册的其他端点。为此,我将每个传入请求发送到总线:
@Service
public class URLRelayPublisher {
@Autowired
EventBus bus;
@Autowired
DestinationURLRepository repository;
public void relay(HttpServletRequest request){
repository.findAll()
.forEach(destinationURL -> bus.notify("relay", Event.wrap(new RelayEvent(destinationURL, request))));
}
}
和我的消费者
@Component
@Log
public class URLRelayReceiver implements Consumer<Event<RelayEvent>> {
@Autowired
RestTemplate template;
@Override
public void accept(Event<RelayEvent> relayEvent) {
try{
HttpServletRequest request = relayEvent.getData().getRequest();
DestinationURL destinationURL = relayEvent.getData().getDestinationURL();
log.info("Relaying for "+destinationURL.getUrl());
Map<String, String> headers = buildHeader(request);
template.postForLocation(destinationURL.getUrl(), headers, request.getParameterMap());
}catch (RestClientException e){
log.info("Could not relay event: "+e.getMessage());
}
}
Disruptor 声称处理大约 6-8 Mi TPS,尽管当我 siege
应用程序 (siege -d 2 -c 50 -t30S -H 'Content-Type: application/json' -H 'Auth-Token: qyz3kHZFuXRw8nm14uYLjLNoQ' 'http://127.0.0.1:8080/callback POST {"content": "message"}'
) 我得到大约 96 TPS。我的问题是:1)上面的配置是否足以使用 Disruptor? 2) 如何确保我在这里使用的是 Disruptor?
disruptor 可以 "process" 6-8 Mi TPS,但这意味着它可以在线程之间交换 6-8 Mi 事件。它没有对 spring-boot 应用程序的吞吐量做出任何声明。
因此在您的示例中,它在各种 Consumers
之间传递 RelayEvent
。鉴于在 spring-boot 应用程序的上下文中进行的所有其他工作将主导应用程序的性能而不是破坏者。