Spring 启动时的票务预订(有状态)Web 服务

Tickets booking (stateful) web service on Spring boot

我需要一些有状态的 web 服务(比如说 5 个步骤中的票务预订 1) select ...5) 支付)并且想使用 Spring(引导)框架

谷歌搜索

spring web service

可以找到大量 RESTful Web 服务示例...但是根据 REST 清单和许多 articles/answers(即 Sticky Session for Rest API Calls

REST client is made to call REST API and REST APIs should be stateless

Statefulness harms scalability

由于出色的嵌入式和自动配置库,在 spring 启动时创建 RESTful Web 服务非常容易,我不想拒绝它。

所以我看到了一些克服这个问题的方法:

  1. 在 Spring 中创建 RESTful 网络服务启动并添加到那里的会话并在其上存储状态,并添加粘性会话负载平衡器以保持可伸缩性(它比无状态方法更难但可行) .是的,它不会是 true RESTful 服务,但它会工作
  2. 创建true无状态RESTful服务,保持状态

temporary 'temp_transaction' database table which your code can consult to determine if a user is in the process of booking, say, a particular seat.

  1. 状态在客户端维护,而不是在服务器上维护。所以我建议的方法之一是您可以使用 cookie 来存储您的状态和临时数据
  2. 使用一些富客户端框架,如 angular 或做出反应(我不擅长它,但相信有可能在这些框架中保持状态存在)尽管我认为无论如何 cookie 用于这些目的所以它是几乎与 3)
  3. 相同
  4. 使用Spring + SOAP。 Soap 可以保持状态,但我认为这种方式已经过时,现代新创建的应用程序不应使用 SOAP
  5. 不要为这个项目使用 spring 框架,而是使用前端框架(在 4 中提到)+ Node.js(无论如何它将是有状态的)

那么选择哪种方法更好?

因为你的 REST 服务

  1. 可能会崩溃然后重新启动
  2. 您想扩展并拥有多个服务实例

您应该将状态保存在数据库或分布式缓存中,例如 Redis。

您必须在每个请求中传递 session 密钥或预订编号。例如在 header.