当前位置: 首页 > 知识库问答 >
问题:

如何处理长时间运行不稳定的服务器

刘凡
2023-03-14

我们有一个不稳定的旧单块系统,95%的请求在500毫秒内处理,但其他5%需要

我们当前的方法是使用具有指数回退重试机制的异步http客户端。但随着流量的增加,这将导致性能问题

我的想法是在S中有一个超时500毫秒的同步超文本传输协议调用和一个回退方法,该方法将一个任务添加到队列中,以便将来重试超文本传输协议请求,同时将202返回给C,并返回一个链接来检查任务的状态,类似于/队列/任务-123。我知道我需要将S公开的服务设为C幂等,所以每次收到来自C的新请求时,我都必须检查队列,以确保我没有重复的任务。

问题:

  1. 有更好的方法来解决我的问题吗
  2. 队列中的任务是处理RESTendpoint中重试的最佳方式吗

我们的堆栈:Java使用Spring boot,对于队列,我认为是RabbitMQ

共有1个答案

云凌
2023-03-14

让S的请求为AsyncHttpResponse创建Futures,并将它们发送到一个执行器,该执行器有一个足够大的线程池来容纳您的负载,但不要太高以至于淹没您的Monolith。这样,当事情开始失败时,它就不会滚雪球般地压在你身上,其他请求可以排队。在这个模型中,您仍然可以有一个重试模型,但在未来之外对其进行控制,以便在重试之前允许成功的请求进来。

 类似资料:
  • 我正在应用程序上启动一个spring批处理作业,开始使用 spring.batch.job.names工作 不幸的是,这以某种方式延迟了tomcat服务器的启动。作业的运行时间为几分钟,因此我得到以下错误: localhost上的Tomcat v8.0服务器无法在45秒内启动。如果服务器需要更多时间,请尝试在服务器编辑器中增加超时。 问题:如何在不阻止tomcat启动的情况下运行此作业?例如异步运

  • 我正在尝试将一个向服务器发送消息的异步任务迁移到RxJava。该任务大致执行以下操作: 1) 创建将要发送的消息(保存到数据库) 2)向用户显示消息(状态为“发送”) 3)将消息发送到服务器(下面的代码段) 4)将消息标记为已发送或失败(保存到数据库) 5)更新UI 我创建了所需的Rx链,部分如下所示: 当我订阅上述内容时,我会得到一个一次性的。通常,我会将其添加到CompositeDisposa

  • Android系统如何处理长时间运行的后台任务?开发人员能否依赖系统保持活动的未绑定服务?

  • 我刚刚开始研究龙卷风和异步Web服务器。在许多龙卷风的例子中,较长的请求由以下内容处理: 致电tornado Web服务器 tornado对api进行异步web调用 让tornado在回调等待调用时继续接收请求 在回调中处理响应。服务器对用户 因此,假设用户在向tornado服务器发出请求将向内部api或w/e。获取请求时,api请求可能需要一秒钟的时间才能运行,然后当它最终返回tornado服务

  • 我正在使用spring-kafka“2.2.7.RELEASE”来创建一个批处理消费者,并且我正在尝试了解当我的记录处理时间超过 max.poll.interval.ms 时消费者重新平衡是如何工作的。 这是我的配置。 这是我的出厂设置。 我添加了自定义消费者监听器,如下所示。 现在我期望消费者群体能够重新平衡,因为处理时间超过 max.poll.interval.ms 但我没有看到任何这样的行为

  • 我有一个Spring Boot应用程序,我想实现的是,当我的Rest控制器需要更长的时间来处理请求时,只需发送错误而不继续处理请求。这可能吗?我如何以某种方式实现它,而无需在控制器级别进行修改,而是在应用程序级别进行修改。这是在最新的Spring启动