我正在阅读 RESTful Web 服务 (OReilly)。作者提到无状态(Application state 与 Resource state 相反)是 ROA 的主要特征之一。
在本书的后面,当他以账户转移为例来解释事务时,他提到了将事务公开为资源的选项,这比重载的 POST 更加 RESTful。
将交易公开为资源:从书中总结:
将 50 美元从 Checking ($200) 转移到 Savings ($200) 最终结果:Checking ($250) 和 Savings ($150)
支票账户资源暴露于/accounts/checking/11
,储蓄账户资源暴露于/accounts/savings/55
POST /transactions/account-transfer HTTP/1.1
Host: example.com
返回
201 Created
Location: /transactions/account-transfer/11a5
在支票上投入 150 美元
PUT /transactions/account-transfer/11a5/accounts/checking/11 HTTP/1.1
Host example.com
balance=150
并节省 250 美元
PUT /transactions/account-transfer/11a5/accounts/savings/55 HTTP/1.1
Host: example.com
balance=250
最后把committed=true
PUT /transactions/account-transfer/11a5/1.1
Host: example.com
committed=true
他说,这可以通过建立与交易相关的动作队列来实现。从书中:
提交事务时,服务器可能会启动数据库事务,应用排队的操作,然后尝试提交数据库事务。
我的问题是:
维护服务器上的操作队列不是有状态的(应用程序状态)吗?因此违反了无国籍状态?
在 Kai Mattern 的回答之后进行编辑
我认为您所说的是这个动作队列是资源状态而不是应用程序状态。这本书也做出了这种区分,并说资源状态是好的,但不是应用程序状态。
但是,当您考虑到可以在负载平衡的服务器上分发无状态应用程序这一事实时,上述一系列 POST 和 PUT 不会让您这样做。负载均衡器应将所有请求发送到 1 个特定服务器,因为在该 1 个服务器上维护一个操作队列。否则,如果将上述资源拆分为驻留在多台机器上(以启用负载平衡),则可能需要类似 RESTful 两阶段提交事务的东西。
因此,对于这个特定的示例,我们正在查看 2 个选项 Overloaded POST Stateless App Vs 2 phase commit Stateless App。
是这样吗?