Aks*_*hta 3 java spring asynchronous spring-mvc
我有一个应用程序,每当对端点进行 REST 调用时,我都需要在其中触发电子邮件。设计是每当调用 REST 调用时,我将数据保存在数据库中,发出一个异步事件并返回。
我的问题是,由于大量请求不断涌现,发出的异步事件在很长一段时间内都没有机会。有时,当服务器启动数周时,延迟会不断增加。
场景
由于有时调用侦听器很晚,因此调用 2 会延迟。
public class DataController {
@Inject
ApplicationEventPublisher eventPublisher;
@RequestMapping(value = "data", method = RequestMethod.POST)
@ResponseStatus(HttpStatus.NO_CONTENT)
public void addData(@RequestBody DataDTO data) {
dataService.addData(data);
eventPublisher.publishEvent(new DataRequest(new DataDTO());
}
}
public class DataRequest extends ApplicationEvent {
private DataDTO dataDTO;
public DataRequest(DataDTO dataDTO) {
super(dataDTO);
this.dataDTO = dataDTO;
}
}
@Component
public class DataListener {
@EventListener
@Async
private void dataListener(DataDTO dataDTO) {
// Send email
}
}
Run Code Online (Sandbox Code Playgroud)
由于它是一个 Async event ,JVM 给了 dataListener 很晚执行的机会。有时,较早触发的事件比之后触发的事件获得的机会晚。
所以2个基本问题
感谢你的帮助
Spring 异步事件受限于线程池的大小,一旦传入请求大于活动线程的大小,就会出现延迟。
您需要使用 RabbitMQ、Kafka 等消息队列。您的架构应该更改为执行以下操作;
使用这种架构,您可以在高负载时增加消费者,从而根据需要进行扩展。
| 归档时间: |
|
| 查看次数: |
2568 次 |
| 最近记录: |