Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/rest/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java REST服务前面的请求队列_Java_Rest_Soa - Fatal编程技术网

Java REST服务前面的请求队列

Java REST服务前面的请求队列,java,rest,soa,Java,Rest,Soa,在REST服务前面有一个请求队列的最佳技术解决方案(框架/方法)是什么。 因此,我可以增加REST服务实例的数量以获得更高的可用性,并将请求队列放在前面,以形成服务客户端的服务/事务边界 我需要为请求队列(java)选择好的轻量级技术/框架 实现与it竞争的消费者的方法 这里有几个问题,取决于你的目标 首先,它只促进后端资源的可用性。考虑是否有5个服务器在后端处理队列请求。如果其中一台服务器宕机,则排队的请求应返回到队列中,并重新传递到其余4台服务器中的一台 但是,当这些后端服务器正在处理时,前

在REST服务前面有一个请求队列的最佳技术解决方案(框架/方法)是什么。 因此,我可以增加REST服务实例的数量以获得更高的可用性,并将请求队列放在前面,以形成服务客户端的服务/事务边界

  • 我需要为请求队列(java)选择好的轻量级技术/框架
  • 实现与it竞争的消费者的方法

  • 这里有几个问题,取决于你的目标

    首先,它只促进后端资源的可用性。考虑是否有5个服务器在后端处理队列请求。如果其中一台服务器宕机,则排队的请求应返回到队列中,并重新传递到其余4台服务器中的一台

    但是,当这些后端服务器正在处理时,前端服务器将保留实际的、启动的请求。如果其中一个前端服务器出现故障,那么这些连接将完全丢失,由原始客户端重新提交请求

    前提可能是,较简单的前端系统的故障风险较低,对于软件相关的故障,这一点肯定是正确的。但网卡、电源、硬盘等对人类的这种虚假希望是相当不可知的,它们将平等地惩罚所有人。因此,在讨论总体可用性时考虑这个问题。 至于设计,后端是一个简单的过程,等待JMS消息队列,并在消息到达时处理它们。这方面的例子有很多,任何JMS服务器都可以在较高的级别上使用。您所需要的只是确保消息处理是事务性的,这样,如果消息处理失败,消息将保留在队列中,并可以重新传递给另一个消息处理程序

    JMS队列的主要需求是集群化。JMS服务器本身是系统中的单点故障。失去了JMS服务器,您的系统几乎陷入了困境,因此您需要能够对服务器进行集群,并让使用者和生产者适当地处理故障转移。同样,这是特定于JMS服务器的,大多数人都这样做,但在JMS世界中,这是非常常规的

    前端是事情变得有点棘手的地方,因为前端服务器是从REST请求的同步世界到后端处理器的异步世界的桥梁。REST请求遵循一种典型的RPC模式,即使用来自套接字的请求负载,保持连接打开,处理结果,并将结果返回到原始套接字

    为了实现这种移交,您应该看看异步Servlet,它处理引入的Servlet3.0,并且在Tomcat7、最新的Jetty(不确定是什么版本)、Glassfish 3.x和其他版本中都有

    在本例中,您将在请求到达时使用
    HttpServletRequest.startAsync(HttpServletRequest-request,HttpServletResponse-response)
    将名义上的同步Servlet调用转换为异步调用

    这将返回AsynchronousContext,一旦启动,允许服务器释放处理线程。然后你会做几件事

  • 从请求中提取参数
  • 为请求创建唯一的ID
  • 根据参数创建新的后端请求有效负载
  • 将ID与AsyncContext关联,并保留上下文(例如将其放入应用程序范围的映射中)
  • 将后端请求提交到JMS队列
  • 此时,初始处理完成,您只需从doGet(或服务,或其他)返回即可。由于尚未调用AsyncContext.complete(),服务器将不会关闭与服务器的连接。由于您在映射中按ID保存了AsyncContext存储,因此暂时可以方便地进行安全保存

    现在,当您将请求提交到JMS队列时,它包含:请求的ID(您生成的)、请求的任何参数以及发出请求的实际服务器的标识。最后一位很重要,因为处理结果需要返回原点。来源由请求ID和服务器ID标识

    当前端服务器启动时,它还启动了一个线程,该线程的任务是侦听JMS响应队列。当它设置JMS连接时,它可以设置一个过滤器,比如“只给我ABC123服务器ID的消息”。或者,您可以为每个前端服务器创建一个唯一的队列,后端服务器使用服务器ID来确定要返回回复的队列

    当后端处理器使用消息时,它们将获取请求ID和参数,执行工作,然后获取结果并将其放入JMS响应队列。当它返回结果时,它将添加原始ServerID和原始请求ID作为消息的属性

    因此,如果您最初收到前端服务器ABC123的请求,后端处理器将把结果发送回该服务器。然后,侦听器线程将在收到消息时收到通知。侦听器线程任务是获取该消息并将其放到前端服务器内的内部队列中

    该内部队列由线程池支持,线程池的任务是将请求有效负载发送回原始连接。它通过从消息中提取原始请求ID,从前面讨论的内部映射中查找AsyncContext,然后将结果向下发送到与AsyncContext关联的HttpServletResponse来实现。最后,它调用AsyncContext.complete()(或类似的方法)告诉服务器您已经完成并允许它释放连接

    对于内务管理,您应该在前端服务器上有另一个线程,它是jo